unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
86 lines • 3.05 kB
JavaScript
import dbInit from '../helpers/database-init.js';
import getLogger from '../../fixtures/no-logger.js';
import assert from 'assert';
import { randomId } from '../../../lib/util/index.js';
import { setupApp } from '../helpers/test-helper.js';
import { TEST_AUDIT_USER } from '../../../lib/types/index.js';
// The number of items to insert.
const seedSegmentSpec = {
featuresCount: 100,
segmentsPerFeature: 5,
constraintsPerSegment: 1,
valuesPerConstraint: 100,
};
// The database schema to populate.
const seedSchema = 'seed';
const fetchSegments = (app) => {
return app.services.segmentService.getAll();
};
const createSegment = (app, postData) => {
return app.services.segmentService.create(postData, TEST_AUDIT_USER);
};
const createFeatureToggle = (app, postData, expectStatusCode = 201) => {
return app.request
.post('/api/admin/features')
.send(postData)
.expect(expectStatusCode)
.then((res) => res.body);
};
const addSegmentToStrategy = (app, segmentId, strategyId) => {
return app.services.segmentService.addToStrategy(segmentId, strategyId);
};
const mockFeatureToggle = (overrides) => {
return {
name: randomId(),
strategies: [{ name: randomId(), constraints: [], parameters: {} }],
...overrides,
};
};
const seedConstraints = (spec) => {
return Array.from({ length: spec.constraintsPerSegment }).map(() => ({
values: Array.from({ length: spec.valuesPerConstraint }).map(() => randomId().substring(0, 16)),
operator: 'IN',
contextName: 'x',
}));
};
const seedSegments = (spec) => {
return Array.from({ length: spec.segmentsPerFeature }).map((v, i) => {
return {
name: `${seedSchema}_segment_${i}`,
constraints: seedConstraints(spec),
};
});
};
const seedFeatures = (spec) => {
return Array.from({ length: spec.featuresCount }).map((v, i) => {
return mockFeatureToggle({
name: `${seedSchema}_feature_${i}`,
});
});
};
const seedSegmentsDatabase = async (app, spec) => {
await Promise.all(seedSegments(spec).map((seed) => {
return createSegment(app, seed);
}));
const features = await Promise.all(seedFeatures(spec).map(async (seed) => {
return createFeatureToggle(app, seed);
}));
const segments = await fetchSegments(app);
assert(features.length === spec.featuresCount);
assert(segments.length === spec.segmentsPerFeature);
const addSegment = (feature, segment) => {
return addSegmentToStrategy(app, segment.id, feature.strategies[0].id);
};
for (const feature of features) {
await Promise.all(segments.map((segment) => addSegment(feature, segment)));
}
};
const main = async () => {
const db = await dbInit(seedSchema, getLogger);
const app = await setupApp(db.stores);
await seedSegmentsDatabase(app, seedSegmentSpec);
await app.destroy();
await db.destroy();
};
main().catch(console.error);
//# sourceMappingURL=segment.seed.js.map