From 40b178b670bd015a534bcfe2611aa6487f1a139e Mon Sep 17 00:00:00 2001 From: andrea rota Date: Wed, 15 Nov 2023 16:04:38 +0000 Subject: [PATCH] add test for concurrent tag updates --- .../geo-features/geo-feature-tags.e2e-spec.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/api/apps/api/test/geo-features/geo-feature-tags.e2e-spec.ts b/api/apps/api/test/geo-features/geo-feature-tags.e2e-spec.ts index 37c02251ae..ce464b8856 100644 --- a/api/apps/api/test/geo-features/geo-feature-tags.e2e-spec.ts +++ b/api/apps/api/test/geo-features/geo-feature-tags.e2e-spec.ts @@ -302,4 +302,49 @@ describe('GeoFeatureTag PATCH (e2e)', () => { expect(response.status).toBe(HttpStatus.OK); await fixtures.ThenFeatureHasTag(projectId, featureId, equivalentTag); }); + + /** + * @see MRXN23-316 + */ + test('updating feature tags in a large batch of concurrent-ish operations should complete without errors', async () => { + // ARRANGE + const projectId = await fixtures.GivenProject('someProject'); + // create an array of 100 features + const features = await Promise.all( + Array.from({ length: 100 }, (_item, index) => index).map((featureId) => + fixtures.GivenFeatureOnProject(projectId, `feature${featureId}`), + ), + ); + await Promise.all( + features.map((feature) => + fixtures.GivenTagOnFeature(projectId, feature, 'oldTag'), + ), + ); + const newTag = 'newTag'; + + // ACT + const responses = await Promise.all( + features.map((feature) => + fixtures.WhenPatchingAGeoFeatureTag(projectId, feature, newTag), + ), + ); + + // ASSERT + responses.forEach((response) => + expect(response.status).toBe(HttpStatus.OK), + ); + responses.forEach((response) => + expect(response.body.data.type).toBe('geo_features'), + ); + responses.forEach((response) => + expect(response.body.data.attributes.featureClassName).toBe( + 'someFeature', + ), + ); + await Promise.all( + features.map((feature) => + fixtures.ThenFeatureHasTag(projectId, feature, newTag), + ), + ); + }); });