1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-10-18 11:14:57 +02:00
unleash.unleash/src/lib/features/metrics/sizes/largest-resources-read-model.test.ts
Gastón Fournier 9eb19618bf
fix: stickiness should be preserved on strategy updates (#10439)
## About the changes
When stickiness was set to empty or undefined while updating a strategy
via API the stickiness would be lost.

This adds a validation step after creating a strategy, that updating
with the same data used to create the strategy yields the same result.

The main change was lifting the default logic from the store layer to
the service layer and adapting tests accordingly
2025-07-30 15:47:51 +02:00

100 lines
3.1 KiB
TypeScript

import type { ILargestResourcesReadModel } from './largest-resources-read-model-type.js';
import dbInit, {
type ITestDb,
} from '../../../../test/e2e/helpers/database-init.js';
import type { IFeatureToggleStore } from '../../feature-toggle/types/feature-toggle-store-type.js';
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;
let featureToggleStore: IFeatureToggleStore;
let featureStrategiesStore: IFeatureStrategiesStore;
beforeAll(async () => {
db = await dbInit('largest_resources_read_model', getLogger);
featureToggleStore = db.stores.featureToggleStore;
featureStrategiesStore = db.stores.featureStrategiesStore;
largestResourcesReadModel = db.stores.largestResourcesReadModel;
});
afterAll(async () => {
if (db) {
await db.destroy();
}
});
beforeEach(async () => {
await featureToggleStore.deleteAll();
});
type FeatureConfig = Pick<
IFeatureStrategy,
'featureName' | 'constraints' | 'parameters' | 'variants'
>;
const createFeature = async (config: FeatureConfig) => {
await featureToggleStore.create('default', {
name: config.featureName,
createdByUserId: 9999,
});
await featureStrategiesStore.createStrategyFeatureEnv({
strategyName: 'flexibleRollout',
projectId: 'default',
environment: DEFAULT_ENV,
featureName: config.featureName,
constraints: config.constraints,
parameters: config.parameters,
variants: config.variants,
});
};
test('can calculate resource size', async () => {
await createFeature({
featureName: 'featureA',
parameters: {
groupId: 'flag_init_test_1',
rollout: '25',
stickiness: 'default',
},
constraints: [
{
contextName: 'clientId',
operator: 'IN',
values: ['1', '2', '3', '4', '5', '6'],
caseInsensitive: false,
inverted: false,
},
],
variants: [
{
name: 'a',
weight: 1000,
weightType: 'fix',
stickiness: 'default',
},
],
});
await createFeature({
featureName: 'featureB',
parameters: {
groupId: 'featureB',
rollout: '100',
stickiness: 'default',
},
constraints: [],
variants: [],
});
const [project] =
await largestResourcesReadModel.getLargestProjectEnvironments(1);
const [feature1, feature2] =
await largestResourcesReadModel.getLargestFeatureEnvironments(2);
expect(project.size).toBeGreaterThan(400);
expect(project.size).toBe(feature1.size + feature2.size);
expect(feature1.size).toBeGreaterThan(feature2.size);
});