From ccb173942416114a708a88085f55d83cd7ef60f2 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Wed, 24 Jan 2024 16:06:26 +0100 Subject: [PATCH 1/3] refactor: instance stats service composition root --- .../createInstanceStatsService.ts | 188 ++++++++++++++++++ src/lib/services/index.ts | 14 +- 2 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 src/lib/features/instance-stats/createInstanceStatsService.ts diff --git a/src/lib/features/instance-stats/createInstanceStatsService.ts b/src/lib/features/instance-stats/createInstanceStatsService.ts new file mode 100644 index 000000000000..7bb1e978fb23 --- /dev/null +++ b/src/lib/features/instance-stats/createInstanceStatsService.ts @@ -0,0 +1,188 @@ +import { InstanceStatsService } from './instance-stats-service'; +import { + createFakeGetActiveUsers, + createGetActiveUsers, +} from './getActiveUsers'; +import { + createFakeGetProductionChanges, + createGetProductionChanges, +} from './getProductionChanges'; +import { IUnleashConfig } from '../../types'; +import { Db } from '../../db/db'; +import FeatureToggleStore from '../feature-toggle/feature-toggle-store'; +import UserStore from '../../db/user-store'; +import ProjectStore from '../../db/project-store'; +import EnvironmentStore from '../project-environments/environment-store'; +import StrategyStore from '../../db/strategy-store'; +import ContextFieldStore from '../../db/context-field-store'; +import GroupStore from '../../db/group-store'; +import SegmentStore from '../../db/segment-store'; +import RoleStore from '../../db/role-store'; +import SettingStore from '../../db/setting-store'; +import ClientInstanceStore from '../../db/client-instance-store'; +import EventStore from '../events/event-store'; +import { ApiTokenStore } from '../../db/api-token-store'; +import { ClientMetricsStoreV2 } from '../metrics/client-metrics/client-metrics-store-v2'; +import VersionService from '../../services/version-service'; +import FeatureStrategyStore from '../feature-toggle/feature-toggle-strategies-store'; +import FakeUserStore from '../../../test/fixtures/fake-user-store'; +import FakeFeatureToggleStore from '../feature-toggle/fakes/fake-feature-toggle-store'; +import FakeProjectStore from '../../../test/fixtures/fake-project-store'; +import FakeEnvironmentStore from '../project-environments/fake-environment-store'; +import FakeGroupStore from '../../../test/fixtures/fake-group-store'; +import FakeContextFieldStore from '../../../test/fixtures/fake-context-field-store'; +import FakeRoleStore from '../../../test/fixtures/fake-role-store'; +import FakeClientInstanceStore from '../../../test/fixtures/fake-client-instance-store'; +import FakeClientMetricsStoreV2 from '../metrics/client-metrics/fake-client-metrics-store-v2'; +import FakeApiTokenStore from '../../../test/fixtures/fake-api-token-store'; +import FakeEventStore from '../../../test/fixtures/fake-event-store'; +import FakeSettingStore from '../../../test/fixtures/fake-setting-store'; +import FakeSegmentStore from '../../../test/fixtures/fake-segment-store'; +import FakeStrategiesStore from '../../../test/fixtures/fake-strategies-store'; +import FakeFeatureStrategiesStore from '../feature-toggle/fakes/fake-feature-strategies-store'; + +export const createInstanceStatsService = (db: Db, config: IUnleashConfig) => { + const { eventBus, getLogger, flagResolver } = config; + const featureToggleStore = new FeatureToggleStore( + db, + eventBus, + getLogger, + flagResolver, + ); + const userStore = new UserStore(db, getLogger); + const projectStore = new ProjectStore( + db, + eventBus, + getLogger, + flagResolver, + ); + const environmentStore = new EnvironmentStore(db, eventBus, getLogger); + const strategyStore = new StrategyStore(db, getLogger); + const contextFieldStore = new ContextFieldStore( + db, + getLogger, + flagResolver, + ); + const groupStore = new GroupStore(db); + const segmentStore = new SegmentStore( + db, + eventBus, + getLogger, + flagResolver, + ); + const roleStore = new RoleStore(db, eventBus, getLogger); + const settingStore = new SettingStore(db, getLogger); + const clientInstanceStore = new ClientInstanceStore( + db, + eventBus, + getLogger, + ); + const eventStore = new EventStore(db, getLogger); + const apiTokenStore = new ApiTokenStore(db, eventBus, getLogger); + const clientMetricsStoreV2 = new ClientMetricsStoreV2( + db, + getLogger, + flagResolver, + ); + const instanceStatsServiceStores = { + featureToggleStore, + userStore, + projectStore, + environmentStore, + strategyStore, + contextFieldStore, + groupStore, + segmentStore, + roleStore, + settingStore, + clientInstanceStore, + eventStore, + apiTokenStore, + clientMetricsStoreV2, + }; + const featureStrategiesStore = new FeatureStrategyStore( + db, + eventBus, + getLogger, + flagResolver, + ); + const versionServiceStores = { + ...instanceStatsServiceStores, + featureStrategiesStore, + }; + const getActiveUsers = createGetActiveUsers(db); + const getProductionChanges = createGetProductionChanges(db); + const versionService = new VersionService( + versionServiceStores, + config, + getActiveUsers, + getProductionChanges, + ); + + const instanceStatsService = new InstanceStatsService( + instanceStatsServiceStores, + config, + versionService, + getActiveUsers, + getProductionChanges, + ); + + return instanceStatsService; +}; + +export const createFakeInstanceStatsService = (config: IUnleashConfig) => { + const { eventBus, getLogger, flagResolver } = config; + const featureToggleStore = new FakeFeatureToggleStore(); + const userStore = new FakeUserStore(); + const projectStore = new FakeProjectStore(); + const environmentStore = new FakeEnvironmentStore(); + const strategyStore = new FakeStrategiesStore(); + const contextFieldStore = new FakeContextFieldStore(); + const groupStore = new FakeGroupStore(); + const segmentStore = new FakeSegmentStore(); + const roleStore = new FakeRoleStore(); + const settingStore = new FakeSettingStore(); + const clientInstanceStore = new FakeClientInstanceStore(); + const eventStore = new FakeEventStore(); + const apiTokenStore = new FakeApiTokenStore(); + const clientMetricsStoreV2 = new FakeClientMetricsStoreV2(); + const instanceStatsServiceStores = { + featureToggleStore, + userStore, + projectStore, + environmentStore, + strategyStore, + contextFieldStore, + groupStore, + segmentStore, + roleStore, + settingStore, + clientInstanceStore, + eventStore, + apiTokenStore, + clientMetricsStoreV2, + }; + const featureStrategiesStore = new FakeFeatureStrategiesStore(); + const versionServiceStores = { + ...instanceStatsServiceStores, + featureStrategiesStore, + }; + const getActiveUsers = createFakeGetActiveUsers(); + const getProductionChanges = createFakeGetProductionChanges(); + const versionService = new VersionService( + versionServiceStores, + config, + getActiveUsers, + getProductionChanges, + ); + + const instanceStatsService = new InstanceStatsService( + instanceStatsServiceStores, + config, + versionService, + getActiveUsers, + getProductionChanges, + ); + + return instanceStatsService; +}; diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index b05503453e38..00cfd764794b 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -104,6 +104,10 @@ import { createFakeTagTypeService, createTagTypeService, } from '../features/tag-type/createTagTypeService'; +import { + createFakeInstanceStatsService, + createInstanceStatsService, +} from '../features/instance-stats/createInstanceStatsService'; export const createServices = ( stores: IUnleashStores, @@ -299,13 +303,9 @@ export const createServices = ( eventService, ); - const instanceStatsService = new InstanceStatsService( - stores, - config, - versionService, - db ? createGetActiveUsers(db) : createFakeGetActiveUsers(), - db ? createGetProductionChanges(db) : createFakeGetProductionChanges(), - ); + const instanceStatsService = db + ? createInstanceStatsService(db, config) + : createFakeInstanceStatsService(config); const maintenanceService = new MaintenanceService(config, settingService); From f21d648e3241baa280574cf2612190d862eb6bcc Mon Sep 17 00:00:00 2001 From: kwasniew Date: Wed, 24 Jan 2024 16:06:49 +0100 Subject: [PATCH 2/3] refactor: instance stats service composition root --- src/lib/features/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/features/index.ts b/src/lib/features/index.ts index 9a615864c269..05c5b6035eb7 100644 --- a/src/lib/features/index.ts +++ b/src/lib/features/index.ts @@ -8,3 +8,4 @@ export * from './dependent-features/createDependentFeaturesService'; export * from './tag-type/createTagTypeService'; export * from './project-environments/createEnvironmentService'; export * from './events/createEventsService'; +export * from './instance-stats/createInstanceStatsService'; From f9dfe8972bd12ed58f6c3ef5c5784ac9b709f487 Mon Sep 17 00:00:00 2001 From: kwasniew Date: Thu, 25 Jan 2024 08:47:00 +0100 Subject: [PATCH 3/3] fix: missing await in tests --- .../e2e/api/admin/instance-admin.e2e.test.ts | 23 +++++++++++++++---- src/test/e2e/helpers/database-init.ts | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/test/e2e/api/admin/instance-admin.e2e.test.ts b/src/test/e2e/api/admin/instance-admin.e2e.test.ts index 66a5777d762e..34c75abbeea9 100644 --- a/src/test/e2e/api/admin/instance-admin.e2e.test.ts +++ b/src/test/e2e/api/admin/instance-admin.e2e.test.ts @@ -1,5 +1,8 @@ import dbInit, { ITestDb } from '../../helpers/database-init'; -import { IUnleashTest, setupApp } from '../../helpers/test-helper'; +import { + IUnleashTest, + setupAppWithCustomConfig, +} from '../../helpers/test-helper'; import getLogger from '../../../fixtures/no-logger'; import { IUnleashStores } from '../../../../lib/types'; @@ -11,7 +14,17 @@ beforeAll(async () => { db = await dbInit('instance_admin_api_serial', getLogger); stores = db.stores; await stores.settingStore.insert('instanceInfo', { id: 'test-static' }); - app = await setupApp(stores); + app = await setupAppWithCustomConfig( + stores, + { + experimental: { + flags: { + strictSchemaValidation: true, + }, + }, + }, + db.rawDatabase, + ); }); afterAll(async () => { @@ -20,7 +33,7 @@ afterAll(async () => { }); test('should return instance statistics', async () => { - stores.featureToggleStore.create('default', { + await stores.featureToggleStore.create('default', { name: 'TestStats1', createdByUserId: 9999, }); @@ -65,11 +78,11 @@ test('should return signed instance statistics', async () => { }); test('should return instance statistics as CVS', async () => { - stores.featureToggleStore.create('default', { + await stores.featureToggleStore.create('default', { name: 'TestStats2', createdByUserId: 9999, }); - stores.featureToggleStore.create('default', { + await stores.featureToggleStore.create('default', { name: 'TestStats3', createdByUserId: 9999, }); diff --git a/src/test/e2e/helpers/database-init.ts b/src/test/e2e/helpers/database-init.ts index cef2d5061083..2ef472641bb6 100644 --- a/src/test/e2e/helpers/database-init.ts +++ b/src/test/e2e/helpers/database-init.ts @@ -1,3 +1,4 @@ +import { log } from 'db-migrate-shared'; import { migrateDb } from '../../../migrator'; import { createStores } from '../../../lib/db'; import { createDb } from '../../../lib/db/db-pool'; @@ -97,6 +98,7 @@ export default async function init( getLogger, }); + log.setLogLevel('error'); const db = createDb(config); await db.raw(`DROP SCHEMA IF EXISTS ${config.db.schema} CASCADE`);