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:
parent
634e188f73
commit
c42bbe4919
@ -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);
|
||||
|
@ -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 = (
|
||||
|
@ -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: [] }));
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user