1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-11-01 19:07:38 +01:00
unleash.unleash/src/test/e2e/stores/feature-strategies-store.e2e.test.ts
Christopher Kolstad eafba10cac
feature: add query support to features endpoint (#2693)
## About the changes
The deprecated /api/admin/features endpoint supported querying with tag
and namePrefix parameters.

This PR adds this functionality to
/api/admin/projects/<project>/features as well, allowing to replicate
queries that used to work.

Closes #2306

### Important files
src/lib/db/feature-strategy-store.ts
src/test/e2e/stores/feature-strategies-store.e2e.test.ts

## Discussion points
I'm extending our query parameters support for
/api/admin/projects/<projectId>/features endpoint. This will be
reflected in our open-api spec, so I also made an
adminFeaturesQuerySchema for this.

Also, very open for something similar to what we did for the modifyQuery
for the archived parameter, but couldn't come up with a good way to
support subselects using the query builder, it just ended up blowing the
stack. If anyone has a suggestion, I'm all ears.

Co-authored-by: Thomas Heartman <thomas@getunleash.ai>
2022-12-16 12:05:18 +01:00

128 lines
4.1 KiB
TypeScript

import { IFeatureStrategiesStore } from 'lib/types/stores/feature-strategies-store';
import { IFeatureToggleStore } from 'lib/types/stores/feature-toggle-store';
import dbInit from '../helpers/database-init';
import getLogger from '../../fixtures/no-logger';
let stores;
let db;
let featureStrategiesStore: IFeatureStrategiesStore;
let featureToggleStore: IFeatureToggleStore;
const featureName = 'test-strategies-move-project';
beforeAll(async () => {
db = await dbInit('feature_strategies_store_serial', getLogger);
stores = db.stores;
featureStrategiesStore = stores.featureStrategiesStore;
featureToggleStore = stores.featureToggleStore;
await featureToggleStore.create('default', { name: featureName });
});
afterAll(async () => {
await db.destroy();
});
test('Can successfully update project for all strategies belonging to feature', async () => {
const newProjectId = 'different-project';
const oldProjectId = 'default';
const environment = 'default';
await featureStrategiesStore.createStrategyFeatureEnv({
strategyName: 'default',
projectId: oldProjectId,
environment,
featureName,
constraints: [],
parameters: {},
sortOrder: 15,
});
await featureStrategiesStore.createStrategyFeatureEnv({
strategyName: 'default',
projectId: oldProjectId,
environment,
featureName,
constraints: [],
parameters: {},
sortOrder: 20,
});
const strats = await featureStrategiesStore.getStrategiesForFeatureEnv(
oldProjectId,
featureName,
environment,
);
expect(strats).toHaveLength(2);
await featureStrategiesStore.setProjectForStrategiesBelongingToFeature(
featureName,
newProjectId,
);
const newProjectStrats =
await featureStrategiesStore.getStrategiesForFeatureEnv(
newProjectId,
featureName,
environment,
);
expect(newProjectStrats).toHaveLength(2);
const oldProjectStrats =
await featureStrategiesStore.getStrategiesForFeatureEnv(
oldProjectId,
featureName,
environment,
);
return expect(oldProjectStrats).toHaveLength(0);
});
test('Can query for features with tags', async () => {
const tag = { type: 'simple', value: 'hello-tags' };
await stores.tagStore.createTag(tag);
await featureToggleStore.create('default', { name: 'to-be-tagged' });
await featureToggleStore.create('default', { name: 'not-tagged' });
await stores.featureTagStore.tagFeature('to-be-tagged', tag);
const features = await featureStrategiesStore.getFeatureOverview({
projectId: 'default',
tag: [[tag.type, tag.value]],
});
expect(features).toHaveLength(1);
});
test('Can query for features with namePrefix', async () => {
await featureToggleStore.create('default', {
name: 'nameprefix-to-be-hit',
});
await featureToggleStore.create('default', {
name: 'nameprefix-not-be-hit',
});
const features = await featureStrategiesStore.getFeatureOverview({
projectId: 'default',
namePrefix: 'nameprefix-to',
});
expect(features).toHaveLength(1);
});
test('Can query for features with namePrefix and tags', async () => {
const tag = { type: 'simple', value: 'hello-nameprefix-and-tags' };
await stores.tagStore.createTag(tag);
await featureToggleStore.create('default', {
name: 'to-be-tagged-nameprefix-and-tags',
});
await featureToggleStore.create('default', {
name: 'not-tagged-nameprefix-and-tags',
});
await featureToggleStore.create('default', {
name: 'tagged-but-not-hit-nameprefix-and-tags',
});
await stores.featureTagStore.tagFeature(
'to-be-tagged-nameprefix-and-tags',
tag,
);
await stores.featureTagStore.tagFeature(
'tagged-but-not-hit-nameprefix-and-tags',
tag,
);
const features = await featureStrategiesStore.getFeatureOverview({
projectId: 'default',
tag: [[tag.type, tag.value]],
namePrefix: 'to',
});
expect(features).toHaveLength(1);
});