UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

179 lines • 6.04 kB
import dbInit from '../../../test/e2e/helpers/database-init.js'; import getLogger from '../../../test/fixtures/no-logger.js'; import { createChangeRequestSegmentUsageReadModel } from './createChangeRequestSegmentUsageReadModel.js'; import { DEFAULT_ENV, randomId } from '../../util/index.js'; let db; let user; let user2; const CR_ID = 123456; const CR_ID_2 = 234567; const CR_TITLE = 'My change request'; const FLAG_NAME = 'crarm-test-flag'; let readModel; beforeAll(async () => { db = await dbInit('change_request_segment_usage_read_model', getLogger); user = await db.stores.userStore.insert({ username: 'cr-creator', }); user2 = await db.stores.userStore.insert({ username: 'cr-creator-2', }); readModel = createChangeRequestSegmentUsageReadModel(db.rawDatabase); await db.stores.featureToggleStore.create('default', { name: FLAG_NAME, createdByUserId: 9999, }); }); afterAll(async () => { await db.destroy(); }); afterEach(async () => { await db.rawDatabase .table('change_requests') .where('id', CR_ID) .orWhere('id', CR_ID_2) .delete(); await db.rawDatabase .table('change_request_events') .where('change_request_id', CR_ID) .orWhere('change_request_id', CR_ID_2) .delete(); }); const createCR = async (state, changeRequestId = CR_ID, changeRequestTitle = CR_TITLE, userId = user.id) => { await db.rawDatabase.table('change_requests').insert({ id: changeRequestId, environment: DEFAULT_ENV, state, project: 'default', created_by: userId, created_at: '2023-01-01 00:00:00', min_approvals: 1, title: changeRequestTitle, }); }; const addChangeRequestChange = async (flagName, action, change, changeRequestId) => { await db.rawDatabase.table('change_request_events').insert({ feature: flagName, action, payload: change, created_at: '2023-01-01 00:01:00', change_request_id: changeRequestId, created_by: user.id, }); }; const addStrategyToCr = async (segmentId, flagName, changeRequestId = CR_ID) => { await addChangeRequestChange(flagName, 'addStrategy', { name: 'flexibleRollout', title: '', disabled: false, segments: [segmentId], variants: [], parameters: { groupId: flagName, rollout: '100', stickiness: 'default', }, constraints: [], }, changeRequestId); }; const updateStrategyInCr = async (strategyId, segmentId, flagName, changeRequestId = CR_ID) => { await addChangeRequestChange(flagName, 'updateStrategy', { id: strategyId, name: 'flexibleRollout', title: '', disabled: false, segments: [segmentId], variants: [], parameters: { groupId: flagName, rollout: '100', stickiness: 'default', }, constraints: [], }, changeRequestId); }; test.each([ ['Draft', true], ['In review', true], ['Scheduled', true], ['Approved', true], ['Rejected', false], ['Cancelled', false], ['Applied', false], ])('addStrategy events in %s CRs should show up only if the CR is active', async (state, isActiveCr) => { await createCR(state); const segmentId = 3; await addStrategyToCr(segmentId, FLAG_NAME); const result = await readModel.getStrategiesUsedInActiveChangeRequests(segmentId); if (isActiveCr) { expect(result).toStrictEqual([ { projectId: 'default', strategyName: 'flexibleRollout', environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }, ]); } else { expect(result).toStrictEqual([]); } }); test.each([ ['Draft', true], ['In review', true], ['Scheduled', true], ['Approved', true], ['Rejected', false], ['Cancelled', false], ['Applied', false], ])(`updateStrategy events in %s CRs should show up only if the CR is active`, async (state, isActiveCr) => { await createCR(state); const segmentId = 3; const strategyId = randomId(); await updateStrategyInCr(strategyId, segmentId, FLAG_NAME); const result = await readModel.getStrategiesUsedInActiveChangeRequests(segmentId); if (isActiveCr) { expect(result).toMatchObject([ { id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }, ]); } else { expect(result).toStrictEqual([]); } }); test(`If the same strategy appears in multiple CRs with the same segment, each segment should be listed as its own entry`, async () => { await createCR('In review', CR_ID, CR_TITLE); await createCR('In review', CR_ID_2, null, user2.id); const segmentId = 3; const strategyId = randomId(); await updateStrategyInCr(strategyId, segmentId, FLAG_NAME, CR_ID); await updateStrategyInCr(strategyId, segmentId, FLAG_NAME, CR_ID_2); const result = await readModel.getStrategiesUsedInActiveChangeRequests(segmentId); expect(result).toHaveLength(2); expect(result).toContainEqual({ id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }); expect(result).toContainEqual({ id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID_2, title: null }, }); }); //# sourceMappingURL=change-request-segment-usage-read-model.test.js.map