UNPKG

unleash-server

Version:

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

180 lines • 6.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const database_init_1 = __importDefault(require("../../../test/e2e/helpers/database-init")); const no_logger_1 = __importDefault(require("../../../test/fixtures/no-logger")); const createChangeRequestSegmentUsageReadModel_1 = require("./createChangeRequestSegmentUsageReadModel"); const util_1 = require("../../../lib/util"); let db; let user; 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 (0, database_init_1.default)('change_request_segment_usage_read_model', no_logger_1.default); user = await db.stores.userStore.insert({ username: 'cr-creator', }); readModel = (0, createChangeRequestSegmentUsageReadModel_1.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) => { await db.rawDatabase.table('change_requests').insert({ id: changeRequestId, environment: 'default', state, project: 'default', created_by: user.id, 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', 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 = (0, util_1.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', 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); const segmentId = 3; const strategyId = (0, util_1.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', featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }); expect(result).toContainEqual({ id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', environment: 'default', featureName: FLAG_NAME, changeRequest: { id: CR_ID_2, title: null }, }); }); //# sourceMappingURL=change-request-segment-usage-read-model.test.js.map