From f1c2706db7348864549857ad959d8da0d8576292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Fri, 6 Jun 2025 09:20:16 +0200 Subject: [PATCH] chore: prepare to remove default env (#10087) Use DEFAULT_ENV instead of just 'default' --- src/lib/db/feature-strategy-store.test.ts | 5 +- ...e-request-segment-usage-read-model.test.ts | 12 +- .../events/event-created-by-migration.test.ts | 3 +- .../export-import.e2e.test.ts | 28 +- .../feature-lifecycle.e2e.test.ts | 16 +- .../feature-search/feature.search.e2e.test.ts | 16 +- .../tests/feature-toggle-service.e2e.test.ts | 14 +- .../feature-toggle-service.limit.test.ts | 9 +- ...eature-toggle-strategies-store.e2e.test.ts | 28 +- .../tests/feature-toggles.auth.e2e.test.ts | 4 +- .../tests/feature-toggles.e2e.test.ts | 92 +++--- .../frontend-api.concurrency.e2e.test.ts | 4 +- .../frontend-api/frontend-api.e2e.test.ts | 20 +- .../global-frontend-api-cache.test.ts | 2 +- .../frontend-api/global-frontend-api-cache.ts | 4 +- .../instance-stats-service.test.ts | 3 +- .../client-metrics/client-metrics.e2e.test.ts | 41 +-- .../features/metrics/instance/metrics.test.ts | 3 +- .../tests/last-seen-service.e2e.test.ts | 13 +- .../largest-resources-read-model.test.ts | 3 +- .../onboarding/onboarding-read-model.test.ts | 7 +- .../playground/advanced-playground.test.ts | 56 ++-- .../playground/offline-unleash-client.test.ts | 5 +- .../environment-service.test.ts | 5 +- .../project-environments.e2e.test.ts | 12 +- .../project-insights-service.e2e.test.ts | 8 +- .../projects-status.e2e.test.ts | 4 +- .../project/project-applications.e2e.test.ts | 17 +- .../project/project-service.e2e.test.ts | 298 +++--------------- .../segment/admin-segment.e2e.test.ts | 35 +- .../segment/client-segment.e2e.test.ts | 2 +- .../features/segment/segment-store.test.ts | 7 +- src/lib/metrics.test.ts | 13 - src/lib/schema/api-token-schema.test.ts | 5 +- src/lib/services/api-token-service.test.ts | 18 +- src/test/e2e/api/admin/api-token.e2e.test.ts | 8 +- .../e2e/api/admin/applications.e2e.test.ts | 18 +- src/test/e2e/api/admin/context.e2e.test.ts | 9 +- .../e2e/api/admin/instance-admin.e2e.test.ts | 5 +- src/test/e2e/api/admin/metrics.e2e.test.ts | 7 +- src/test/e2e/api/admin/playground.e2e.test.ts | 9 +- .../project/project.api.tokens.e2e.test.ts | 11 +- .../admin/project/variants-sunset.e2e.test.ts | 3 +- .../api/admin/project/variants.e2e.test.ts | 7 +- .../leading-slashes-are-stripped.e2e.test.ts | 3 +- .../client/feature.env.disabled.e2e.test.ts | 6 +- src/test/e2e/api/client/metricsV2.e2e.test.ts | 9 +- src/test/e2e/api/client/register.e2e.test.ts | 10 +- ...ated-by-user-id-data-migration.e2e.test.ts | 5 +- src/test/e2e/helpers/test-helper.ts | 2 +- .../e2e/services/access-service.e2e.test.ts | 17 +- .../e2e/services/playground-service.test.ts | 3 +- .../e2e/stores/api-token-store.e2e.test.ts | 34 +- 53 files changed, 400 insertions(+), 578 deletions(-) diff --git a/src/lib/db/feature-strategy-store.test.ts b/src/lib/db/feature-strategy-store.test.ts index 499dcc3f63..a6609bfa30 100644 --- a/src/lib/db/feature-strategy-store.test.ts +++ b/src/lib/db/feature-strategy-store.test.ts @@ -1,5 +1,6 @@ import dbInit, { type ITestDb } from '../../test/e2e/helpers/database-init.js'; import getLogger from '../../test/fixtures/no-logger.js'; +import { DEFAULT_ENV } from '../server-impl.js'; import type { IFeatureStrategiesStore, IFeatureStrategy, @@ -85,7 +86,7 @@ test('counts custom strategies in use', async () => { projectId: 'default', featureName: 'test-toggle', strategyName: 'strategy-1', - environment: 'default', + environment: DEFAULT_ENV, parameters: {}, constraints: [], variants: [], @@ -103,7 +104,7 @@ const baseStrategy: PartialSome = { projectId: 'default', featureName: 'test-toggle-increment', strategyName: 'strategy-1', - environment: 'default', + environment: DEFAULT_ENV, parameters: {}, constraints: [], variants: [], diff --git a/src/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.ts b/src/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.ts index 22c78f9a09..0a19b39de7 100644 --- a/src/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.ts +++ b/src/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.ts @@ -5,7 +5,7 @@ import dbInit, { import getLogger from '../../../test/fixtures/no-logger.js'; import type { IChangeRequestSegmentUsageReadModel } from './change-request-segment-usage-read-model.js'; import { createChangeRequestSegmentUsageReadModel } from './createChangeRequestSegmentUsageReadModel.js'; -import { randomId } from '../../util/index.js'; +import { DEFAULT_ENV, randomId } from '../../util/index.js'; let db: ITestDb; let user: IUser; @@ -65,7 +65,7 @@ const createCR = async ( ) => { await db.rawDatabase.table('change_requests').insert({ id: changeRequestId, - environment: 'default', + environment: DEFAULT_ENV, state, project: 'default', created_by: userId, @@ -167,7 +167,7 @@ test.each([ { projectId: 'default', strategyName: 'flexibleRollout', - environment: 'default', + environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }, @@ -205,7 +205,7 @@ test.each([ id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', - environment: 'default', + environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }, @@ -235,7 +235,7 @@ test(`If the same strategy appears in multiple CRs with the same segment, each s id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', - environment: 'default', + environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID, title: CR_TITLE }, }); @@ -243,7 +243,7 @@ test(`If the same strategy appears in multiple CRs with the same segment, each s id: strategyId, projectId: 'default', strategyName: 'flexibleRollout', - environment: 'default', + environment: DEFAULT_ENV, featureName: FLAG_NAME, changeRequest: { id: CR_ID_2, title: null }, }); diff --git a/src/lib/features/events/event-created-by-migration.test.ts b/src/lib/features/events/event-created-by-migration.test.ts index 952902a5d8..f3fd35ba25 100644 --- a/src/lib/features/events/event-created-by-migration.test.ts +++ b/src/lib/features/events/event-created-by-migration.test.ts @@ -8,6 +8,7 @@ import type { IUnleashConfig } from '../../types/index.js'; import { createTestConfig } from '../../../test/config/test-config.js'; import { createEventsService } from './createEventsService.js'; import EventEmitter from 'node:events'; +import { DEFAULT_ENV } from '../../server-impl.js'; let db: ITestDb; @@ -62,7 +63,7 @@ test('sets created_by_user_id on a mix of events and created_bys', async () => { secret: 'token1', username: 'adm-token', type: 'admin', - environment: 'default', + environment: DEFAULT_ENV, token_name: 'admin-token', }); diff --git a/src/lib/features/export-import-toggles/export-import.e2e.test.ts b/src/lib/features/export-import-toggles/export-import.e2e.test.ts index e5bb8896a7..0336c0c31c 100644 --- a/src/lib/features/export-import-toggles/export-import.e2e.test.ts +++ b/src/lib/features/export-import-toggles/export-import.e2e.test.ts @@ -65,8 +65,6 @@ const createFlag = async ( strategy: Omit = defaultStrategy, tags: string[] = [], projectId: string = 'default', - username: string = 'test', - userId: number = -9999, ) => { await app.services.featureToggleService.createFeatureToggle( projectId, @@ -241,7 +239,7 @@ describe('import-export for project-specific segments', () => { .post('/api/admin/features-batch/export') .send({ features: [defaultFeatureName], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -257,7 +255,7 @@ describe('import-export for project-specific segments', () => { featureEnvironments: [ { enabled: false, - environment: 'default', + environment: DEFAULT_ENV, featureName: defaultFeatureName, }, ], @@ -322,7 +320,7 @@ test('exports features', async () => { .post('/api/admin/features-batch/export') .send({ features: [defaultFeatureName], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -338,7 +336,7 @@ test('exports features', async () => { featureEnvironments: [ { enabled: false, - environment: 'default', + environment: DEFAULT_ENV, featureName: defaultFeatureName, }, ], @@ -407,7 +405,7 @@ test('exports features by tag', async () => { .post('/api/admin/features-batch/export') .send({ tag: 'mytag', - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -423,7 +421,7 @@ test('exports features by tag', async () => { featureEnvironments: [ { enabled: false, - environment: 'default', + environment: DEFAULT_ENV, featureName: defaultFeatureName, }, ], @@ -505,7 +503,7 @@ test('should export custom context fields from strategies and variants', async ( .post('/api/admin/features-batch/export') .send({ features: [defaultFeatureName], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -521,7 +519,7 @@ test('should export custom context fields from strategies and variants', async ( featureEnvironments: [ { enabled: false, - environment: 'default', + environment: DEFAULT_ENV, featureName: defaultFeatureName, }, ], @@ -550,7 +548,7 @@ test('should export tags', async () => { .post('/api/admin/features-batch/export') .send({ features: [defaultFeatureName], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -566,7 +564,7 @@ test('should export tags', async () => { featureEnvironments: [ { enabled: false, - environment: 'default', + environment: DEFAULT_ENV, featureName: defaultFeatureName, }, ], @@ -593,7 +591,7 @@ test('returns all features, when no explicit feature was requested', async () => .post('/api/admin/features-batch/export') .send({ features: [], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(200); @@ -614,7 +612,7 @@ test('returns all project features', async () => { const { body } = await app.request .post('/api/admin/features-batch/export') .send({ - environment: 'default', + environment: DEFAULT_ENV, project: DEFAULT_PROJECT, }) .set('Content-Type', 'application/json') @@ -625,7 +623,7 @@ test('returns all project features', async () => { const { body: otherProject } = await app.request .post('/api/admin/features-batch/export') .send({ - environment: 'default', + environment: DEFAULT_ENV, features: [], // should be ignored because we have project project: 'other_project', }) diff --git a/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts b/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts index 173a0aed64..f6733c5d10 100644 --- a/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts +++ b/src/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.ts @@ -23,6 +23,7 @@ import { FeatureLifecycleReadModel } from './feature-lifecycle-read-model.js'; import type { IFeatureLifecycleReadModel } from './feature-lifecycle-read-model-type.js'; import { STAGE_ENTERED } from '../../metric-events.js'; import type ClientInstanceService from '../metrics/instance/instance-service.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -103,8 +104,9 @@ const uncompleteFeature = async (featureName: string, expectedCode = 200) => { function reachedStage(feature: string, stage: StageName) { return new Promise((resolve) => eventBus.on(STAGE_ENTERED, (event) => { - if (event.stage === stage && event.feature === feature) + if (event.stage === stage && event.feature === feature) { resolve(stage); + } }), ); } @@ -126,25 +128,25 @@ const getFeaturesLifecycleCount = async () => { test('should return lifecycle stages', async () => { await app.createFeature('my_feature_a'); - await app.enableFeature('my_feature_a', 'default'); + await app.enableFeature('my_feature_a', DEFAULT_ENV); eventStore.emit(FEATURE_CREATED, { featureName: 'my_feature_a' }); await reachedStage('my_feature_a', 'initial'); await expectFeatureStage('my_feature_a', 'initial'); eventBus.emit(CLIENT_METRICS_ADDED, [ { featureName: 'my_feature_a', - environment: 'default', + environment: DEFAULT_ENV, }, { featureName: 'non_existent_feature', - environment: 'default', + environment: DEFAULT_ENV, }, ]); // missing feature eventBus.emit(CLIENT_METRICS_ADDED, [ { - environment: 'default', + environment: DEFAULT_ENV, yes: 0, no: 0, }, @@ -240,12 +242,12 @@ test('should backfill archived feature', async () => { test('should not backfill for existing lifecycle', async () => { await app.createFeature('my_feature_e'); - await app.enableFeature('my_feature_e', 'default'); + await app.enableFeature('my_feature_e', DEFAULT_ENV); eventStore.emit(FEATURE_CREATED, { featureName: 'my_feature_e' }); eventBus.emit(CLIENT_METRICS_ADDED, [ { featureName: 'my_feature_e', - environment: 'default', + environment: DEFAULT_ENV, }, ]); await reachedStage('my_feature_e', 'live'); diff --git a/src/lib/features/feature-search/feature.search.e2e.test.ts b/src/lib/features/feature-search/feature.search.e2e.test.ts index 6d5610e898..63f3d48e24 100644 --- a/src/lib/features/feature-search/feature.search.e2e.test.ts +++ b/src/lib/features/feature-search/feature.search.e2e.test.ts @@ -450,12 +450,12 @@ test('should filter features by tag that has colon inside', async () => { test('should filter features by environment status', async () => { await app.createFeature('my_feature_a'); await app.createFeature('my_feature_b'); - await app.enableFeature('my_feature_a', 'default'); + await app.enableFeature('my_feature_a', DEFAULT_ENV); const { body } = await filterFeaturesByEnvironmentStatus([ - 'default:enabled', + `${DEFAULT_ENV}:enabled`, 'nonexistentEnv:disabled', - 'default:wrongStatus', + `${DEFAULT_ENV}:wrongStatus`, ]); expect(body).toMatchObject({ @@ -527,10 +527,10 @@ test('should sort features', async () => { await app.createFeature('my_feature_a'); await app.createFeature('my_feature_c'); await app.createFeature('my_feature_b'); - await app.enableFeature('my_feature_c', 'default'); + await app.enableFeature('my_feature_c', DEFAULT_ENV); await app.favoriteFeature('my_feature_b'); - await insertLastSeenAt('my_feature_c', db.rawDatabase, 'default'); + await insertLastSeenAt('my_feature_c', db.rawDatabase, DEFAULT_ENV); const { body: ascName } = await sortFeatures({ sortBy: 'name', @@ -575,7 +575,7 @@ test('should sort features', async () => { }); const { body: environmentAscSort } = await sortFeatures({ - sortBy: 'environment:default', + sortBy: `environment:${DEFAULT_ENV}`, sortOrder: 'asc', }); @@ -589,7 +589,7 @@ test('should sort features', async () => { }); const { body: environmentDescSort } = await sortFeatures({ - sortBy: 'environment:default', + sortBy: `environment:${DEFAULT_ENV}`, sortOrder: 'desc', }); @@ -603,7 +603,7 @@ test('should sort features', async () => { }); const { body: favoriteEnvironmentDescSort } = await sortFeatures({ - sortBy: 'environment:default', + sortBy: `environment:${DEFAULT_ENV}`, sortOrder: 'desc', favoritesFirst: 'true', }); diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts index 985f8174f0..0c0f578f55 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts @@ -366,7 +366,7 @@ test('cloning a feature flag copies variant environments correctly', async () => ); const defaultEnv = clonedFlag.environments.find( - (x) => x.name === 'default', + (x) => x.name === DEFAULT_ENV, ); const newEnv = clonedFlag.environments.find((x) => x.name === targetEnv); @@ -377,7 +377,7 @@ test('cloning a feature flag copies variant environments correctly', async () => test('cloning a feature flag not allowed for change requests enabled', async () => { await db.rawDatabase('change_request_settings').insert({ project: 'default', - environment: 'default', + environment: DEFAULT_ENV, }); await expect( service.cloneFeatureToggle( @@ -397,7 +397,7 @@ test('cloning a feature flag not allowed for change requests enabled', async () test('changing to a project with change requests enabled should not be allowed', async () => { await db.rawDatabase('change_request_settings').insert({ project: 'default', - environment: 'default', + environment: DEFAULT_ENV, }); await expect( service.changeProject('newFlagName', 'default', TEST_AUDIT_USER), @@ -453,7 +453,7 @@ test('Cloning a feature flag also clones segments correctly', async () => { featureName: clonedFeatureName, }); expect( - feature.environments.find((x) => x.name === 'default')?.strategies[0] + feature.environments.find((x) => x.name === DEFAULT_ENV)?.strategies[0] .segments, ).toHaveLength(1); }); @@ -510,13 +510,13 @@ test('If change requests are enabled, cannot change variants without going via C }; await db.rawDatabase('change_request_settings').insert({ project: 'default', - environment: 'default', + environment: DEFAULT_ENV, }); return expect(async () => customFeatureService.crProtectedSaveVariantsOnEnv( 'default', featureName, - 'default', + DEFAULT_ENV, [newVariant], { createdAt: irrelevantDate, @@ -852,7 +852,7 @@ test('Should not allow to revive flags to archived projects', async () => { test('Should enable disabled strategies on feature environment enabled', async () => { const flagName = 'enableThisFlag'; const project = 'default'; - const environment = 'default'; + const environment = DEFAULT_ENV; await service.createFeatureToggle( project, { diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts index 4d2e8d0e14..4d434d1f24 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.limit.test.ts @@ -10,6 +10,7 @@ import type { import getLogger from '../../../../test/fixtures/no-logger.js'; import { ExceedsLimitError } from '../../../error/exceeds-limit-error.js'; import { describe, test, expect } from 'vitest'; +import { DEFAULT_ENV } from '../../../server-impl.js'; const alwaysOnFlagResolver = { isEnabled() { return true; @@ -134,7 +135,7 @@ describe('Strategy limits', () => { featureName: flagName, constraints: constraints, projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, }); const updateStrategy = (newConstraints) => @@ -146,7 +147,7 @@ describe('Strategy limits', () => { { projectId: 'default', featureName: 'feature', - environment: 'default', + environment: DEFAULT_ENV, }, {} as IAuditUser, ); @@ -241,7 +242,7 @@ describe('Strategy limits', () => { featureName: flagName, constraints: constraints(initialConstraintValueCount), projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, }); const updateStrategy = (valueCount) => @@ -253,7 +254,7 @@ describe('Strategy limits', () => { { projectId: 'default', featureName: 'feature', - environment: 'default', + environment: DEFAULT_ENV, }, {} as IAuditUser, ); diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.ts index 9bb51762d7..feaf1db119 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.ts @@ -10,7 +10,7 @@ import type { IProjectStore, IUnleashStores, } from '../../../types/index.js'; -import { randomId } from '../../../util/index.js'; +import { DEFAULT_ENV, randomId } from '../../../util/index.js'; let stores: IUnleashStores; let db: ITestDb; @@ -45,7 +45,7 @@ afterAll(async () => { test('Can successfully update project for all strategies belonging to feature', async () => { const newProjectId = 'different-project'; const oldProjectId = 'default'; - const environment = 'default'; + const environment = DEFAULT_ENV; await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'default', projectId: oldProjectId, @@ -168,7 +168,7 @@ describe('strategy parameters default to sane defaults', () => { const strategy = await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'flexibleRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 15, @@ -188,7 +188,7 @@ describe('strategy parameters default to sane defaults', () => { const strategy = await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'flexibleRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 15, @@ -211,7 +211,7 @@ describe('strategy parameters default to sane defaults', () => { const strategy = await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'applicationHostname', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 15, @@ -240,7 +240,7 @@ describe('strategy parameters default to sane defaults', () => { const strategy = await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'flexibleRollout', projectId: project.id, - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 15, @@ -267,7 +267,7 @@ describe('max metrics collection', () => { await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'gradualRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 0, @@ -276,7 +276,7 @@ describe('max metrics collection', () => { await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'gradualRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: toggle.name, constraints: [], sortOrder: 0, @@ -290,7 +290,7 @@ describe('max metrics collection', () => { expect(maxStrategies).toEqual({ feature: 'featureA', count: 2 }); expect(maxEnvStrategies).toEqual({ feature: 'featureA', - environment: 'default', + environment: DEFAULT_ENV, count: 2, }); }); @@ -312,7 +312,7 @@ describe('max metrics collection', () => { return { strategyName: 'gradualRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: feature, constraints: [constraint], @@ -364,7 +364,7 @@ describe('max metrics collection', () => { await featureStrategiesReadModel.getMaxConstraintValues(); expect(maxConstraintValues).toEqual({ feature: flagA.name, - environment: 'default', + environment: DEFAULT_ENV, count: maxValueCount, }); }); @@ -387,7 +387,7 @@ describe('max metrics collection', () => { await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'gradualRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: flagA.name, constraints: [ { @@ -408,7 +408,7 @@ describe('max metrics collection', () => { await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'gradualRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: flagB.name, constraints: [], sortOrder: 0, @@ -419,7 +419,7 @@ describe('max metrics collection', () => { await featureStrategiesReadModel.getMaxConstraintsPerStrategy(); expect(maxConstraintValues).toEqual({ feature: flagA.name, - environment: 'default', + environment: DEFAULT_ENV, count: 2, }); }); diff --git a/src/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.ts index aedb0aad8e..ae8626e259 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.ts @@ -139,10 +139,10 @@ test('Should not be possible auto-enable feature flag without CREATE_FEATURE_STR await db.stores.accessStore.removePermissionFromRole( role.id, CREATE_FEATURE_STRATEGY, - 'default', + DEFAULT_ENV, ); await app.request - .post(`${url}/${name}/environments/default/on`) + .post(`${url}/${name}/environments/${DEFAULT_ENV}/on`) .expect(403); }); diff --git a/src/lib/features/feature-toggle/tests/feature-toggles.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggles.e2e.test.ts index e4001b2e9b..c32c862bfb 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggles.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggles.e2e.test.ts @@ -64,7 +64,7 @@ const createStrategy = async ( ) => { return app.request .post( - `/api/admin/projects/default/features/${featureName}/environments/default/strategies`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/strategies`, ) .send(payload) .expect(expectedCode); @@ -78,7 +78,7 @@ const updateStrategy = async ( ) => { const { body } = await app.request .put( - `/api/admin/projects/default/features/${featureName}/environments/default/strategies/${strategyId}`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/strategies/${strategyId}`, ) .send(payload) .expect(expectedCode); @@ -107,7 +107,7 @@ beforeAll(async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); }); @@ -952,7 +952,7 @@ test('Can add strategy to feature flag to a "some-env-2"', async () => { }); test('Can update strategy on feature flag', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = 'feature.strategy.update.strat'; const projectPath = '/api/admin/projects/default'; const featurePath = `${projectPath}/features/${featureName}`; @@ -986,7 +986,7 @@ test('Can update strategy on feature flag', async () => { }); test('should coerce all strategy parameter values to strings', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = randomId(); const projectPath = '/api/admin/projects/default'; const featurePath = `${projectPath}/features/${featureName}`; @@ -1010,7 +1010,7 @@ test('should coerce all strategy parameter values to strings', async () => { }); test('should NOT limit the length of parameter values', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = randomId(); const projectPath = '/api/admin/projects/default'; const featurePath = `${projectPath}/features/${featureName}`; @@ -1027,7 +1027,7 @@ test('should NOT limit the length of parameter values', async () => { }); test('Can NOT delete strategy with wrong projectId', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = 'feature.strategy.delete.strat.error'; const projectPath = '/api/admin/projects/default'; @@ -1059,7 +1059,7 @@ test('Can NOT delete strategy with wrong projectId', async () => { }); test('add strategy cannot use wrong projectId', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = 'feature.strategy.add.strat.wrong.projectId'; // create feature flag @@ -1083,7 +1083,7 @@ test('add strategy cannot use wrong projectId', async () => { }); test('update strategy on feature flag cannot use wrong projectId', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = 'feature.strategy.update.strat.wrong.projectId'; const projectPath = '/api/admin/projects/default'; @@ -2040,7 +2040,7 @@ test('should clone feature flag WITH variants', async () => { }); test('should clone feature flag without replacing groupId', async () => { - const envName = 'default'; + const envName = DEFAULT_ENV; const featureName = 'feature.flag.base.4'; const cloneName = 'feature.flag.clone.4'; @@ -2135,13 +2135,13 @@ test('Should not allow changing project to target project without the same enabl ); await db.stores.projectStore.addEnvironmentToProject( targetProject, - 'default', + DEFAULT_ENV, ); await app.createFeature(featureName, project); await app.request .post( - `/api/admin/projects/${project}/features/${featureName}/environments/default/strategies`, + `/api/admin/projects/${project}/features/${featureName}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2163,7 +2163,7 @@ test('Should not allow changing project to target project without the same enabl .expect(200); await app.request .post( - `/api/admin/projects/${project}/features/${featureName}/environments/default/on`, + `/api/admin/projects/${project}/features/${featureName}/environments/${DEFAULT_ENV}/on`, ) .send({}) .expect(200); @@ -2215,14 +2215,14 @@ test('Should allow changing project to target project with the same enabled envi await db.stores.projectStore.addEnvironmentToProject('default', inBoth); await db.stores.projectStore.addEnvironmentToProject( targetProject, - 'default', + DEFAULT_ENV, ); await db.stores.projectStore.addEnvironmentToProject(targetProject, inBoth); await app.createFeature(featureName, project); await app.request .post( - `/api/admin/projects/${project}/features/${featureName}/environments/default/strategies`, + `/api/admin/projects/${project}/features/${featureName}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2244,7 +2244,7 @@ test('Should allow changing project to target project with the same enabled envi .expect(200); await app.request .post( - `/api/admin/projects/${project}/features/${featureName}/environments/default/on`, + `/api/admin/projects/${project}/features/${featureName}/environments/${DEFAULT_ENV}/on`, ) .send({}) .expect(200); @@ -2461,7 +2461,7 @@ test('should handle strategy variants', async () => { variants: [variant], }; - const featureStrategiesPath = `/api/admin/projects/default/features/${feature.name}/environments/default/strategies`; + const featureStrategiesPath = `/api/admin/projects/default/features/${feature.name}/environments/${DEFAULT_ENV}/strategies`; await app.request .post(featureStrategiesPath) @@ -2513,7 +2513,7 @@ test('should reject invalid constraint values for multi-valued constraints', asy constraints: [{ contextName: 'userId', operator: 'IN', values }], }); - const featureStrategiesPath = `/api/admin/projects/${project.id}/features/${flag.name}/environments/default/strategies`; + const featureStrategiesPath = `/api/admin/projects/${project.id}/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`; await app.request .post(featureStrategiesPath) @@ -2578,7 +2578,7 @@ test('should add default constraint values for single-valued constraints', async expect(res.body.constraints[0].values).toEqual(values); }; - const featureStrategiesPath = `/api/admin/projects/${project.id}/features/${flag.name}/environments/default/strategies`; + const featureStrategiesPath = `/api/admin/projects/${project.id}/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`; await app.request .post(featureStrategiesPath) @@ -2623,7 +2623,7 @@ test('should allow long parameter values', async () => { await app.request .post( - `/api/admin/projects/${project.id}/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/${project.id}/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send(strategy) .expect(200); @@ -2640,7 +2640,7 @@ test('should change strategy sort order when payload is valid', async () => { const { body: strategyOne } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'default', @@ -2652,7 +2652,7 @@ test('should change strategy sort order when payload is valid', async () => { const { body: strategyTwo } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2663,7 +2663,7 @@ test('should change strategy sort order when payload is valid', async () => { .expect(200); const { body: strategies } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategies[0].sortOrder).toBe(0); @@ -2673,7 +2673,7 @@ test('should change strategy sort order when payload is valid', async () => { await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies/set-sort-order`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies/set-sort-order`, ) .send([ { @@ -2688,7 +2688,7 @@ test('should change strategy sort order when payload is valid', async () => { .expect(200); const { body: strategiesOrdered } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategiesOrdered[0].sortOrder).toBe(1); @@ -2702,7 +2702,7 @@ test('should reject set sort order request when payload is invalid', async () => await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies/set-sort-order`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies/set-sort-order`, ) .send([ { @@ -2726,7 +2726,7 @@ test('should return strategies in correct order when new strategies are added', const { body: strategyOne } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'default', @@ -2738,7 +2738,7 @@ test('should return strategies in correct order when new strategies are added', const { body: strategyTwo } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2749,7 +2749,7 @@ test('should return strategies in correct order when new strategies are added', .expect(200); const { body: strategies } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategies[0].sortOrder).toBe(0); @@ -2759,7 +2759,7 @@ test('should return strategies in correct order when new strategies are added', await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies/set-sort-order`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies/set-sort-order`, ) .send([ { @@ -2775,7 +2775,7 @@ test('should return strategies in correct order when new strategies are added', const { body: strategyThree } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2787,7 +2787,7 @@ test('should return strategies in correct order when new strategies are added', const { body: strategyFour } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -2798,7 +2798,7 @@ test('should return strategies in correct order when new strategies are added', .expect(200); const { body: strategiesOrdered } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategiesOrdered[0].sortOrder).toBe(1); @@ -2810,7 +2810,7 @@ test('should return strategies in correct order when new strategies are added', await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies/set-sort-order`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies/set-sort-order`, ) .send([ { @@ -2821,7 +2821,7 @@ test('should return strategies in correct order when new strategies are added', .expect(200); const { body: strategiesReOrdered } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); // This block checks the order of the strategies retrieved from the endpoint. After partial update, the order should @@ -2853,7 +2853,7 @@ test('should create a strategy with segments', async () => { .get(`/api/admin/projects/default/features/${feature.name}`) .expect((res) => { const defaultEnv = res.body.environments.find( - (env) => env.name === 'default', + (env) => env.name === DEFAULT_ENV, ); const strategy = defaultEnv.strategies.find( (strat) => strat.id === strategyOne.id, @@ -2874,7 +2874,7 @@ test('should create a strategy with segments', async () => { .get(`/api/admin/projects/default/features/${feature.name}`) .expect((res) => { const defaultEnv = res.body.environments.find( - (env) => env.name === 'default', + (env) => env.name === DEFAULT_ENV, ); const strategy = defaultEnv.strategies.find( (strat) => strat.id === strategyOne.id, @@ -2903,7 +2903,7 @@ test('should add multiple segments to a strategy', async () => { .get(`/api/admin/projects/default/features/${feature.name}`) .expect((res) => { const defaultEnv = res.body.environments.find( - (env) => env.name === 'default', + (env) => env.name === DEFAULT_ENV, ); const strategy = defaultEnv?.strategies.find( (strat) => strat.id === strategyOne.id, @@ -3075,7 +3075,7 @@ test('should return disabled strategies', async () => { const { body: strategyOne } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'default', @@ -3088,7 +3088,7 @@ test('should return disabled strategies', async () => { const { body: strategyTwo } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -3099,7 +3099,7 @@ test('should return disabled strategies', async () => { .expect(200); const { body: strategies } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategies[0].id).toBe(strategyOne.id); @@ -3119,7 +3119,7 @@ test('should disable strategies in place', async () => { const { body: strategyOne } = await app.request .post( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'flexibleRollout', @@ -3133,7 +3133,7 @@ test('should disable strategies in place', async () => { .expect(200); const { body: strategies } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(strategies[0].id).toBe(strategyOne.id); @@ -3141,7 +3141,7 @@ test('should disable strategies in place', async () => { const { body: updatedStrategyOne } = await app.request .put( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies/${strategyOne.id}`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies/${strategyOne.id}`, ) .send({ name: 'flexibleRollout', @@ -3156,7 +3156,7 @@ test('should disable strategies in place', async () => { .expect(200); const { body: updatedStrategies } = await app.request.get( - `/api/admin/projects/default/features/${flag.name}/environments/default/strategies`, + `/api/admin/projects/default/features/${flag.name}/environments/${DEFAULT_ENV}/strategies`, ); expect(updatedStrategies[0].id).toBe(updatedStrategyOne.id); @@ -3530,7 +3530,7 @@ test('can get evaluation metrics', async () => { name: 'metric-feature', environments: [ { - name: 'default', + name: DEFAULT_ENV, yes: 123, no: 321, }, diff --git a/src/lib/features/frontend-api/frontend-api.concurrency.e2e.test.ts b/src/lib/features/frontend-api/frontend-api.concurrency.e2e.test.ts index 5435639bac..af4dcf5466 100644 --- a/src/lib/features/frontend-api/frontend-api.concurrency.e2e.test.ts +++ b/src/lib/features/frontend-api/frontend-api.concurrency.e2e.test.ts @@ -6,7 +6,7 @@ import dbInit, { type ITestDb, } from '../../../test/e2e/helpers/database-init.js'; import getLogger from '../../../test/fixtures/no-logger.js'; -import { randomId } from '../../util/index.js'; +import { DEFAULT_ENV, randomId } from '../../util/index.js'; import { ApiTokenType } from '../../types/model.js'; import { vi } from 'vitest'; @@ -58,7 +58,7 @@ test('multiple parallel calls to api/frontend should not create multiple instanc await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.FRONTEND, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: `test-token-${randomId()}`, }); const address = app.server.address(); diff --git a/src/lib/features/frontend-api/frontend-api.e2e.test.ts b/src/lib/features/frontend-api/frontend-api.e2e.test.ts index 9a245424c6..56f98cad81 100644 --- a/src/lib/features/frontend-api/frontend-api.e2e.test.ts +++ b/src/lib/features/frontend-api/frontend-api.e2e.test.ts @@ -6,7 +6,7 @@ import dbInit, { type ITestDb, } from '../../../test/e2e/helpers/database-init.js'; import getLogger from '../../../test/fixtures/no-logger.js'; -import { randomId } from '../../util/index.js'; +import { DEFAULT_ENV, randomId } from '../../util/index.js'; import { ApiTokenType, type IApiToken, @@ -64,7 +64,7 @@ export const createApiToken = ( return app.services.apiTokenService.createApiTokenWithProjects({ type, projects: ['*'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: `${type}-token-${randomId()}`, ...overrides, }); @@ -73,7 +73,7 @@ export const createApiToken = ( const createFeatureToggle = async ({ name, project = 'default', - environment = 'default', + environment = DEFAULT_ENV, strategies, enabled, }: { @@ -233,13 +233,13 @@ test('should allow requests with an admin token', async () => { environment: '*', }); await frontendApiService.refreshData(); - await app.request + const { body } = await app.request .get('/api/frontend') .set('Authorization', adminToken.secret) .expect('Content-Type', /json/) - .expect(200) - .expect((res) => expect(res.body.toggles).toHaveLength(1)) - .expect((res) => expect(res.body.toggles[0].name).toEqual(featureA)); + .expect(200); + expect(body.toggles).toHaveLength(1); + expect(body.toggles[0].name).toEqual(featureA); }); test('should not allow admin requests with a frontend token', async () => { @@ -341,7 +341,7 @@ test('should accept client registration requests', async () => { appName: randomId(), instanceId: randomId(), sdkVersion: randomId(), - environment: 'default', + environment: DEFAULT_ENV, interval: 10000, started: new Date(), strategies: ['default'], @@ -419,7 +419,7 @@ test('should store frontend api client metrics', async () => { featureName, lastHourUsage: [ { - environment: 'default', + environment: DEFAULT_ENV, timestamp: startOfHour(now).toISOString(), yes: 3, no: 30, @@ -1174,7 +1174,7 @@ test('should return 204 if metrics are disabled', async () => { await localApp.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.FRONTEND, projects: ['*'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: `disabledMetric-token-${randomId()}`, }); diff --git a/src/lib/features/frontend-api/global-frontend-api-cache.test.ts b/src/lib/features/frontend-api/global-frontend-api-cache.test.ts index d52fa11431..0ce3203cd7 100644 --- a/src/lib/features/frontend-api/global-frontend-api-cache.test.ts +++ b/src/lib/features/frontend-api/global-frontend-api-cache.test.ts @@ -141,7 +141,7 @@ test('Can read initial features', async () => { const defaultProjectFeatures = cache.getToggles({ environment: '*', - projects: ['*'], + projects: ['default'], } as IApiUser); expect(defaultProjectFeatures.length).toBe(0); diff --git a/src/lib/features/frontend-api/global-frontend-api-cache.ts b/src/lib/features/frontend-api/global-frontend-api-cache.ts index dd71d3da25..fcfadca08f 100644 --- a/src/lib/features/frontend-api/global-frontend-api-cache.ts +++ b/src/lib/features/frontend-api/global-frontend-api-cache.ts @@ -11,7 +11,7 @@ import { mapFeatureForClient, mapSegmentsForClient, } from '../playground/offline-unleash-client.js'; -import { ALL_ENVS } from '../../util/constants.js'; +import { ALL_ENVS, DEFAULT_ENV } from '../../util/constants.js'; import type { Logger } from '../../logger.js'; import { UPDATE_REVISION } from '../feature-toggle/configuration-revision-service.js'; import type { IClientFeatureToggleReadModel } from './client-feature-toggle-read-model-type.js'; @@ -141,7 +141,7 @@ export class GlobalFrontendApiCache extends EventEmitter { private environmentNameForToken(token: IApiUser): string { if (token.environment === ALL_ENVS) { - return 'default'; + return DEFAULT_ENV; } return token.environment; } diff --git a/src/lib/features/instance-stats/instance-stats-service.test.ts b/src/lib/features/instance-stats/instance-stats-service.test.ts index baf66cf994..e3786c609a 100644 --- a/src/lib/features/instance-stats/instance-stats-service.test.ts +++ b/src/lib/features/instance-stats/instance-stats-service.test.ts @@ -13,6 +13,7 @@ import type { } from '../../types/index.js'; import { createFakeGetLicensedUsers } from './getLicensedUsers.js'; import { vi } from 'vitest'; +import { DEFAULT_ENV } from '../../server-impl.js'; let instanceStatsService: InstanceStatsService; let versionService: VersionService; @@ -146,7 +147,7 @@ describe.each([true, false])( ).mockReturnValue( Promise.resolve({ feature: 'x', - environment: 'default', + environment: DEFAULT_ENV, count: 3, }), ); diff --git a/src/lib/features/metrics/client-metrics/client-metrics.e2e.test.ts b/src/lib/features/metrics/client-metrics/client-metrics.e2e.test.ts index 98b21a96d4..28ebaaabfe 100644 --- a/src/lib/features/metrics/client-metrics/client-metrics.e2e.test.ts +++ b/src/lib/features/metrics/client-metrics/client-metrics.e2e.test.ts @@ -6,6 +6,7 @@ import { setupAppWithCustomConfig, } from '../../../../test/e2e/helpers/test-helper.js'; import getLogger from '../../../../test/fixtures/no-logger.js'; +import { DEFAULT_ENV } from '../../../server-impl.js'; import type { IClientMetricsEnv } from './client-metrics-store-v2-type.js'; import { subHours } from 'date-fns'; @@ -55,7 +56,7 @@ test('should return raw metrics, aggregated on key', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 2, no: 2, @@ -63,7 +64,7 @@ test('should return raw metrics, aggregated on key', async () => { { featureName: 't2', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 5, no: 5, @@ -71,7 +72,7 @@ test('should return raw metrics, aggregated on key', async () => { { featureName: 't2', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 2, no: 99, @@ -79,7 +80,7 @@ test('should return raw metrics, aggregated on key', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 3, no: 2, @@ -106,7 +107,7 @@ test('should return raw metrics, aggregated on key', async () => { .expect(200); expect(demo.data).toHaveLength(48); - expect(demo.data[46].environment).toBe('default'); + expect(demo.data[46].environment).toBe(DEFAULT_ENV); expect(demo.data[46].yes).toBe(5); expect(demo.data[46].no).toBe(4); expect(demo.data[47].environment).toBe('test'); @@ -114,7 +115,7 @@ test('should return raw metrics, aggregated on key', async () => { expect(demo.data[47].no).toBe(3); expect(t2.data).toHaveLength(24); - expect(t2.data[23].environment).toBe('default'); + expect(t2.data[23].environment).toBe(DEFAULT_ENV); expect(t2.data[23].yes).toBe(7); expect(t2.data[23].no).toBe(104); }); @@ -125,7 +126,7 @@ test('should support the hoursBack query param for raw metrics', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 1, no: 1, @@ -133,7 +134,7 @@ test('should support the hoursBack query param for raw metrics', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: subHours(date, 12), yes: 2, no: 2, @@ -141,7 +142,7 @@ test('should support the hoursBack query param for raw metrics', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: subHours(date, 32), yes: 3, no: 3, @@ -172,7 +173,7 @@ test('should return toggle summary', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 2, no: 2, @@ -180,7 +181,7 @@ test('should return toggle summary', async () => { { featureName: 't2', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 5, no: 5, @@ -188,7 +189,7 @@ test('should return toggle summary', async () => { { featureName: 't2', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 2, no: 99, @@ -196,7 +197,7 @@ test('should return toggle summary', async () => { { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 3, no: 2, @@ -228,7 +229,7 @@ test('should return toggle summary', async () => { const test = demo.lastHourUsage.find((u) => u.environment === 'test'); const defaultEnv = demo.lastHourUsage.find( - (u) => u.environment === 'default', + (u) => u.environment === DEFAULT_ENV, ); expect(demo.featureName).toBe('demo'); @@ -236,7 +237,7 @@ test('should return toggle summary', async () => { expect(test.environment).toBe('test'); expect(test.yes).toBe(2); expect(test.no).toBe(6); - expect(defaultEnv.environment).toBe('default'); + expect(defaultEnv.environment).toBe(DEFAULT_ENV); expect(defaultEnv.yes).toBe(5); expect(defaultEnv.no).toBe(4); expect(demo.seenApplications).toStrictEqual(['backend-api', 'web']); @@ -249,7 +250,7 @@ test('should only include last hour of metrics return toggle summary', async () { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: now, yes: 2, no: 2, @@ -257,7 +258,7 @@ test('should only include last hour of metrics return toggle summary', async () { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: now, yes: 3, no: 2, @@ -297,12 +298,12 @@ test('should only include last hour of metrics return toggle summary', async () const test = demo.lastHourUsage.find((u) => u.environment === 'test'); const defaultEnv = demo.lastHourUsage.find( - (u) => u.environment === 'default', + (u) => u.environment === DEFAULT_ENV, ); expect(demo.featureName).toBe('demo'); expect(demo.lastHourUsage).toHaveLength(2); - expect(defaultEnv.environment).toBe('default'); + expect(defaultEnv.environment).toBe(DEFAULT_ENV); expect(defaultEnv.yes).toBe(5); expect(defaultEnv.no).toBe(4); expect(test.environment).toBe('test'); @@ -316,7 +317,7 @@ test('should support posting and receiving variants data', async () => { const metric = { featureName: 'demo', appName: 'web', - environment: 'default', + environment: DEFAULT_ENV, timestamp: date, yes: 7, no: 1, diff --git a/src/lib/features/metrics/instance/metrics.test.ts b/src/lib/features/metrics/instance/metrics.test.ts index 69c7690010..865407897c 100644 --- a/src/lib/features/metrics/instance/metrics.test.ts +++ b/src/lib/features/metrics/instance/metrics.test.ts @@ -19,6 +19,7 @@ import { startOfHour } from 'date-fns'; import { ApiTokenType } from '../../../types/model.js'; import type TestAgent from 'supertest/lib/agent.d.ts'; import type { BulkRegistrationSchema } from '../../../openapi/index.js'; +import { DEFAULT_ENV } from '../../../server-impl.js'; let db: ITestDb; let config: IUnleashConfig; @@ -427,7 +428,7 @@ describe('bulk metrics', () => { { featureName: 'test_feature_one', appName: 'test_application', - environment: 'default', + environment: DEFAULT_ENV, timestamp: startOfHour(now), yes: 1000, no: 800, diff --git a/src/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.ts b/src/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.ts index af7ff0ef8a..fbe8eb669a 100644 --- a/src/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.ts +++ b/src/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.ts @@ -6,6 +6,7 @@ import { setupAppWithCustomConfig, } from '../../../../../test/e2e/helpers/test-helper.js'; import getLogger from '../../../../../test/fixtures/no-logger.js'; +import { DEFAULT_ENV } from '../../../../server-impl.js'; import { TEST_AUDIT_USER } from '../../../../types/index.js'; let app: IUnleashTest; @@ -54,7 +55,7 @@ test('should clean unknown feature flag names from last seen store', async () => const inserts = [...clean, ...dirty].map((feature) => { return { featureName: feature, - environment: 'default', + environment: DEFAULT_ENV, yes: 1, no: 0, appName: 'test', @@ -90,8 +91,8 @@ test('should clean unknown feature flag environments from last seen store', asyn const { lastSeenService, featureToggleService } = app.services; const clean = [ - { name: 'clean5', environment: 'default' }, - { name: 'clean6', environment: 'default' }, + { name: 'clean5', environment: DEFAULT_ENV }, + { name: 'clean6', environment: DEFAULT_ENV }, { name: 'clean7', environment: 'nonexisting' }, { name: 'clean8', environment: 'nonexisting' }, ]; @@ -138,9 +139,9 @@ test('should not fail with feature names longer than 255 chars', async () => { const { lastSeenService } = app.services; const longFeatureNames = [ - { name: 'a'.repeat(254), environment: 'default' }, - { name: 'b'.repeat(255), environment: 'default' }, - { name: 'c'.repeat(256), environment: 'default' }, // this one should be filtered out + { name: 'a'.repeat(254), environment: DEFAULT_ENV }, + { name: 'b'.repeat(255), environment: DEFAULT_ENV }, + { name: 'c'.repeat(256), environment: DEFAULT_ENV }, // this one should be filtered out ]; const inserts = [...longFeatureNames].map((feature) => { diff --git a/src/lib/features/metrics/sizes/largest-resources-read-model.test.ts b/src/lib/features/metrics/sizes/largest-resources-read-model.test.ts index 5711168119..c57e366413 100644 --- a/src/lib/features/metrics/sizes/largest-resources-read-model.test.ts +++ b/src/lib/features/metrics/sizes/largest-resources-read-model.test.ts @@ -6,6 +6,7 @@ import type { IFeatureToggleStore } from '../../feature-toggle/types/feature-tog import getLogger from '../../../../test/fixtures/no-logger.js'; import type { IFeatureStrategiesStore } from '../../feature-toggle/types/feature-toggle-strategies-store-type.js'; import type { IFeatureStrategy } from '../../../types/index.js'; +import { DEFAULT_ENV } from '../../../server-impl.js'; let db: ITestDb; let largestResourcesReadModel: ILargestResourcesReadModel; @@ -41,7 +42,7 @@ const createFeature = async (config: FeatureConfig) => { await featureStrategiesStore.createStrategyFeatureEnv({ strategyName: 'flexibleRollout', projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, featureName: config.featureName, constraints: config.constraints, parameters: config.parameters, diff --git a/src/lib/features/onboarding/onboarding-read-model.test.ts b/src/lib/features/onboarding/onboarding-read-model.test.ts index 6601684fea..9dbde45a1a 100644 --- a/src/lib/features/onboarding/onboarding-read-model.test.ts +++ b/src/lib/features/onboarding/onboarding-read-model.test.ts @@ -15,6 +15,7 @@ import { setupAppWithCustomConfig, } from '../../../test/e2e/helpers/test-helper.js'; import { ApiTokenType } from '../../types/model.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; let db: ITestDb; let onboardingReadModel: IOnboardingReadModel; @@ -167,7 +168,7 @@ test('can get project onboarding status', async () => { await lastSeenStore.setLastSeen([ { - environment: 'default', + environment: DEFAULT_ENV, featureName: 'my-flag', }, ]); @@ -188,7 +189,7 @@ test('archived feature counts as onboarded', async () => { await lastSeenStore.setLastSeen([ { - environment: 'default', + environment: DEFAULT_ENV, featureName: 'my-flag', }, ]); @@ -213,7 +214,7 @@ test('sdk register also onboards a project', async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); diff --git a/src/lib/features/playground/advanced-playground.test.ts b/src/lib/features/playground/advanced-playground.test.ts index 0aa16c8cea..f071337026 100644 --- a/src/lib/features/playground/advanced-playground.test.ts +++ b/src/lib/features/playground/advanced-playground.test.ts @@ -7,6 +7,7 @@ import dbInit, { } from '../../../test/e2e/helpers/database-init.js'; import getLogger from '../../../test/fixtures/no-logger.js'; import type { AdvancedPlaygroundResponseSchema } from '../../openapi/index.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -50,7 +51,7 @@ const createFeatureToggleWithStrategy = async ( await createFeatureToggle(featureName); return app.request .post( - `/api/admin/projects/default/features/${featureName}/environments/default/strategies`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/strategies`, ) .send(strategy) .expect(200); @@ -59,14 +60,14 @@ const createFeatureToggleWithStrategy = async ( const enableToggle = (featureName: string) => app.request .post( - `/api/admin/projects/default/features/${featureName}/environments/default/on`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/on`, ) .send({}) .expect(200); const disableToggle = (featureName: string) => app.request .post( - `/api/admin/projects/default/features/${featureName}/environments/default/off`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/off`, ) .send({}) .expect(200); @@ -85,7 +86,7 @@ test('advanced playground evaluation with no toggles', async () => { const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test', userId: '1,2', channel: 'web,mobile' }, }) @@ -94,7 +95,7 @@ test('advanced playground evaluation with no toggles', async () => { expect(result).toMatchObject({ input: { - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test', @@ -117,15 +118,15 @@ test('advanced playground evaluation with unsatisfied parent dependency', async const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test' }, }) .set('Content-Type', 'application/json') .expect(200); - const child = result.features[0].environments.default[0]; - const parent = result.features[1].environments.default[0]; + const child = result.features[0].environments[DEFAULT_ENV][0]; + const parent = result.features[1].environments[DEFAULT_ENV][0]; // child is disabled because of the parent expect(child.hasUnsatisfiedDependency).toBe(true); expect(child.isEnabled).toBe(false); @@ -154,15 +155,15 @@ test('advanced playground evaluation with satisfied disabled parent dependency', const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test' }, }) .set('Content-Type', 'application/json') .expect(200); - const child = result.features[0].environments.default[0]; - const parent = result.features[1].environments.default[0]; + const child = result.features[0].environments[DEFAULT_ENV][0]; + const parent = result.features[1].environments[DEFAULT_ENV][0]; expect(child.hasUnsatisfiedDependency).toBe(false); expect(child.isEnabled).toBe(true); @@ -177,7 +178,7 @@ test('advanced playground evaluation happy path', async () => { const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test', userId: '1,2', channel: 'web,mobile' }, }) @@ -186,7 +187,7 @@ test('advanced playground evaluation happy path', async () => { expect(result).toMatchObject({ input: { - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'test', @@ -199,7 +200,7 @@ test('advanced playground evaluation happy path', async () => { name: 'test-playground-feature', projectId: 'default', environments: { - default: [ + [DEFAULT_ENV]: [ { isEnabled: true, isEnabledInCurrentEnvironment: true, @@ -226,7 +227,7 @@ test('advanced playground evaluation happy path', async () => { enabled: false, }, name: 'test-playground-feature', - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'test', userId: '1', @@ -260,7 +261,7 @@ test('advanced playground evaluation happy path', async () => { enabled: false, }, name: 'test-playground-feature', - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'test', userId: '1', @@ -294,7 +295,7 @@ test('advanced playground evaluation happy path', async () => { enabled: false, }, name: 'test-playground-feature', - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'test', userId: '2', @@ -328,7 +329,7 @@ test('advanced playground evaluation happy path', async () => { enabled: false, }, name: 'test-playground-feature', - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'test', userId: '2', @@ -373,7 +374,7 @@ test('show matching variant from variants selection only for enabled toggles', a const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'playground', someProperty: '1,2,3,4,5' }, // generate 5 combinations }) @@ -381,13 +382,12 @@ test('show matching variant from variants selection only for enabled toggles', a .expect(200); const typedResult: AdvancedPlaygroundResponseSchema = result; - const enabledFeatures = typedResult.features[0].environments.default.filter( - (item) => item.isEnabled, - ); - const disabledFeatures = - typedResult.features[0].environments.default.filter( - (item) => !item.isEnabled, - ); + const enabledFeatures = typedResult.features[0].environments[ + DEFAULT_ENV + ].filter((item) => item.isEnabled); + const disabledFeatures = typedResult.features[0].environments[ + DEFAULT_ENV + ].filter((item) => !item.isEnabled); enabledFeatures.forEach((feature) => { expect(feature.variant?.name).toBe('a'); @@ -417,7 +417,7 @@ test('should return disabled strategies with unevaluated result', async () => { const { body: result } = await app.request .post('/api/admin/playground/advanced') .send({ - environments: ['default'], + environments: [DEFAULT_ENV], projects: ['default'], context: { appName: 'playground' }, }) @@ -432,7 +432,7 @@ test('should return disabled strategies with unevaluated result', async () => { ); expect( - feature?.environments.default[0].strategies.data[0].result + feature?.environments[DEFAULT_ENV][0].strategies.data[0].result .evaluationStatus, ).toBe('unevaluated'); }); diff --git a/src/lib/features/playground/offline-unleash-client.test.ts b/src/lib/features/playground/offline-unleash-client.test.ts index f8953a0cda..e9f4406352 100644 --- a/src/lib/features/playground/offline-unleash-client.test.ts +++ b/src/lib/features/playground/offline-unleash-client.test.ts @@ -10,6 +10,7 @@ import { } from 'unleash-client'; import { once } from 'events'; import { playgroundStrategyEvaluation } from '../../openapi/spec/playground-strategy-schema.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; export const offlineUnleashClientNode = async ({ features, @@ -54,7 +55,7 @@ describe('offline client', () => { stale: false, }, ], - context: { appName: 'other-app', environment: 'default' }, + context: { appName: 'other-app', environment: DEFAULT_ENV }, logError: console.log, }); @@ -108,7 +109,7 @@ describe('offline client', () => { stale: false, }, ], - context: { appName, environment: 'default' }, + context: { appName, environment: DEFAULT_ENV }, logError: console.log, }); diff --git a/src/lib/features/project-environments/environment-service.test.ts b/src/lib/features/project-environments/environment-service.test.ts index 5d35882ecb..6e64847c6f 100644 --- a/src/lib/features/project-environments/environment-service.test.ts +++ b/src/lib/features/project-environments/environment-service.test.ts @@ -13,6 +13,7 @@ import NameExistsError from '../../error/name-exists-error.js'; import type { EventService } from '../../services/index.js'; import { createEventsService } from '../events/createEventsService.js'; import { test, beforeAll, afterAll, expect } from 'vitest'; +import { DEFAULT_ENV } from '../../server-impl.js'; let stores: IUnleashStores; let db: ITestDb; let service: EnvironmentService; @@ -76,7 +77,7 @@ test('Can manage required approvals', async () => { const changeRequestEnvs = await db.stores.environmentStore.getChangeRequestEnvironments([ 'approval_env', - 'default', + DEFAULT_ENV, 'other', ]); @@ -345,7 +346,7 @@ test('When given overrides should remap projects to override environments', asyn }); test('Override works correctly when enabling default and disabling prod and dev', async () => { - const defaultEnvironment = 'default'; + const defaultEnvironment = DEFAULT_ENV; const prodEnvironment = 'production'; const devEnvironment = 'development'; diff --git a/src/lib/features/project-environments/project-environments.e2e.test.ts b/src/lib/features/project-environments/project-environments.e2e.test.ts index 9b1d1d0d1d..8ef35fc581 100644 --- a/src/lib/features/project-environments/project-environments.e2e.test.ts +++ b/src/lib/features/project-environments/project-environments.e2e.test.ts @@ -65,7 +65,7 @@ test('Should add environment to project', async () => { const environment = envs.find((env) => env.environment === 'test'); expect(environment).toBeDefined(); - expect(envs).toHaveLength(2); + expect(envs).toHaveLength(2); // test + default }); test('Should validate environment', async () => { @@ -113,7 +113,7 @@ test('Should add default strategy to environment', async () => { await app.request .post( - `/api/admin/projects/default/environments/default/default-strategy`, + `/api/admin/projects/default/environments/${DEFAULT_ENV}/default-strategy`, ) .send(defaultStrategy) .expect(200); @@ -123,14 +123,14 @@ test('Should add default strategy to environment', async () => { expect(envs).toHaveLength(1); expect(envs[0]).toStrictEqual({ - environment: 'default', + environment: DEFAULT_ENV, defaultStrategy, }); const { body } = await app.getRecordedEvents(); expect(body.events[0]).toMatchObject({ type: 'default-strategy-updated', project: 'default', - environment: 'default', + environment: DEFAULT_ENV, data: defaultStrategy, preData: null, }); @@ -139,7 +139,7 @@ test('Should add default strategy to environment', async () => { test('Should throw an error if you try to set defaultStrategy other than flexibleRollout', async () => { await app.request .post( - `/api/admin/projects/default/environments/default/default-strategy`, + `/api/admin/projects/default/environments/${DEFAULT_ENV}/default-strategy`, ) .send({ name: 'default', @@ -153,7 +153,7 @@ test('Add environment to project should return 404 when given a projectid that d await app.request .post(`/api/admin/projects/unknown/environments`) .send({ - environment: 'default', + environment: DEFAULT_ENV, }) .expect(404); }); diff --git a/src/lib/features/project-insights/project-insights-service.e2e.test.ts b/src/lib/features/project-insights/project-insights-service.e2e.test.ts index 23de94a5e2..6489a04ad5 100644 --- a/src/lib/features/project-insights/project-insights-service.e2e.test.ts +++ b/src/lib/features/project-insights/project-insights-service.e2e.test.ts @@ -116,7 +116,7 @@ test('should return average time to production per toggle', async () => { enabled: true, project: project.id, featureName: toggle.name, - environment: 'default', + environment: 'production', auditUser: TEST_AUDIT_USER, }), ); @@ -202,7 +202,7 @@ test('should return average time to production per toggle for a specific project enabled: true, project: project1.id, featureName: toggle.name, - environment: 'default', + environment: 'production', auditUser: TEST_AUDIT_USER, }), ); @@ -216,7 +216,7 @@ test('should return average time to production per toggle for a specific project enabled: true, project: project2.id, featureName: toggle.name, - environment: 'default', + environment: 'production', auditUser: TEST_AUDIT_USER, }), ); @@ -287,7 +287,7 @@ test('should return average time to production per toggle and include archived t enabled: true, project: project1.id, featureName: toggle.name, - environment: 'default', + environment: 'production', auditUser: TEST_AUDIT_USER, }), ); diff --git a/src/lib/features/project-status/projects-status.e2e.test.ts b/src/lib/features/project-status/projects-status.e2e.test.ts index 64743e13f5..a55fdd3417 100644 --- a/src/lib/features/project-status/projects-status.e2e.test.ts +++ b/src/lib/features/project-status/projects-status.e2e.test.ts @@ -15,7 +15,7 @@ import { import type { EventService } from '../../services/index.js'; import { createEventsService } from '../events/createEventsService.js'; import { createTestConfig } from '../../../test/config/test-config.js'; -import { randomId } from '../../util/index.js'; +import { DEFAULT_ENV, randomId } from '../../util/index.js'; import { ApiTokenType } from '../../types/model.js'; import { FEATURE_CREATED } from '../../events/index.js'; @@ -160,7 +160,7 @@ test('project resources should contain the right data', async () => { tokenName: 'test-token', projects: ['default'], type: ApiTokenType.CLIENT, - environment: 'default', + environment: DEFAULT_ENV, }); await app.services.segmentService.create( diff --git a/src/lib/features/project/project-applications.e2e.test.ts b/src/lib/features/project/project-applications.e2e.test.ts index 1da681b21b..da59b545c0 100644 --- a/src/lib/features/project/project-applications.e2e.test.ts +++ b/src/lib/features/project/project-applications.e2e.test.ts @@ -6,6 +6,7 @@ import { setupAppWithCustomConfig, } from '../../../test/e2e/helpers/test-helper.js'; import getLogger from '../../../test/fixtures/no-logger.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; import { ApiTokenType, type IApiToken } from '../../types/model.js'; @@ -49,7 +50,7 @@ beforeAll(async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); }); @@ -94,7 +95,7 @@ test('should return applications', async () => { expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'appName', sdks: [ @@ -136,7 +137,7 @@ test('should return applications if sdk was not in database', async () => { expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'appName', sdks: [], @@ -174,7 +175,7 @@ test('should return application without version if sdk has just name', async () expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'appName', sdks: [ @@ -235,7 +236,7 @@ test('should sort by appName descending', async () => { expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'second-app', sdks: [ @@ -246,7 +247,7 @@ test('should sort by appName descending', async () => { ], }, { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'appName', sdks: [ @@ -307,7 +308,7 @@ test('should filter by sdk', async () => { expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'appName', sdks: [ @@ -376,7 +377,7 @@ test('should show correct number of total', async () => { expect(body).toMatchObject({ applications: [ { - environments: ['default'], + environments: [DEFAULT_ENV], instances: ['instanceId'], name: 'second-app', sdks: [ diff --git a/src/lib/features/project/project-service.e2e.test.ts b/src/lib/features/project/project-service.e2e.test.ts index 58a2a0462e..10dde7c027 100644 --- a/src/lib/features/project/project-service.e2e.test.ts +++ b/src/lib/features/project/project-service.e2e.test.ts @@ -22,7 +22,6 @@ import { } from '../index.js'; import { type IAuditUser, - type IGroup, type IUnleashStores, type IUser, SYSTEM_USER_AUDIT, @@ -30,18 +29,11 @@ import { TEST_AUDIT_USER, } from '../../types/index.js'; import { BadDataError, InvalidOperationError } from '../../error/index.js'; -import { DEFAULT_ENV, extractAuditInfoFromUser } from '../../util/index.js'; +import { extractAuditInfoFromUser } from '../../util/index.js'; import { ApiTokenType } from '../../types/model.js'; import { createApiTokenService } from '../api-tokens/createApiTokenService.js'; import type User from '../../types/user.js'; -import { - beforeAll, - expect, - test, - beforeEach, - afterEach, - afterAll, -} from 'vitest'; +import { beforeAll, expect, test, beforeEach, afterAll } from 'vitest'; let stores: IUnleashStores; let db: ITestDb; @@ -55,7 +47,6 @@ let auditUser: IAuditUser; let apiTokenService: ApiTokenService; let opsUser: IUser; -let group: IGroup; const isProjectUser = async ( userId: number, @@ -80,10 +71,6 @@ beforeAll(async () => { username: user.email, ip: '127.0.0.1', }; - group = await stores.groupStore.create({ - name: 'aTestGroup', - description: '', - }); opsUser = await stores.userStore.insert({ name: 'Test user', email: 'test@example.com', @@ -101,29 +88,31 @@ beforeAll(async () => { environmentService = new EnvironmentService(stores, config, eventService); projectService = createProjectService(db.rawDatabase, config); apiTokenService = createApiTokenService(db.rawDatabase, config); + // await stores.environmentStore.updateProperty(DEFAULT_ENV, 'enabled', false); + // await stores.environmentStore.updateProperty( + // 'production', + // 'enabled', + // false, + // ); }); beforeEach(async () => { - await stores.accessStore.addUserToRole(opsUser.id, 1, ''); -}); - -afterAll(async () => { - await db.destroy(); -}); - -afterEach(async () => { const envs = await stores.environmentStore.getAll(); - const deleteEnvs = envs - .filter((env) => env.name !== 'default') - .map(async (env) => { - await stores.environmentStore.delete(env.name); - }); + const deleteEnvs = envs.map(async (env) => { + await stores.environmentStore.delete(env.name); + }); + await Promise.allSettled(deleteEnvs); + const users = await stores.userStore.getAll(); const wipeUserPermissions = users.map(async (u) => { await stores.accessStore.unlinkUserRoles(u.id); }); await stores.eventStore.deleteAll(); - await Promise.allSettled(deleteEnvs); await Promise.allSettled(wipeUserPermissions); + await stores.accessStore.addUserToRole(opsUser.id, 1, ''); +}); + +afterAll(async () => { + await db.destroy(); }); test('should have default project', async () => { @@ -1850,6 +1839,11 @@ const updateFeature = async (featureName: string, update: any) => { }; test('should calculate average time to production', async () => { + await stores.environmentStore.create({ + name: 'prod-env', + type: 'production', + enabled: true, + }); const project = { id: 'average-time-to-prod', name: 'average-time-to-prod', @@ -1884,7 +1878,7 @@ test('should calculate average time to production', async () => { enabled: true, project: project.id, featureName: flag.name, - environment: 'default', + environment: 'prod-env', auditUser, }), ); @@ -1908,6 +1902,11 @@ test('should calculate average time to production', async () => { }); test('should calculate average time to production ignoring some items', async () => { + await stores.environmentStore.create({ + name: 'prod-env', + type: 'production', + enabled: true, + }); const project = { id: 'average-time-to-prod-corner-cases', name: 'average-time-to-prod', @@ -1918,7 +1917,7 @@ test('should calculate average time to production ignoring some items', async () enabled: true, project: project.id, featureName, - environment: 'default', + environment: 'prod-env', auditUser, tags: [], }); @@ -2125,222 +2124,6 @@ test('should get correct amount of project members for current and past window', expect(result.updates.projectActivityPastWindow).toBe(0); }); -test('should return average time to production per flag', async () => { - const project = { - id: 'average-time-to-prod-per-flag', - name: 'average-time-to-prod-per-flag', - mode: 'open' as const, - defaultStickiness: 'clientId', - }; - - await projectService.createProject(project, user, auditUser); - - const flags = [ - { name: 'average-prod-time-pt', subdays: 7 }, - { name: 'average-prod-time-pt-2', subdays: 14 }, - { name: 'average-prod-time-pt-3', subdays: 40 }, - { name: 'average-prod-time-pt-4', subdays: 15 }, - { name: 'average-prod-time-pt-5', subdays: 2 }, - ]; - - const featureFlags = await Promise.all( - flags.map((flag) => { - return featureToggleService.createFeatureToggle( - project.id, - flag, - auditUser, - ); - }), - ); - - await Promise.all( - featureFlags.map((flag) => { - return eventService.storeEvent( - new FeatureEnvironmentEvent({ - enabled: true, - project: project.id, - featureName: flag.name, - environment: 'default', - auditUser, - }), - ); - }), - ); - - await Promise.all( - flags.map((flag) => - updateFeature(flag.name, { - created_at: subDays(new Date(), flag.subdays), - }), - ), - ); - - const result = await projectService.getDoraMetrics(project.id); - - expect(result.features).toHaveLength(5); - expect(result.features[0].timeToProduction).toBeTruthy(); - expect(result.projectAverage).toBeTruthy(); -}); - -test('should return average time to production per flag for a specific project', async () => { - const project1 = { - id: 'average-time-to-prod-per-flag-1', - name: 'Project 1', - mode: 'open' as const, - defaultStickiness: 'clientId', - }; - - const project2 = { - id: 'average-time-to-prod-per-flag-2', - name: 'Project 2', - mode: 'open' as const, - defaultStickiness: 'clientId', - }; - - await projectService.createProject(project1, user, auditUser); - await projectService.createProject(project2, user, auditUser); - - const flagsProject1 = [ - { name: 'average-prod-time-pt-10', subdays: 7 }, - { name: 'average-prod-time-pt-11', subdays: 14 }, - { name: 'average-prod-time-pt-12', subdays: 40 }, - ]; - - const flagsProject2 = [ - { name: 'average-prod-time-pt-13', subdays: 15 }, - { name: 'average-prod-time-pt-14', subdays: 2 }, - ]; - - const featureFlagsProject1 = await Promise.all( - flagsProject1.map((flag) => { - return featureToggleService.createFeatureToggle( - project1.id, - flag, - auditUser, - ); - }), - ); - - const featureFlagsProject2 = await Promise.all( - flagsProject2.map((flag) => { - return featureToggleService.createFeatureToggle( - project2.id, - flag, - auditUser, - ); - }), - ); - - await Promise.all( - featureFlagsProject1.map((flag) => { - return eventService.storeEvent( - new FeatureEnvironmentEvent({ - enabled: true, - project: project1.id, - featureName: flag.name, - environment: 'default', - auditUser, - }), - ); - }), - ); - - await Promise.all( - featureFlagsProject2.map((flag) => { - return eventService.storeEvent( - new FeatureEnvironmentEvent({ - enabled: true, - project: project2.id, - featureName: flag.name, - environment: 'default', - auditUser, - }), - ); - }), - ); - - await Promise.all( - flagsProject1.map((flag) => - updateFeature(flag.name, { - created_at: subDays(new Date(), flag.subdays), - }), - ), - ); - - await Promise.all( - flagsProject2.map((flag) => - updateFeature(flag.name, { - created_at: subDays(new Date(), flag.subdays), - }), - ), - ); - - const resultProject1 = await projectService.getDoraMetrics(project1.id); - const resultProject2 = await projectService.getDoraMetrics(project2.id); - - expect(resultProject1.features).toHaveLength(3); - expect(resultProject2.features).toHaveLength(2); -}); - -test('should return average time to production per flag and include archived flags', async () => { - const project1 = { - id: 'average-time-to-prod-per-flag-12', - name: 'Project 1', - mode: 'open' as const, - defaultStickiness: 'clientId', - }; - - await projectService.createProject(project1, user, auditUser); - - const flagsProject1 = [ - { name: 'average-prod-time-pta-10', subdays: 7 }, - { name: 'average-prod-time-pta-11', subdays: 14 }, - { name: 'average-prod-time-pta-12', subdays: 40 }, - ]; - - const featureFlagsProject1 = await Promise.all( - flagsProject1.map((flag) => { - return featureToggleService.createFeatureToggle( - project1.id, - flag, - auditUser, - ); - }), - ); - - await Promise.all( - featureFlagsProject1.map((flag) => { - return eventService.storeEvent( - new FeatureEnvironmentEvent({ - enabled: true, - project: project1.id, - featureName: flag.name, - environment: 'default', - auditUser, - }), - ); - }), - ); - - await Promise.all( - flagsProject1.map((flag) => - updateFeature(flag.name, { - created_at: subDays(new Date(), flag.subdays), - }), - ), - ); - - await featureToggleService.archiveToggle( - 'average-prod-time-pta-12', - user, - auditUser, - ); - - const resultProject1 = await projectService.getDoraMetrics(project1.id); - - expect(resultProject1.features).toHaveLength(3); -}); - describe('feature flag naming patterns', () => { test(`should clear existing example and description if the payload doesn't contain them`, async () => { const featureNaming = { @@ -2424,6 +2207,11 @@ test('deleting a project with archived flags should result in any remaining arch }); test('should also delete api tokens that were only bound to deleted project', async () => { + await stores.environmentStore.create({ + name: 'prod-env', + type: 'production', + enabled: true, + }); const project = 'some'; const tokenName = 'test'; @@ -2439,7 +2227,7 @@ test('should also delete api tokens that were only bound to deleted project', as const token = await apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, tokenName, - environment: DEFAULT_ENV, + environment: 'prod-env', projects: [project], }); @@ -2449,6 +2237,11 @@ test('should also delete api tokens that were only bound to deleted project', as }); test('should not delete project-bound api tokens still bound to project', async () => { + await stores.environmentStore.create({ + name: 'prod-env', + type: 'production', + enabled: true, + }); const project1 = 'token-deleted-project'; const project2 = 'token-not-deleted-project'; const tokenName = 'test'; @@ -2474,7 +2267,7 @@ test('should not delete project-bound api tokens still bound to project', async const token = await apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, tokenName, - environment: DEFAULT_ENV, + environment: 'prod-env', projects: [project1, project2], }); @@ -2485,6 +2278,11 @@ test('should not delete project-bound api tokens still bound to project', async }); test('should delete project-bound api tokens when all projects they belong to are deleted', async () => { + await stores.environmentStore.create({ + name: 'prod-env', + type: 'production', + enabled: true, + }); const project1 = 'token-deleted-project-1'; const project2 = 'token-deleted-project-2'; const tokenName = 'test'; @@ -2510,7 +2308,7 @@ test('should delete project-bound api tokens when all projects they belong to ar const token = await apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, tokenName, - environment: DEFAULT_ENV, + environment: 'prod-env', projects: [project1, project2], }); diff --git a/src/lib/features/segment/admin-segment.e2e.test.ts b/src/lib/features/segment/admin-segment.e2e.test.ts index 72b93ffb74..80c9832492 100644 --- a/src/lib/features/segment/admin-segment.e2e.test.ts +++ b/src/lib/features/segment/admin-segment.e2e.test.ts @@ -15,6 +15,7 @@ import { } from '../../../test/e2e/helpers/test-helper.js'; import type { StrategiesUsingSegment } from './segment-service-interface.js'; import type { IFeatureOverview, IUser } from '../../types/index.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -23,7 +24,7 @@ const SEGMENTS_BASE_PATH = '/api/admin/segments'; const FEATURES_LIST_BASE_PATH = '/api/admin/projects/default/features'; const getFeatureStrategiesPath = (featureName: string) => { - return `/api/admin/projects/default/features/${featureName}/environments/default/strategies`; + return `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/strategies`; }; // Recursively change all Date properties to string properties. @@ -87,7 +88,7 @@ const addSegmentsToStrategy = ( strategyId, segmentIds, projectId: 'default', - environmentId: 'default', + environmentId: DEFAULT_ENV, additional: 'property', }) .expect(expectStatusCode); @@ -182,7 +183,7 @@ test('should fail on missing properties', async () => { .set('Content-type', 'application/json') .send({ projectId: 'default', - environmentId: 'default', + environmentId: DEFAULT_ENV, additional: 'property', }); @@ -291,7 +292,7 @@ test('should not delete segments used by strategies', async () => { await addStrategyToFeatureEnv( app, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); const [feature] = await fetchFeatures(); @@ -320,7 +321,7 @@ test('should delete segments used by strategies in archived feature flags', asyn await addStrategyToFeatureEnv( app, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); const [feature] = await fetchFeatures(); @@ -362,19 +363,19 @@ test('should list strategies by segment', async () => { await addStrategyToFeatureEnv( app, { ...flag1.strategies[0] }, - 'default', + DEFAULT_ENV, flag1.name, ); await addStrategyToFeatureEnv( app, { ...flag1.strategies[0] }, - 'default', + DEFAULT_ENV, flag2.name, ); await addStrategyToFeatureEnv( app, { ...flag3.strategies[0] }, - 'default', + DEFAULT_ENV, flag3.name, ); @@ -442,19 +443,19 @@ test('should list segments by strategy', async () => { await addStrategyToFeatureEnv( app, { ...flag1.strategies[0] }, - 'default', + DEFAULT_ENV, flag1.name, ); await addStrategyToFeatureEnv( app, { ...flag1.strategies[0] }, - 'default', + DEFAULT_ENV, flag2.name, ); await addStrategyToFeatureEnv( app, { ...flag3.strategies[0] }, - 'default', + DEFAULT_ENV, flag3.name, ); @@ -594,7 +595,7 @@ test('Should show usage in features and projects', async () => { await addStrategyToFeatureEnv( app, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); const [feature] = await fetchFeatures(); @@ -673,7 +674,7 @@ describe('detect strategy usage in change requests', () => { await db.rawDatabase.table('change_requests').insert({ id: CR_ID, - environment: 'default', + environment: DEFAULT_ENV, state: 'In review', project: 'default', created_by: user.id, @@ -770,7 +771,7 @@ describe('detect strategy usage in change requests', () => { expect(changeRequestStrategies).toMatchObject([ { - environment: 'default', + environment: DEFAULT_ENV, featureName: flag.name, projectId: 'default', strategyName: 'flexibleRollout', @@ -797,7 +798,7 @@ describe('detect strategy usage in change requests', () => { await addStrategyToFeatureEnv( enterpriseApp, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); @@ -857,7 +858,7 @@ describe('detect strategy usage in change requests', () => { await addStrategyToFeatureEnv( enterpriseApp, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); @@ -958,7 +959,7 @@ describe('detect strategy usage in change requests', () => { await addStrategyToFeatureEnv( enterpriseApp, { ...flag.strategies[0] }, - 'default', + DEFAULT_ENV, flag.name, ); diff --git a/src/lib/features/segment/client-segment.e2e.test.ts b/src/lib/features/segment/client-segment.e2e.test.ts index fce8e220ae..79611b94c6 100644 --- a/src/lib/features/segment/client-segment.e2e.test.ts +++ b/src/lib/features/segment/client-segment.e2e.test.ts @@ -46,7 +46,7 @@ const fetchFeatures = (): Promise => { }; const getFeatureStrategiesPath = (featureName: string) => { - return `/api/admin/projects/default/features/${featureName}/environments/default/strategies`; + return `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/strategies`; }; const fetchFeatureStrategies = (featureName: string) => diff --git a/src/lib/features/segment/segment-store.test.ts b/src/lib/features/segment/segment-store.test.ts index 45fe73f22e..ae6896cde0 100644 --- a/src/lib/features/segment/segment-store.test.ts +++ b/src/lib/features/segment/segment-store.test.ts @@ -9,6 +9,7 @@ import { type IUser, TEST_AUDIT_USER, } from '../../types/index.js'; +import { DEFAULT_ENV } from '../../server-impl.js'; let stores: IUnleashStores; let db: ITestDb; @@ -78,7 +79,7 @@ describe('usage counting', () => { await db.rawDatabase.table('change_requests').insert({ id: CR_ID, - environment: 'default', + environment: DEFAULT_ENV, state: 'In Review', project: 'default', created_by: user.id, @@ -174,7 +175,7 @@ describe('usage counting', () => { await stores.featureStrategiesStore.createStrategyFeatureEnv({ featureName: flag.name, projectId: 'default', - environment: 'default', + environment: DEFAULT_ENV, strategyName: 'flexibleRollout', segments: [segment1.id], parameters: { @@ -187,7 +188,7 @@ describe('usage counting', () => { await db.rawDatabase.table('change_requests').insert({ id: CR_ID, - environment: 'default', + environment: DEFAULT_ENV, state: 'In Review', project: 'default', created_by: user.id, diff --git a/src/lib/metrics.test.ts b/src/lib/metrics.test.ts index cbd4897a9d..edf99ae52a 100644 --- a/src/lib/metrics.test.ts +++ b/src/lib/metrics.test.ts @@ -89,19 +89,6 @@ beforeAll(async () => { eventBus, ); - const metricsDbConf = { - client: { - pool: { - min: 0, - max: 4, - numUsed: () => 2, - numFree: () => 2, - numPendingAcquires: () => 0, - numPendingCreates: () => 1, - }, - }, - }; - const { collectAggDbMetrics, collectStaticCounters } = registerPrometheusMetrics( config, diff --git a/src/lib/schema/api-token-schema.test.ts b/src/lib/schema/api-token-schema.test.ts index c05537374a..22c8eb4488 100644 --- a/src/lib/schema/api-token-schema.test.ts +++ b/src/lib/schema/api-token-schema.test.ts @@ -1,3 +1,4 @@ +import { DEFAULT_ENV } from '../server-impl.js'; import { ALL } from '../types/models/api-token.js'; import { createApiToken } from './api-token-schema.js'; @@ -51,10 +52,10 @@ test('should allow for embedded proxy (frontend) key', async () => { expect(token.error).toBeUndefined(); }); -test('should set environment to default for frontend key', async () => { +test('should set environment to default environment for frontend key', async () => { const token = await createApiToken.validateAsync({ tokenName: 'test', type: 'frontend', }); - expect(token.environment).toEqual('default'); + expect(token.environment).toEqual(DEFAULT_ENV); }); diff --git a/src/lib/services/api-token-service.test.ts b/src/lib/services/api-token-service.test.ts index bba25794e1..fe74b35929 100644 --- a/src/lib/services/api-token-service.test.ts +++ b/src/lib/services/api-token-service.test.ts @@ -7,7 +7,7 @@ import { TEST_AUDIT_USER, } from '../types/index.js'; import { addDays, minutesToMilliseconds, subDays } from 'date-fns'; -import { extractAuditInfoFromUser } from '../util/index.js'; +import { DEFAULT_ENV, extractAuditInfoFromUser } from '../util/index.js'; import { createFakeApiTokenService } from '../features/api-tokens/createApiTokenService.js'; import { API_TOKEN_CREATED, @@ -50,7 +50,7 @@ test('Should init api token', async () => { test("Shouldn't return frontend token when secret is undefined", async () => { const token: IApiTokenCreate = { - environment: 'default', + environment: DEFAULT_ENV, projects: ['*'], secret: '*:*:some-random-string', type: ApiTokenType.FRONTEND, @@ -62,7 +62,7 @@ test("Shouldn't return frontend token when secret is undefined", async () => { const { environmentStore, apiTokenService } = createFakeApiTokenService(config); await environmentStore.create({ - name: 'default', + name: DEFAULT_ENV, enabled: true, type: 'test', sortOrder: 1, @@ -76,7 +76,7 @@ test("Shouldn't return frontend token when secret is undefined", async () => { test('Api token operations should all have events attached', async () => { const token: IApiTokenCreate = { - environment: 'default', + environment: DEFAULT_ENV, projects: ['*'], secret: '*:*:some-random-string', type: ApiTokenType.FRONTEND, @@ -89,7 +89,7 @@ test('Api token operations should all have events attached', async () => { const { environmentStore, apiTokenService, eventService } = createFakeApiTokenService(config); await environmentStore.create({ - name: 'default', + name: DEFAULT_ENV, enabled: true, type: 'test', sortOrder: 1, @@ -150,7 +150,7 @@ test('getUserForToken should get a user with admin token user id and token name' describe('API token getTokenWithCache', () => { const token: IApiTokenCreate = { - environment: 'default', + environment: DEFAULT_ENV, projects: ['*'], secret: '*:*:some-random-string', type: ApiTokenType.CLIENT, @@ -228,7 +228,7 @@ test('normalizes api token type casing to lowercase', async () => { createFakeApiTokenService(config); await environmentStore.create({ - name: 'default', + name: DEFAULT_ENV, enabled: true, type: 'test', sortOrder: 1, @@ -238,7 +238,7 @@ test('normalizes api token type casing to lowercase', async () => { await apiTokenService.createApiTokenWithProjects( { - environment: 'default', + environment: DEFAULT_ENV, // @ts-ignore type: 'CLIENT', projects: [], @@ -249,7 +249,7 @@ test('normalizes api token type casing to lowercase', async () => { await apiTokenService.createApiTokenWithProjects( { - environment: 'default', + environment: DEFAULT_ENV, // @ts-ignore type: 'client', projects: [], diff --git a/src/test/e2e/api/admin/api-token.e2e.test.ts b/src/test/e2e/api/admin/api-token.e2e.test.ts index 7908ddbe0a..11d1eba01f 100644 --- a/src/test/e2e/api/admin/api-token.e2e.test.ts +++ b/src/test/e2e/api/admin/api-token.e2e.test.ts @@ -200,7 +200,9 @@ test('should prefix default token with "*:*."', async () => { .set('Content-Type', 'application/json') .expect(201) .expect((res) => { - expect(res.body.secret).toMatch(/\*:default\..*/); + expect(res.body.secret).toMatch( + new RegExp(`\\*:${DEFAULT_ENV}\\..*`), + ); }); }); @@ -216,7 +218,9 @@ test('should prefix token with "project:environment."', async () => { .set('Content-Type', 'application/json') .expect(201) .expect((res) => { - expect(res.body.secret).toMatch(/default:default\..*/); + expect(res.body.secret).toMatch( + new RegExp(`default:${DEFAULT_ENV}\\..*`), + ); }); }); diff --git a/src/test/e2e/api/admin/applications.e2e.test.ts b/src/test/e2e/api/admin/applications.e2e.test.ts index 2f32f7a026..78e34a38da 100644 --- a/src/test/e2e/api/admin/applications.e2e.test.ts +++ b/src/test/e2e/api/admin/applications.e2e.test.ts @@ -5,6 +5,7 @@ import { } from '../../helpers/test-helper.js'; import getLogger from '../../../fixtures/no-logger.js'; import { ApiTokenType, type IApiToken } from '../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -65,7 +66,7 @@ beforeAll(async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); @@ -73,16 +74,17 @@ beforeAll(async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.FRONTEND, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); }); -afterEach(async () => { +beforeEach(async () => { await Promise.all([ db.stores.clientMetricsStoreV2.deleteAll(), db.stores.clientInstanceStore.deleteAll(), db.stores.featureToggleStore.deleteAll(), + db.stores.clientApplicationsStore.deleteAll(), ]); }); @@ -134,7 +136,7 @@ test('should show correct application metrics', async () => { environments: [ { instanceCount: 2, - name: 'default', + name: DEFAULT_ENV, frontendSdks: [], backendSdks: [ 'unleash-client-node:3.2.1', @@ -153,7 +155,7 @@ test('should show correct application metrics', async () => { const { body: instancesBody } = await app.request .get( - `/api/admin/metrics/instances/${metrics.appName}/environment/default`, + `/api/admin/metrics/instances/${metrics.appName}/environment/${DEFAULT_ENV}`, ) .expect(200); @@ -198,7 +200,7 @@ test('should report frontend application instances', async () => { const { body } = await app.request .get( - `/api/admin/metrics/instances/${metrics.appName}/environment/default`, + `/api/admin/metrics/instances/${metrics.appName}/environment/${DEFAULT_ENV}`, ) .expect(200); @@ -243,7 +245,7 @@ test('should show missing features and strategies', async () => { environments: [ { instanceCount: 1, - name: 'default', + name: DEFAULT_ENV, sdks: ['unleash-client-node:1.0.0'], issues: { missingFeatures: ['toggle-name-2', 'toggle-name-3'], @@ -296,7 +298,7 @@ test('should not return instances older than 24h', async () => { const { body: instancesBody } = await app.request .get( - `/api/admin/metrics/instances/${metrics.appName}/environment/default`, + `/api/admin/metrics/instances/${metrics.appName}/environment/${DEFAULT_ENV}`, ) .expect(200); diff --git a/src/test/e2e/api/admin/context.e2e.test.ts b/src/test/e2e/api/admin/context.e2e.test.ts index 37a4072368..de942a513d 100644 --- a/src/test/e2e/api/admin/context.e2e.test.ts +++ b/src/test/e2e/api/admin/context.e2e.test.ts @@ -5,6 +5,7 @@ import { setupAppWithCustomConfig, } from '../../helpers/test-helper.js'; import getLogger from '../../../fixtures/no-logger.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let db: ITestDb; let app: IUnleashTest; @@ -194,7 +195,7 @@ test('should not delete a context field that is in use by active flags', async ( .expect(201); await app.request .post( - `/api/admin/projects/default/features/${feature}/environments/default/strategies`, + `/api/admin/projects/default/features/${feature}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'default', @@ -297,7 +298,7 @@ test('should show context field usage for active flags', async () => { .expect(201); await app.request .post( - `/api/admin/projects/default/features/${feature}/environments/default/strategies`, + `/api/admin/projects/default/features/${feature}/environments/${DEFAULT_ENV}/strategies`, ) .send({ name: 'default', @@ -327,7 +328,9 @@ test('should show context field usage for active flags', async () => { expect(body.strategies).toHaveLength(1); expect(body).toMatchObject({ - strategies: [{ environment: 'default', featureName: 'contextFeature' }], + strategies: [ + { environment: DEFAULT_ENV, featureName: 'contextFeature' }, + ], }); const { body: getAllBody } = await app.request 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 865e038155..d9d537840d 100644 --- a/src/test/e2e/api/admin/instance-admin.e2e.test.ts +++ b/src/test/e2e/api/admin/instance-admin.e2e.test.ts @@ -7,6 +7,7 @@ import getLogger from '../../../fixtures/no-logger.js'; import type { IUnleashStores } from '../../../../lib/types/index.js'; import { ApiTokenType } from '../../../../lib/types/model.js'; import { registerPrometheusMetrics } from '../../../../lib/metrics.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -73,13 +74,13 @@ test('api tokens are serialized correctly', async () => { await app.services.apiTokenService.createApiTokenWithProjects({ tokenName: 'frontend', type: ApiTokenType.FRONTEND, - environment: 'default', + environment: DEFAULT_ENV, projects: ['*'], }); await app.services.apiTokenService.createApiTokenWithProjects({ tokenName: 'client', type: ApiTokenType.CLIENT, - environment: 'default', + environment: DEFAULT_ENV, projects: ['*'], }); diff --git a/src/test/e2e/api/admin/metrics.e2e.test.ts b/src/test/e2e/api/admin/metrics.e2e.test.ts index e1fa367996..92779d2b35 100644 --- a/src/test/e2e/api/admin/metrics.e2e.test.ts +++ b/src/test/e2e/api/admin/metrics.e2e.test.ts @@ -5,6 +5,7 @@ import { } from '../../helpers/test-helper.js'; import getLogger from '../../../fixtures/no-logger.js'; import { ApiTokenType } from '../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -156,7 +157,7 @@ test('should save multiple projects from token', async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default', 'mainProject'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); @@ -184,11 +185,11 @@ test('should save multiple projects from token', async () => { appName: 'multi-project-app', usage: [ { - environments: ['default'], + environments: [DEFAULT_ENV], project: 'default', }, { - environments: ['default'], + environments: [DEFAULT_ENV], project: 'mainProject', }, ], diff --git a/src/test/e2e/api/admin/playground.e2e.test.ts b/src/test/e2e/api/admin/playground.e2e.test.ts index e2de166a61..b50e7d43f1 100644 --- a/src/test/e2e/api/admin/playground.e2e.test.ts +++ b/src/test/e2e/api/admin/playground.e2e.test.ts @@ -14,6 +14,7 @@ import type { PlaygroundFeatureSchema } from '../../../../lib/openapi/spec/playg import type { ClientFeatureSchema } from '../../../../lib/openapi/spec/client-feature-schema.js'; import type { PlaygroundResponseSchema } from '../../../../lib/openapi/spec/playground-response-schema.js'; import type { PlaygroundRequestSchema } from '../../../../lib/openapi/spec/playground-request-schema.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -240,7 +241,7 @@ describe('Playground API E2E', () => { token.secret, { projects: ALL, - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'playground-test', }, @@ -287,14 +288,14 @@ describe('Playground API E2E', () => { clientFeatures(), fc.context(), async (features, ctx) => { - await seedDatabase(db, features, 'default'); + await seedDatabase(db, features, DEFAULT_ENV); const body = await playgroundRequest( app, token.secret, { projects: ALL, - environment: 'default', + environment: DEFAULT_ENV, context: { appName: 'playground-test', }, @@ -372,7 +373,7 @@ describe('Playground API E2E', () => { // one of the above values context: { appName: generatedAppName, - environment: 'default', + environment: DEFAULT_ENV, }, })), constrainedFeatures(), diff --git a/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts b/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts index 59051fdd7a..ccddb65f1f 100644 --- a/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts +++ b/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts @@ -5,6 +5,7 @@ import { } from '../../../helpers/test-helper.js'; import getLogger from '../../../../fixtures/no-logger.js'; import { ApiTokenType } from '../../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -50,7 +51,7 @@ test('Returns list of tokens', async () => { tokenName: 'test', secret: tokenSecret, type: ApiTokenType.CLIENT, - environment: 'default', + environment: DEFAULT_ENV, projects: ['default'], }); return app.request @@ -80,7 +81,7 @@ test('fails to create new client token when given wrong project', async () => { tokenName: 'default-client', type: 'client', projects: ['wrong'], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(404); @@ -93,7 +94,7 @@ test('creates new client token', async () => { tokenName: 'default-client', type: 'client', projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, }) .set('Content-Type', 'application/json') .expect(201) @@ -109,7 +110,7 @@ test('Deletes existing tokens', async () => { tokenName: 'test', secret: tokenSecret, type: ApiTokenType.CLIENT, - environment: 'default', + environment: DEFAULT_ENV, projects: ['default'], }); @@ -142,7 +143,7 @@ test('Returns Bad Request when deleting tokens with more than one project', asyn tokenName: 'test', secret: tokenSecret, type: ApiTokenType.CLIENT, - environment: 'default', + environment: DEFAULT_ENV, projects: ['default', 'other'], }); diff --git a/src/test/e2e/api/admin/project/variants-sunset.e2e.test.ts b/src/test/e2e/api/admin/project/variants-sunset.e2e.test.ts index eed3a5c28b..a25f7232a5 100644 --- a/src/test/e2e/api/admin/project/variants-sunset.e2e.test.ts +++ b/src/test/e2e/api/admin/project/variants-sunset.e2e.test.ts @@ -5,6 +5,7 @@ import { import dbInit, { type ITestDb } from '../../../helpers/database-init.js'; import getLogger from '../../../../fixtures/no-logger.js'; import { WeightType } from '../../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -86,7 +87,7 @@ test('Can add environment variants when existing ones exist for this feature', a ); await db.stores.featureEnvironmentStore.addVariantsToFeatureEnvironment( featureName, - 'default', + DEFAULT_ENV, [ { name: 'existing-variant', diff --git a/src/test/e2e/api/admin/project/variants.e2e.test.ts b/src/test/e2e/api/admin/project/variants.e2e.test.ts index ed71cda1ff..24125e91f7 100644 --- a/src/test/e2e/api/admin/project/variants.e2e.test.ts +++ b/src/test/e2e/api/admin/project/variants.e2e.test.ts @@ -6,6 +6,7 @@ import dbInit, { type ITestDb } from '../../../helpers/database-init.js'; import getLogger from '../../../../fixtures/no-logger.js'; import * as jsonpatch from 'fast-json-patch/index.mjs'; import { type IVariant, WeightType } from '../../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -40,12 +41,12 @@ test('Can get variants for a feature', async () => { }); await db.stores.featureEnvironmentStore.addEnvironmentToFeature( featureName, - 'default', + DEFAULT_ENV, true, ); await db.stores.featureEnvironmentStore.addVariantsToFeatureEnvironment( featureName, - 'default', + DEFAULT_ENV, [ { name: variantName, @@ -57,7 +58,7 @@ test('Can get variants for a feature', async () => { ); await app.request .get( - `/api/admin/projects/default/features/${featureName}/environments/default/variants`, + `/api/admin/projects/default/features/${featureName}/environments/${DEFAULT_ENV}/variants`, ) .expect(200) .expect((res) => { diff --git a/src/test/e2e/api/auth/leading-slashes-are-stripped.e2e.test.ts b/src/test/e2e/api/auth/leading-slashes-are-stripped.e2e.test.ts index e13427982c..768f23eca2 100644 --- a/src/test/e2e/api/auth/leading-slashes-are-stripped.e2e.test.ts +++ b/src/test/e2e/api/auth/leading-slashes-are-stripped.e2e.test.ts @@ -6,6 +6,7 @@ import { } from '../../helpers/test-helper.js'; import { IAuthType, type IUnleashStores } from '../../../../lib/types/index.js'; import { ApiTokenType } from '../../../../lib/types/model.js'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let appWithBaseUrl: IUnleashTest; @@ -63,7 +64,7 @@ test('multiple slashes after base path is also rejected with 404', async () => { test('Access with API token is granted', async () => { const token = await app.services.apiTokenService.createApiTokenWithProjects( { - environment: 'default', + environment: DEFAULT_ENV, projects: ['default'], tokenName: 'test', type: ApiTokenType.CLIENT, diff --git a/src/test/e2e/api/client/feature.env.disabled.e2e.test.ts b/src/test/e2e/api/client/feature.env.disabled.e2e.test.ts index 72abdb6d2a..816f689b11 100644 --- a/src/test/e2e/api/client/feature.env.disabled.e2e.test.ts +++ b/src/test/e2e/api/client/feature.env.disabled.e2e.test.ts @@ -46,7 +46,7 @@ test('returns feature flag for default env', async () => { await app.services.featureToggleService.updateEnabled( 'default', 'feature.default.1', - 'default', + DEFAULT_ENV, true, TEST_AUDIT_USER, ); @@ -64,12 +64,12 @@ test('returns feature flag for default env', async () => { test('returns feature flag for default env even if it is removed from project', async () => { await db.stores.featureEnvironmentStore.disconnectFeatures( - 'default', + DEFAULT_ENV, 'default', ); await db.stores.featureEnvironmentStore.disconnectProject( - 'default', + DEFAULT_ENV, 'default', ); diff --git a/src/test/e2e/api/client/metricsV2.e2e.test.ts b/src/test/e2e/api/client/metricsV2.e2e.test.ts index 9618c3d716..a1d080dc49 100644 --- a/src/test/e2e/api/client/metricsV2.e2e.test.ts +++ b/src/test/e2e/api/client/metricsV2.e2e.test.ts @@ -10,6 +10,7 @@ import getLogger from '../../../fixtures/no-logger.js'; import { ApiTokenType, type IApiToken } from '../../../../lib/types/model.js'; import { TEST_AUDIT_USER } from '../../../../lib/types/index.js'; import { vi } from 'vitest'; +import { DEFAULT_ENV } from '../../../../lib/server-impl.js'; let app: IUnleashTest; let db: ITestDb; @@ -23,7 +24,7 @@ beforeAll(async () => { await app.services.apiTokenService.createApiTokenWithProjects({ type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }); }); @@ -135,7 +136,7 @@ test('should set lastSeen for toggles with metrics both for toggle and toggle en { type: ApiTokenType.CLIENT, projects: ['default'], - environment: 'default', + environment: DEFAULT_ENV, tokenName: 'tester', }, ); @@ -178,8 +179,8 @@ test('should set lastSeen for toggles with metrics both for toggle and toggle en projectId: 'default', }); - const t1Env = t1.environments.find((e) => e.name === 'default'); - const t2Env = t2.environments.find((e) => e.name === 'default'); + const t1Env = t1.environments.find((e) => e.name === DEFAULT_ENV); + const t2Env = t2.environments.find((e) => e.name === DEFAULT_ENV); expect(t1.lastSeenAt?.getTime()).toBeGreaterThanOrEqual(start); expect(t1Env?.lastSeenAt.getTime()).toBeGreaterThanOrEqual(start); diff --git a/src/test/e2e/api/client/register.e2e.test.ts b/src/test/e2e/api/client/register.e2e.test.ts index 31a8fa2aae..f47345e28d 100644 --- a/src/test/e2e/api/client/register.e2e.test.ts +++ b/src/test/e2e/api/client/register.e2e.test.ts @@ -63,10 +63,12 @@ test('should allow client to register multiple times', async () => { .send(clientRegistration) .expect(202); - vi.advanceTimersByTime(6000); - // @ts-expect-error - Incomplete client registration - expect(clientApplicationsStore.exists(clientRegistration)).toBeTruthy(); - expect(clientInstanceStore.exists(clientRegistration)).toBeTruthy(); + await app.services.clientInstanceService.bulkAdd(); + + expect( + await clientApplicationsStore.exists(clientRegistration.appName), + ).toBeTruthy(); + expect(await clientInstanceStore.exists(clientRegistration)).toBeTruthy(); vi.useRealTimers(); }); diff --git a/src/test/e2e/features-created-by-user-id-data-migration.e2e.test.ts b/src/test/e2e/features-created-by-user-id-data-migration.e2e.test.ts index 608a81b44b..7ed39ea7d5 100644 --- a/src/test/e2e/features-created-by-user-id-data-migration.e2e.test.ts +++ b/src/test/e2e/features-created-by-user-id-data-migration.e2e.test.ts @@ -15,6 +15,7 @@ import { } from '../../lib/types/index.js'; import { createTestConfig } from '../config/test-config.js'; import dbInit, { type ITestDb } from './helpers/database-init.js'; +import { DEFAULT_ENV } from '../../lib/server-impl.js'; let stores: IUnleashStores; let db: ITestDb; @@ -145,7 +146,7 @@ test('admin tokens get populated to admin token user', async () => { secret: 'token1', username: 'adm-token', type: 'admin', - environment: 'default', + environment: DEFAULT_ENV, token_name: 'admin-token', }); @@ -222,7 +223,7 @@ test('emits event with updated rows count', async () => { secret: 'token2', username: 'adm-token2', type: 'admin', - environment: 'default', + environment: DEFAULT_ENV, token_name: 'admin-token2', }); diff --git a/src/test/e2e/helpers/test-helper.ts b/src/test/e2e/helpers/test-helper.ts index 5cd4fc0106..0f4cccd7e4 100644 --- a/src/test/e2e/helpers/test-helper.ts +++ b/src/test/e2e/helpers/test-helper.ts @@ -517,7 +517,7 @@ export async function setupAppWithBaseUrl( export const insertLastSeenAt = async ( featureName: string, db: Knex, - environment: string = 'default', + environment: string = DEFAULT_ENV, date: string = '2023-10-01T12:34:56.000Z', ): Promise => { try { diff --git a/src/test/e2e/services/access-service.e2e.test.ts b/src/test/e2e/services/access-service.e2e.test.ts index 53de8aee3f..51bf8c87c9 100644 --- a/src/test/e2e/services/access-service.e2e.test.ts +++ b/src/test/e2e/services/access-service.e2e.test.ts @@ -22,6 +22,7 @@ import { DEFAULT_PROJECT } from '../../../lib/types/project.js'; import { ALL_PROJECTS, CUSTOM_ROOT_ROLE_TYPE, + DEFAULT_ENV, } from '../../../lib/util/constants.js'; import { createAccessService, @@ -93,7 +94,7 @@ const createRole = async (rolePermissions: PermissionRef[]) => { }; const hasCommonProjectAccess = async (user, projectName, condition) => { - const defaultEnv = 'default'; + const defaultEnv = DEFAULT_ENV; const { CREATE_FEATURE, @@ -312,7 +313,7 @@ test('should remove CREATE_FEATURE on default environment', async () => { await accessService.addPermissionToRole( editRole.id, permissions.CREATE_FEATURE, - 'default', + DEFAULT_ENV, ); // TODO: to validate the remove works, we should make sure that we had permission before removing it @@ -571,7 +572,7 @@ test('should support permission with "ALL" environment requirement', async () => await accessStore.addPermissionsToRole( customRole.id, [{ name: CREATE_FEATURE_STRATEGY }], - 'default', + DEFAULT_ENV, ); await accessStore.addUserToRole(user.id, customRole.id, ALL_PROJECTS); @@ -579,7 +580,7 @@ test('should support permission with "ALL" environment requirement', async () => user, CREATE_FEATURE_STRATEGY, 'default', - 'default', + DEFAULT_ENV, ); expect(hasAccess).toBe(true); @@ -588,7 +589,7 @@ test('should support permission with "ALL" environment requirement', async () => user, CREATE_FEATURE_STRATEGY, 'default', - 'development', + 'production', ); expect(hasNotAccess).toBe(false); }); @@ -601,7 +602,7 @@ test('Should have access to create a strategy in an environment', async () => { user, CREATE_FEATURE_STRATEGY, 'default', - 'default', + DEFAULT_ENV, ), ).toBe(true); }); @@ -627,7 +628,7 @@ test('Should have access to edit a strategy in an environment', async () => { user, UPDATE_FEATURE_STRATEGY, 'default', - 'default', + DEFAULT_ENV, ), ).toBe(true); }); @@ -640,7 +641,7 @@ test('Should have access to delete a strategy in an environment', async () => { user, DELETE_FEATURE_STRATEGY, 'default', - 'default', + DEFAULT_ENV, ), ).toBe(true); }); diff --git a/src/test/e2e/services/playground-service.test.ts b/src/test/e2e/services/playground-service.test.ts index dcaaa27ef9..8bb21508f7 100644 --- a/src/test/e2e/services/playground-service.test.ts +++ b/src/test/e2e/services/playground-service.test.ts @@ -27,6 +27,7 @@ import type { PlaygroundSegmentSchema } from '../../../lib/openapi/spec/playgrou import { createPrivateProjectChecker } from '../../../lib/features/private-project/createPrivateProjectChecker.js'; import { createFeatureToggleService } from '../../../lib/features/index.js'; import { SegmentReadModel } from '../../../lib/features/segment/segment-read-model.js'; +import { DEFAULT_ENV } from '../../../lib/server-impl.js'; let stores: IUnleashStores; let db: ITestDb; @@ -194,7 +195,7 @@ describe('the playground service (e2e)', () => { const insertAndEvaluateFeatures = async ({ features, context, - env = 'default', + env = DEFAULT_ENV, segments, }: { features: ClientFeatureSchema[]; diff --git a/src/test/e2e/stores/api-token-store.e2e.test.ts b/src/test/e2e/stores/api-token-store.e2e.test.ts index 7719ac2f26..a8b62950ba 100644 --- a/src/test/e2e/stores/api-token-store.e2e.test.ts +++ b/src/test/e2e/stores/api-token-store.e2e.test.ts @@ -2,7 +2,7 @@ import dbInit, { type ITestDb } from '../helpers/database-init.js'; import getLogger from '../../fixtures/no-logger.js'; import type { IUnleashStores } from '../../../lib/types/index.js'; import { ApiTokenType } from '../../../lib/types/model.js'; -import { randomId } from '../../../lib/util/index.js'; +import { DEFAULT_ENV, randomId } from '../../../lib/util/index.js'; let stores: IUnleashStores; let db: ITestDb; @@ -14,8 +14,8 @@ beforeAll(async () => { stores = db.stores; }); -afterEach(async () => { - await db.reset(); +beforeEach(async () => { + await stores.apiTokenStore.deleteAll(); }); afterAll(async () => { @@ -30,7 +30,7 @@ test('get token is undefined when not exist', async () => { test('get token returns the token when exists', async () => { const newToken = await stores.apiTokenStore.insert({ secret: 'abcde321', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.ADMIN, projects: [], tokenName: 'admin-test-token', @@ -51,28 +51,28 @@ describe('count deprecated tokens', () => { }); await stores.apiTokenStore.insert({ secret: '*:*.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.ADMIN, projects: [], tokenName: 'admin-token', }); await stores.apiTokenStore.insert({ secret: 'default:development.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: ['default'], tokenName: 'client-token', }); await stores.apiTokenStore.insert({ secret: '*:development.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: [], tokenName: 'client-wildcard-token', }); await stores.apiTokenStore.insert({ secret: '[]:production.3d6bdada42ddbd63a019d26955178be44368985f7fb3237c584ef86f', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.FRONTEND, projects: ['default', 'test'], tokenName: 'frontend-token', @@ -92,7 +92,7 @@ describe('count deprecated tokens', () => { test('should return 1 for legacy tokens', async () => { await stores.apiTokenStore.insert({ secret: 'be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.ADMIN, projects: [], tokenName: 'admin-test-token', @@ -112,7 +112,7 @@ describe('count deprecated tokens', () => { test('should return 1 for orphaned tokens', async () => { await stores.apiTokenStore.insert({ secret: 'deleted-project:development.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: [], tokenName: 'admin-test-token', @@ -132,7 +132,7 @@ describe('count deprecated tokens', () => { test('should not count wildcard tokens as orphaned', async () => { await stores.apiTokenStore.insert({ secret: '*:*.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178', - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: [], tokenName: 'client-test-token', @@ -156,14 +156,14 @@ describe('count deprecated tokens', () => { '[]:production.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178'; await stores.apiTokenStore.insert({ secret: legacyTokenSecret, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.ADMIN, projects: [], tokenName: 'admin-test-token', }); await stores.apiTokenStore.insert({ secret: orphanedTokenSecret, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.FRONTEND, projects: [], tokenName: 'frontend-test-token', @@ -196,14 +196,14 @@ describe('count project tokens', () => { const store = stores.apiTokenStore; await store.insert({ secret: `default:default.${randomId()}`, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: ['default'], tokenName: 'token1', }); await store.insert({ secret: `*:*.${randomId()}`, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: ['*'], tokenName: 'token2', @@ -211,7 +211,7 @@ describe('count project tokens', () => { await store.insert({ secret: `${project.id}:default.${randomId()}`, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: [project.id], tokenName: 'token3', @@ -219,7 +219,7 @@ describe('count project tokens', () => { await store.insert({ secret: `[]:default.${randomId()}`, - environment: 'default', + environment: DEFAULT_ENV, type: ApiTokenType.CLIENT, projects: [project.id, 'default'], tokenName: 'token4',