1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-09 00:18:00 +01:00

refactor: test segments in embedded proxy (#1952)

This commit is contained in:
olav 2022-08-22 16:35:43 +02:00 committed by GitHub
parent 634e188f73
commit c42bbe4919
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 14 deletions

View File

@ -66,11 +66,13 @@ export class SegmentService {
return this.featureStrategiesStore.getStrategiesBySegment(id);
}
async create(data: unknown, user: User): Promise<void> {
async create(
data: unknown,
user: Partial<Pick<User, 'username' | 'email'>>,
): Promise<ISegment> {
const input = await segmentSchema.validateAsync(data);
this.validateSegmentValuesLimit(input);
await this.validateName(input.name);
const segment = await this.segmentStore.create(input, user);
await this.eventStore.store({
@ -78,9 +80,15 @@ export class SegmentService {
createdBy: user.email || user.username,
data: segment,
});
return segment;
}
async update(id: number, data: unknown, user: User): Promise<void> {
async update(
id: number,
data: unknown,
user: Partial<Pick<User, 'username' | 'email'>>,
): Promise<void> {
const input = await segmentSchema.validateAsync(data);
this.validateSegmentValuesLimit(input);
const preData = await this.segmentStore.get(id);

View File

@ -40,8 +40,9 @@ const fetchClientFeatures = (): Promise<IFeatureToggleClient[]> => {
};
const createSegment = (postData: object): Promise<unknown> => {
const user = { email: 'test@example.com' } as User;
return app.services.segmentService.create(postData, user);
return app.services.segmentService.create(postData, {
email: 'test@example.com',
});
};
const createFeatureToggle = (

View File

@ -8,7 +8,7 @@ import {
IApiTokenCreate,
} from '../../../../lib/types/models/api-token';
import { startOfHour } from 'date-fns';
import { IStrategyConfig } from '../../../../lib/types/model';
import { IConstraint, IStrategyConfig } from '../../../../lib/types/model';
let app: IUnleashTest;
let db: ITestDb;
@ -57,14 +57,15 @@ const createFeatureToggle = async ({
environment?: string;
strategies: IStrategyConfig[];
enabled: boolean;
}): Promise<void> => {
await app.services.featureToggleService.createFeatureToggle(
project,
{ name },
'userName',
true,
);
await Promise.all(
}) => {
const createdFeature =
await app.services.featureToggleService.createFeatureToggle(
project,
{ name },
'userName',
true,
);
const createdStrategies = await Promise.all(
(strategies ?? []).map(async (s) =>
app.services.featureToggleService.createStrategy(
s,
@ -80,6 +81,7 @@ const createFeatureToggle = async ({
enabled,
'userName',
);
return [createdFeature, createdStrategies] as const;
};
const createProject = async (id: string, name: string): Promise<void> => {
@ -724,3 +726,67 @@ test('should filter features by environment', async () => {
});
});
});
test('should filter features by segment', async () => {
const [featureA, [strategyA]] = await createFeatureToggle({
name: randomId(),
enabled: true,
strategies: [{ name: 'default', parameters: {} }],
});
const [featureB, [strategyB]] = await createFeatureToggle({
name: randomId(),
enabled: true,
strategies: [{ name: 'default', parameters: {} }],
});
const constraintA: IConstraint = {
operator: 'IN',
contextName: 'appName',
values: ['a'],
};
const constraintB: IConstraint = {
operator: 'IN',
contextName: 'appName',
values: ['b'],
};
const segmentA = await app.services.segmentService.create(
{ name: randomId(), constraints: [constraintA] },
{ email: 'test@example.com' },
);
const segmentB = await app.services.segmentService.create(
{ name: randomId(), constraints: [constraintB] },
{ email: 'test@example.com' },
);
await app.services.segmentService.addToStrategy(segmentA.id, strategyA.id);
await app.services.segmentService.addToStrategy(segmentB.id, strategyB.id);
const frontendToken = await createApiToken(ApiTokenType.FRONTEND);
await app.request
.get('/api/frontend')
.set('Authorization', frontendToken.secret)
.expect('Content-Type', /json/)
.expect(200)
.expect((res) => expect(res.body).toEqual({ toggles: [] }));
await app.request
.get('/api/frontend?appName=a')
.set('Authorization', frontendToken.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.name),
);
await app.request
.get('/api/frontend?appName=b')
.set('Authorization', frontendToken.secret)
.expect('Content-Type', /json/)
.expect(200)
.expect((res) => expect(res.body.toggles).toHaveLength(1))
.expect((res) =>
expect(res.body.toggles[0].name).toEqual(featureB.name),
);
await app.request
.get('/api/frontend?appName=c')
.set('Authorization', frontendToken.secret)
.expect('Content-Type', /json/)
.expect(200)
.expect((res) => expect(res.body).toEqual({ toggles: [] }));
});