mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-31 00:16:47 +01:00
152 lines
4.9 KiB
TypeScript
152 lines
4.9 KiB
TypeScript
|
import { IApiUser, IUnleashConfig, IUnleashStores } from '../../types';
|
||
|
import dbInit, { ITestDb } from '../../../test/e2e/helpers/database-init';
|
||
|
import { FrontendApiService } from './frontend-api-service';
|
||
|
import { createFrontendApiService } from './createFrontendApiService';
|
||
|
import { createLastSeenService } from '../metrics/last-seen/createLastSeenService';
|
||
|
import ClientMetricsServiceV2 from '../metrics/client-metrics/metrics-service-v2';
|
||
|
import ConfigurationRevisionService from '../feature-toggle/configuration-revision-service';
|
||
|
import getLogger from '../../../test/fixtures/no-logger';
|
||
|
import { createTestConfig } from '../../../test/config/test-config';
|
||
|
import { ApiTokenType } from '../../types/models/api-token';
|
||
|
import FeatureToggleService from '../feature-toggle/feature-toggle-service';
|
||
|
import { createFeatureToggleService } from '../feature-toggle/createFeatureToggleService';
|
||
|
import {
|
||
|
FRONTEND_API_REPOSITORY_CREATED,
|
||
|
PROXY_REPOSITORY_CREATED,
|
||
|
} from '../../metric-events';
|
||
|
|
||
|
let stores: IUnleashStores;
|
||
|
let db: ITestDb;
|
||
|
let frontendApiService: FrontendApiService;
|
||
|
let featureToggleService: FeatureToggleService;
|
||
|
let configurationRevisionService: ConfigurationRevisionService;
|
||
|
let config: IUnleashConfig;
|
||
|
|
||
|
beforeAll(async () => {
|
||
|
db = await dbInit('frontend_api_service', getLogger);
|
||
|
stores = db.stores;
|
||
|
config = createTestConfig({
|
||
|
experimental: {
|
||
|
flags: {
|
||
|
globalFrontendApiCache: true,
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const lastSeenService = createLastSeenService(db.rawDatabase, config);
|
||
|
const clientMetricsServiceV2 = new ClientMetricsServiceV2(
|
||
|
stores,
|
||
|
config,
|
||
|
lastSeenService,
|
||
|
);
|
||
|
configurationRevisionService = ConfigurationRevisionService.getInstance(
|
||
|
stores,
|
||
|
config,
|
||
|
);
|
||
|
frontendApiService = createFrontendApiService(
|
||
|
db.rawDatabase,
|
||
|
config,
|
||
|
clientMetricsServiceV2,
|
||
|
configurationRevisionService,
|
||
|
);
|
||
|
featureToggleService = createFeatureToggleService(db.rawDatabase, config);
|
||
|
});
|
||
|
|
||
|
afterAll(async () => {
|
||
|
await db.destroy();
|
||
|
});
|
||
|
|
||
|
const createProject = async (project: string) => {
|
||
|
await stores.projectStore.create({
|
||
|
name: project,
|
||
|
description: '',
|
||
|
id: project,
|
||
|
});
|
||
|
await stores.projectStore.addEnvironmentToProject(project, 'development');
|
||
|
await stores.projectStore.addEnvironmentToProject(project, 'production');
|
||
|
};
|
||
|
|
||
|
const createEnvironment = async (environment: string) => {
|
||
|
await stores.environmentStore.create({ name: environment, type: 'test' });
|
||
|
};
|
||
|
|
||
|
const createFeature = async (project: string, featureName: string) => {
|
||
|
await featureToggleService.createFeatureToggle(
|
||
|
project,
|
||
|
{ name: featureName, description: '' },
|
||
|
'user@example.com',
|
||
|
1,
|
||
|
);
|
||
|
};
|
||
|
|
||
|
const enableFeature = async (
|
||
|
project: string,
|
||
|
featureName: string,
|
||
|
environment: string,
|
||
|
) => {
|
||
|
await featureToggleService.unprotectedUpdateEnabled(
|
||
|
project,
|
||
|
featureName,
|
||
|
environment,
|
||
|
true,
|
||
|
'user@example.com',
|
||
|
);
|
||
|
};
|
||
|
|
||
|
test('Compare Frontend API implementations', async () => {
|
||
|
const projectA = 'projectA';
|
||
|
const projectB = 'projectB';
|
||
|
|
||
|
await createEnvironment('development');
|
||
|
await createEnvironment('production');
|
||
|
|
||
|
await createProject(projectA);
|
||
|
await createProject(projectB);
|
||
|
|
||
|
await createFeature(projectA, 'featureA'); // include
|
||
|
await createFeature(projectA, 'featureB'); // another env
|
||
|
await createFeature(projectA, 'featureC'); // not enabled
|
||
|
await createFeature(projectA, 'featureD'); // include
|
||
|
await enableFeature(projectA, 'featureA', 'development');
|
||
|
await enableFeature(projectA, 'featureD', 'development');
|
||
|
await enableFeature(projectA, 'featureB', 'production');
|
||
|
|
||
|
await createFeature(projectB, 'featureE'); // another project
|
||
|
await enableFeature(projectB, 'featureE', 'development');
|
||
|
|
||
|
await configurationRevisionService.updateMaxRevisionId();
|
||
|
|
||
|
let proxyRepositoriesCount = 0;
|
||
|
config.eventBus.on(PROXY_REPOSITORY_CREATED, () => {
|
||
|
proxyRepositoriesCount++;
|
||
|
});
|
||
|
|
||
|
let frontendRepositoriesCount = 0;
|
||
|
config.eventBus.on(FRONTEND_API_REPOSITORY_CREATED, () => {
|
||
|
frontendRepositoriesCount++;
|
||
|
});
|
||
|
|
||
|
const oldFeatures = await frontendApiService.getFrontendApiFeatures(
|
||
|
{
|
||
|
projects: [projectA],
|
||
|
environment: 'development',
|
||
|
type: ApiTokenType.FRONTEND,
|
||
|
} as IApiUser,
|
||
|
{ sessionId: '1234' },
|
||
|
);
|
||
|
|
||
|
const newFeatures = await frontendApiService.getNewFrontendApiFeatures(
|
||
|
{
|
||
|
projects: [projectA],
|
||
|
environment: 'development',
|
||
|
type: ApiTokenType.FRONTEND,
|
||
|
} as IApiUser,
|
||
|
{ sessionId: '1234' },
|
||
|
);
|
||
|
|
||
|
expect(proxyRepositoriesCount).toBe(1);
|
||
|
expect(frontendRepositoriesCount).toBe(1);
|
||
|
expect(oldFeatures).toEqual(newFeatures);
|
||
|
expect(newFeatures.length).toBe(2);
|
||
|
});
|