From 1ce3e9120fab6d466430c70e0667bf48ad38c452 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Mon, 20 Nov 2023 12:44:04 +0100 Subject: [PATCH] feat: update tests --- src/test/e2e/api/admin/segment.e2e.test.ts | 263 +++++++++++++++++---- 1 file changed, 212 insertions(+), 51 deletions(-) diff --git a/src/test/e2e/api/admin/segment.e2e.test.ts b/src/test/e2e/api/admin/segment.e2e.test.ts index 90dccbfa0a..0576f079fa 100644 --- a/src/test/e2e/api/admin/segment.e2e.test.ts +++ b/src/test/e2e/api/admin/segment.e2e.test.ts @@ -234,57 +234,6 @@ test('should not delete segments used by strategies', async () => { expect((await fetchSegments()).length).toEqual(1); }); -test('should not delete segments used by strategies in CRs', async () => { - await createSegment({ name: 'a', constraints: [] }); - const toggle = mockFeatureToggle(); - await createFeatureToggle(app, toggle); - const [segment] = await fetchSegments(); - - const CR_ID = 54321; - - const user = await db.stores.userStore.insert({ - username: 'test', - }); - - await db.rawDatabase.table('change_requests').insert({ - id: CR_ID, - environment: 'default', - state: 'In Review', - project: 'default', - created_by: user.id, - created_at: '2023-01-01 00:00:00', - min_approvals: 1, - title: 'My change request', - }); - - await db.rawDatabase.table('change_request_events').insert({ - feature: toggle.name, - action: 'addStrategy', - payload: { - name: 'flexibleRollout', - title: '', - disabled: false, - segments: [segment.id], - variants: [], - parameters: { - groupId: toggle.name, - rollout: '100', - stickiness: 'default', - }, - constraints: [], - }, - created_at: '2023-01-01 00:01:00', - change_request_id: CR_ID, - created_by: user.id, - }); - - expect((await fetchSegments()).length).toEqual(1); - - await app.request.delete(`${SEGMENTS_BASE_PATH}/${segment.id}`).expect(409); - - expect((await fetchSegments()).length).toEqual(1); -}); - test('should list strategies by segment', async () => { await createSegment({ name: 'S1', constraints: [] }); await createSegment({ name: 'S2', constraints: [] }); @@ -477,3 +426,215 @@ test('Should show usage in features and projects', async () => { const segments = await fetchSegments(); expect(segments).toMatchObject([{ usedInFeatures: 1, usedInProjects: 1 }]); }); + +describe('detect strategy usage in change requests', () => { + const CR_ID = 54321; + let user; + + beforeAll(async () => { + user = await db.stores.userStore.insert({ + username: 'test', + }); + }); + afterAll(async () => { + user = await db.stores.userStore.delete(user.id); + }); + + beforeEach(async () => { + await db.rawDatabase.table('change_requests').insert({ + id: CR_ID, + environment: 'default', + state: 'In Review', + project: 'default', + created_by: user.id, + created_at: '2023-01-01 00:00:00', + min_approvals: 1, + title: 'My change request', + }); + }); + + afterEach(async () => { + await db.rawDatabase.table('change_requests').delete(); + }); + + test('should not delete segments used by strategies in CRs', async () => { + await createSegment({ name: 'a', constraints: [] }); + const toggle = mockFeatureToggle(); + await createFeatureToggle(app, toggle); + const [segment] = await fetchSegments(); + + await db.rawDatabase.table('change_request_events').insert({ + feature: toggle.name, + action: 'addStrategy', + payload: { + name: 'flexibleRollout', + title: '', + disabled: false, + segments: [segment.id], + variants: [], + parameters: { + groupId: toggle.name, + rollout: '100', + stickiness: 'default', + }, + constraints: [], + }, + created_at: '2023-01-01 00:01:00', + change_request_id: CR_ID, + created_by: user.id, + }); + + expect((await fetchSegments()).length).toEqual(1); + + await app.request + .delete(`${SEGMENTS_BASE_PATH}/${segment.id}`) + .expect(409); + + expect((await fetchSegments()).length).toEqual(1); + }); + + test('Should show segment usage in addStrategy events', async () => { + await createSegment({ name: 'a', constraints: [] }); + const toggle = mockFeatureToggle(); + await createFeatureToggle(app, toggle); + const [segment] = await fetchSegments(); + + // create change request + + await db.rawDatabase.table('change_request_events').insert({ + feature: toggle.name, + action: 'updateStrategy', + payload: { + name: 'flexibleRollout', + title: '', + disabled: false, + segments: [segment.id], + variants: [], + parameters: { + groupId: toggle.name, + rollout: '100', + stickiness: 'default', + }, + constraints: [], + }, + created_at: '2023-01-01 00:01:00', + change_request_id: CR_ID, + created_by: user.id, + }); + + // for addStrategy, add strategy to feature with segment + // check that getStrategies for segments contains the CR strategies + + const segmentStrategies = await fetchSegmentStrategies(segment.id); + + expect(segmentStrategies).not.toHaveLength(0); + }); + + test('Should show segment usage in updateStrategy events', async () => { + await createSegment({ name: 'a', constraints: [] }); + const toggle = mockFeatureToggle(); + await createFeatureToggle(app, toggle); + const [segment] = await fetchSegments(); + + await addStrategyToFeatureEnv( + app, + { ...toggle.strategies[0] }, + 'default', + toggle.name, + ); + + await addStrategyToFeatureEnv( + app, + { ...toggle.strategies[0] }, + 'default', + toggle.name, + ); + + const [{ strategies }] = await fetchFeatures(); + + const strategyId = strategies[0].id; + + await db.rawDatabase.table('change_request_events').insert({ + feature: toggle.name, + action: 'addStrategy', + payload: { + id: strategyId, + name: 'flexibleRollout', + title: '', + disabled: false, + segments: [segment.id], + variants: [], + parameters: { + groupId: toggle.name, + rollout: '100', + stickiness: 'default', + }, + constraints: [], + }, + created_at: '2023-01-01 00:01:00', + change_request_id: CR_ID, + created_by: user.id, + }); + + // for updateStrategy, add existing strategy, then add segment in CR + // check that getStrategies for segments contains the CR strategies + + const segmentStrategies = await fetchSegmentStrategies(segment.id); + + expect(segmentStrategies).not.toHaveLength(0); + }); + + test('If a segment is used in an existing strategy and in a CR for the same strategy, the strategy should only be listed once', async () => { + await createSegment({ name: 'a', constraints: [] }); + const toggle = mockFeatureToggle(); + await createFeatureToggle(app, toggle); + const [segment] = await fetchSegments(); + + await addStrategyToFeatureEnv( + app, + { ...toggle.strategies[0] }, + 'default', + toggle.name, + ); + + await addStrategyToFeatureEnv( + app, + { ...toggle.strategies[0] }, + 'default', + toggle.name, + ); + + const [{ strategies }] = await fetchFeatures(); + + const strategyId = strategies[0].id; + + await db.rawDatabase.table('change_request_events').insert({ + feature: toggle.name, + action: 'addStrategy', + payload: { + id: strategyId, + name: 'flexibleRollout', + title: '', + disabled: false, + segments: [segment.id], + variants: [], + parameters: { + groupId: toggle.name, + rollout: '100', + stickiness: 'default', + }, + constraints: [], + }, + created_at: '2023-01-01 00:01:00', + change_request_id: CR_ID, + created_by: user.id, + }); + + // for updateStrategy, add existing strategy, then add segment in CR + // check that getStrategies for segments contains the CR strategies + + const segmentStrategies = await fetchSegmentStrategies(segment.id); + + expect(segmentStrategies).not.toHaveLength(0); + }); +});