mirror of
https://github.com/Unleash/unleash.git
synced 2025-06-14 01:16:17 +02: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);
|
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);
|
const input = await segmentSchema.validateAsync(data);
|
||||||
this.validateSegmentValuesLimit(input);
|
this.validateSegmentValuesLimit(input);
|
||||||
await this.validateName(input.name);
|
await this.validateName(input.name);
|
||||||
|
|
||||||
const segment = await this.segmentStore.create(input, user);
|
const segment = await this.segmentStore.create(input, user);
|
||||||
|
|
||||||
await this.eventStore.store({
|
await this.eventStore.store({
|
||||||
@ -78,9 +80,15 @@ export class SegmentService {
|
|||||||
createdBy: user.email || user.username,
|
createdBy: user.email || user.username,
|
||||||
data: segment,
|
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);
|
const input = await segmentSchema.validateAsync(data);
|
||||||
this.validateSegmentValuesLimit(input);
|
this.validateSegmentValuesLimit(input);
|
||||||
const preData = await this.segmentStore.get(id);
|
const preData = await this.segmentStore.get(id);
|
||||||
|
@ -40,8 +40,9 @@ const fetchClientFeatures = (): Promise<IFeatureToggleClient[]> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const createSegment = (postData: object): Promise<unknown> => {
|
const createSegment = (postData: object): Promise<unknown> => {
|
||||||
const user = { email: 'test@example.com' } as User;
|
return app.services.segmentService.create(postData, {
|
||||||
return app.services.segmentService.create(postData, user);
|
email: 'test@example.com',
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const createFeatureToggle = (
|
const createFeatureToggle = (
|
||||||
|
@ -8,7 +8,7 @@ import {
|
|||||||
IApiTokenCreate,
|
IApiTokenCreate,
|
||||||
} from '../../../../lib/types/models/api-token';
|
} from '../../../../lib/types/models/api-token';
|
||||||
import { startOfHour } from 'date-fns';
|
import { startOfHour } from 'date-fns';
|
||||||
import { IStrategyConfig } from '../../../../lib/types/model';
|
import { IConstraint, IStrategyConfig } from '../../../../lib/types/model';
|
||||||
|
|
||||||
let app: IUnleashTest;
|
let app: IUnleashTest;
|
||||||
let db: ITestDb;
|
let db: ITestDb;
|
||||||
@ -57,14 +57,15 @@ const createFeatureToggle = async ({
|
|||||||
environment?: string;
|
environment?: string;
|
||||||
strategies: IStrategyConfig[];
|
strategies: IStrategyConfig[];
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
}): Promise<void> => {
|
}) => {
|
||||||
await app.services.featureToggleService.createFeatureToggle(
|
const createdFeature =
|
||||||
project,
|
await app.services.featureToggleService.createFeatureToggle(
|
||||||
{ name },
|
project,
|
||||||
'userName',
|
{ name },
|
||||||
true,
|
'userName',
|
||||||
);
|
true,
|
||||||
await Promise.all(
|
);
|
||||||
|
const createdStrategies = await Promise.all(
|
||||||
(strategies ?? []).map(async (s) =>
|
(strategies ?? []).map(async (s) =>
|
||||||
app.services.featureToggleService.createStrategy(
|
app.services.featureToggleService.createStrategy(
|
||||||
s,
|
s,
|
||||||
@ -80,6 +81,7 @@ const createFeatureToggle = async ({
|
|||||||
enabled,
|
enabled,
|
||||||
'userName',
|
'userName',
|
||||||
);
|
);
|
||||||
|
return [createdFeature, createdStrategies] as const;
|
||||||
};
|
};
|
||||||
|
|
||||||
const createProject = async (id: string, name: string): Promise<void> => {
|
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