1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-23 13:46:45 +02:00

feat: fix impl

This commit is contained in:
Thomas Heartman 2023-11-20 12:22:24 +01:00
parent a549f9a017
commit 8666955eab
No known key found for this signature in database
GPG Key ID: BD1F880DAED1EE78
4 changed files with 71 additions and 20 deletions

View File

@ -113,7 +113,7 @@ describe.each([
])('Should handle %s changes correctly', (_, addOrUpdateStrategy) => {
test.each([
['Draft', true],
['In Review', true],
['In review', true],
['Scheduled', true],
['Approved', true],
['Rejected', false],
@ -137,7 +137,7 @@ describe.each([
describe('addStrategy events should show up in used strategies correctly', () => {
test.each([
['Draft', true],
['In Review', true],
['In review', true],
['Scheduled', true],
['Approved', true],
['Rejected', false],
@ -152,18 +152,21 @@ describe('addStrategy events should show up in used strategies correctly', () =>
await addStrategyToCr(segmentId, FLAG_NAME);
const result = await readModel.isSegmentUsedInActiveChangeRequests(
segmentId,
);
const result =
await readModel.getStrategiesUsedInActiveChangeRequests(
segmentId,
);
if (shouldShow) {
expect(result).toBe({
projectId: 'default',
strategyName: 'flexibleRollout',
environment: 'default',
featureName: FLAG_NAME,
});
expect(result).toStrictEqual([
{
projectId: 'default',
strategyName: 'flexibleRollout',
environment: 'default',
featureName: FLAG_NAME,
},
]);
} else {
expect(result).toBe([]);
expect(result).toStrictEqual([]);
}
},
);
@ -172,7 +175,7 @@ describe('addStrategy events should show up in used strategies correctly', () =>
describe('updateStrategy events should show up in used strategies correctly', () => {
test.each([
['Draft', true],
['In Review', true],
['In review', true],
['Scheduled', true],
['Approved', true],
['Rejected', false],
@ -204,7 +207,7 @@ describe('updateStrategy events should show up in used strategies correctly', ()
},
]);
} else {
expect(result).toBe([]);
expect(result).toStrictEqual([]);
}
},
);

View File

@ -7,7 +7,7 @@ type NewStrategy = {
type ExistingStrategy = NewStrategy & { id?: string };
type ChangeRequestStrategy = NewStrategy | ExistingStrategy;
export type ChangeRequestStrategy = NewStrategy | ExistingStrategy;
export interface IChangeRequestSegmentUsageReadModel {
isSegmentUsedInActiveChangeRequests(segmentId: number): Promise<boolean>;

View File

@ -1,16 +1,32 @@
import { IChangeRequestSegmentUsageReadModel } from './change-request-segment-usage-read-model';
import {
ChangeRequestStrategy,
IChangeRequestSegmentUsageReadModel,
} from './change-request-segment-usage-read-model';
export class FakeChangeRequestSegmentUsageReadModel
implements IChangeRequestSegmentUsageReadModel
{
private isSegmentUsedInActiveChangeRequestsValue: boolean;
strategiesUsedInActiveChangeRequests: ChangeRequestStrategy[];
constructor(isSegmentUsedInActiveChangeRequests = false) {
constructor(
isSegmentUsedInActiveChangeRequests = false,
strategiesUsedInActiveChangeRequests = [],
) {
this.isSegmentUsedInActiveChangeRequestsValue =
isSegmentUsedInActiveChangeRequests;
this.strategiesUsedInActiveChangeRequests =
strategiesUsedInActiveChangeRequests;
}
public async isSegmentUsedInActiveChangeRequests(): Promise<boolean> {
return this.isSegmentUsedInActiveChangeRequestsValue;
}
public async getStrategiesUsedInActiveChangeRequests(): Promise<
ChangeRequestStrategy[]
> {
return this.strategiesUsedInActiveChangeRequests;
}
}

View File

@ -1,5 +1,8 @@
import { Db } from '../../db/db';
import { IChangeRequestSegmentUsageReadModel } from './change-request-segment-usage-read-model';
import {
ChangeRequestStrategy,
IChangeRequestSegmentUsageReadModel,
} from './change-request-segment-usage-read-model';
export class ChangeRequestSegmentUsageReadModel
implements IChangeRequestSegmentUsageReadModel
@ -9,7 +12,6 @@ export class ChangeRequestSegmentUsageReadModel
constructor(db: Db) {
this.db = db;
}
public async isSegmentUsedInActiveChangeRequests(
segmentId: number,
): Promise<boolean> {
@ -17,7 +19,7 @@ export class ChangeRequestSegmentUsageReadModel
`SELECT events.*
FROM change_request_events events
JOIN change_requests cr ON events.change_request_id = cr.id
WHERE cr.state IN ('Draft', 'In Review', 'Scheduled', 'Approved')
WHERE cr.state IN ('Draft', 'In review', 'Scheduled', 'Approved')
AND events.action IN ('updateStrategy', 'addStrategy');`,
);
@ -27,4 +29,34 @@ export class ChangeRequestSegmentUsageReadModel
return isUsed;
}
mapRow = (row): ChangeRequestStrategy => {
const { payload, project, environment, feature } = row;
return {
projectId: project,
featureName: feature,
environment: environment,
strategyName: payload.name,
...(payload.id ? { id: payload.id } : {}),
};
};
public async getStrategiesUsedInActiveChangeRequests(
segmentId: number,
): Promise<ChangeRequestStrategy[]> {
const query = this.db.raw(
`SELECT events.*, cr.project, cr.environment
FROM change_request_events events
JOIN change_requests cr ON events.change_request_id = cr.id
WHERE cr.state NOT IN ('Applied', 'Cancelled', 'Rejected')
AND events.action IN ('updateStrategy', 'addStrategy');`,
);
const queryResult = await query;
const strategies = queryResult.rows
.filter((row) => row.payload?.segments?.includes(segmentId))
.map(this.mapRow);
return strategies;
}
}