mirror of
https://github.com/Unleash/unleash.git
synced 2025-10-18 11:14:57 +02:00
## 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
100 lines
3.1 KiB
TypeScript
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);
|
|
});
|