UNPKG

unleash-server

Version:

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

218 lines • 10.2 kB
import { createEventsService, createFeatureToggleService, } from '../../lib/features/index.js'; import { FEATURES_CREATED_BY_PROCESSED } from '../../lib/metric-events.js'; import { ADMIN_TOKEN_USER, } from '../../lib/types/index.js'; import { createTestConfig } from '../config/test-config.js'; import dbInit from './helpers/database-init.js'; import { DEFAULT_ENV } from '../../lib/server-impl.js'; let stores; let db; let service; let eventBus; let _eventService; let _unleashConfig; beforeAll(async () => { const config = createTestConfig(); eventBus = config.eventBus; db = await dbInit('features_created_by_user_id_migration', config.getLogger); _unleashConfig = config; stores = db.stores; service = createFeatureToggleService(db.rawDatabase, config); _eventService = createEventsService(db.rawDatabase, config); }); afterAll(async () => { await db.rawDatabase('features').del(); await db.rawDatabase('events').del(); await db.rawDatabase('users').del(); await db.destroy(); }); beforeEach(async () => { await db.rawDatabase('features').del(); await db.rawDatabase('events').del(); await db.rawDatabase('users').del(); }); test('should set created_by_user_id on features', async () => { for (let i = 0; i < 100; i++) { await db.rawDatabase('features').insert({ name: `feature${i}`, type: 'release', project: 'default', description: '--created_by_test--', }); } await db.rawDatabase('users').insert({ username: 'test1', }); await db.rawDatabase('users').insert({ username: 'test2', }); await db.rawDatabase('users').insert({ username: 'test3', }); await db.rawDatabase('users').insert({ username: 'test4', }); for (let i = 0; i < 25; i++) { await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'test1', feature_name: `feature${i}`, data: `{"name":"feature${i}","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); } for (let i = 25; i < 50; i++) { await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'test2', feature_name: `feature${i}`, data: `{"name":"feature${i}","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); } for (let i = 50; i < 75; i++) { await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'test3', feature_name: `feature${i}`, data: `{"name":"feature${i}","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); } for (let i = 75; i < 100; i++) { await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'test4', feature_name: `feature${i}`, data: `{"name":"feature${i}","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); } await stores.featureToggleStore.setCreatedByUserId(200); const features = await db.rawDatabase('features').select('*'); const notSet = features.filter((f) => !f.created_by_user_id && f.description === '--created_by_test--'); const test1 = features.filter((f) => f.created_by_user_id === 1); const test2 = features.filter((f) => f.created_by_user_id === 2); const test3 = features.filter((f) => f.created_by_user_id === 3); const test4 = features.filter((f) => f.created_by_user_id === 4); expect(notSet).toHaveLength(0); expect(test1).toHaveLength(25); expect(test2).toHaveLength(25); expect(test3).toHaveLength(25); expect(test4).toHaveLength(25); }); test('admin tokens get populated to admin token user', async () => { for (let i = 0; i < 5; i++) { await db.rawDatabase('features').insert({ name: `feature${i}`, type: 'release', project: 'default', description: '--created_by_test--', }); } await db.rawDatabase('users').insert({ username: 'input1', }); await db.rawDatabase('api_tokens').insert({ secret: 'token1', username: 'adm-token', type: 'admin', environment: DEFAULT_ENV, token_name: 'admin-token', }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'input1', feature_name: 'feature0', data: `{"name":"feature0","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'input1', feature_name: 'feature1', data: `{"name":"feature1","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'adm-token', feature_name: 'feature2', data: `{"name":"feature2","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'deleted-user', feature_name: 'feature3', data: `{"name":"feature3","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'adm-token', feature_name: 'feature4', data: `{"name":"feature4","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await stores.featureToggleStore.setCreatedByUserId(200); const user = await db .rawDatabase('users') .where({ username: 'input1' }) .first('id'); const features = await db.rawDatabase('features').select('*'); const notSet = features.filter((f) => !f.created_by_user_id && f.description === '--created_by_test--'); const test1 = features.filter((f) => f.created_by_user_id === user.id); const test2 = features.filter((f) => f.created_by_user_id === ADMIN_TOKEN_USER.id); expect(notSet).toHaveLength(1); expect(test1).toHaveLength(2); expect(test2).toHaveLength(2); }); test('emits event with updated rows count', async () => { for (let i = 0; i < 5; i++) { await db.rawDatabase('features').insert({ name: `feature${i}`, type: 'release', project: 'default', description: '--created_by_test--', }); } await db.rawDatabase('users').insert({ username: 'input2', }); await db.rawDatabase('api_tokens').insert({ secret: 'token2', username: 'adm-token2', type: 'admin', environment: DEFAULT_ENV, token_name: 'admin-token2', }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'input2', feature_name: 'feature0', data: `{"name":"feature0","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'input2', feature_name: 'feature1', data: `{"name":"feature1","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'adm-token2', feature_name: 'feature2', data: `{"name":"feature2","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'deleted-user', feature_name: 'feature3', data: `{"name":"feature3","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); await db.rawDatabase('events').insert({ type: 'feature-created', created_by: 'adm-token2', feature_name: 'feature4', data: `{"name":"feature4","description":null,"type":"release","project":"default","stale":false,"createdAt":"2024-01-08T10:36:32.866Z","lastSeenAt":null,"impressionData":false,"archivedAt":null,"archived":false}`, }); let triggered = false; eventBus.on(FEATURES_CREATED_BY_PROCESSED, ({ updated }) => { expect(updated).toBe(4); triggered = true; }); await service.setFeatureCreatedByUserIdFromEvents(); expect(triggered).toBeTruthy(); }); //# sourceMappingURL=features-created-by-user-id-data-migration.e2e.test.js.map