mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-28 00:06:53 +01:00
fix: check whether a usage data is defined (#5393)
The previous check would return `false` if the value was 0, causing a bug where the usage data wouldn't be included. This also adds tests to ensure that usage data for CR segments is propagated correctly because that's where I first encountered the issue. Before this fix, if the values were 0, the data would display like the bottom element in the screenshot: ![image](https://github.com/Unleash/unleash/assets/17786332/9642b945-12c4-4217-aec9-7fef4a88e9af)
This commit is contained in:
parent
ffa14a0373
commit
0a43d341c0
@ -12,6 +12,7 @@ import { PartialSome } from '../types/partial';
|
|||||||
import User from '../types/user';
|
import User from '../types/user';
|
||||||
import { Db } from './db';
|
import { Db } from './db';
|
||||||
import { IFlagResolver } from '../types';
|
import { IFlagResolver } from '../types';
|
||||||
|
import { isDefined } from '../util';
|
||||||
|
|
||||||
const T = {
|
const T = {
|
||||||
segments: 'segments',
|
segments: 'segments',
|
||||||
@ -373,10 +374,10 @@ export default class SegmentStore implements ISegmentStore {
|
|||||||
constraints: row.constraints,
|
constraints: row.constraints,
|
||||||
createdBy: row.created_by,
|
createdBy: row.created_by,
|
||||||
createdAt: row.created_at,
|
createdAt: row.created_at,
|
||||||
...(row.used_in_projects && {
|
...(isDefined(row.used_in_projects) && {
|
||||||
usedInProjects: Number(row.used_in_projects),
|
usedInProjects: Number(row.used_in_projects),
|
||||||
}),
|
}),
|
||||||
...(row.used_in_features && {
|
...(isDefined(row.used_in_features) && {
|
||||||
usedInFeatures: Number(row.used_in_features),
|
usedInFeatures: Number(row.used_in_features),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
@ -108,17 +108,19 @@ const validateSegment = (
|
|||||||
.expect(expectStatusCode);
|
.expect(expectStatusCode);
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
db = await dbInit('segments_api_serial', getLogger);
|
const customOptions = {
|
||||||
app = await setupAppWithCustomConfig(
|
experimental: {
|
||||||
db.stores,
|
flags: {
|
||||||
{
|
anonymiseEventLog: true,
|
||||||
experimental: {
|
detectSegmentUsageInChangeRequests: true,
|
||||||
flags: {
|
|
||||||
anonymiseEventLog: true,
|
|
||||||
detectSegmentUsageInChangeRequests: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
db = await dbInit('segments_api_serial', getLogger, customOptions);
|
||||||
|
app = await setupAppWithCustomConfig(
|
||||||
|
db.stores,
|
||||||
|
customOptions,
|
||||||
db.rawDatabase,
|
db.rawDatabase,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -630,4 +632,67 @@ describe('detect strategy usage in change requests', () => {
|
|||||||
|
|
||||||
expect(changeRequestStrategies).toMatchObject([{ id: strategyId }]);
|
expect(changeRequestStrategies).toMatchObject([{ id: strategyId }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Should show usage in features and projects in CRs', async () => {
|
||||||
|
// Change request data is only counted for enterprise
|
||||||
|
// instances, so we'll instantiate our own version of the app
|
||||||
|
// for that.
|
||||||
|
const enterpriseApp = await setupAppWithCustomConfig(
|
||||||
|
db.stores,
|
||||||
|
{
|
||||||
|
enterpriseVersion: '5.3.0',
|
||||||
|
ui: { environment: 'Enterprise' },
|
||||||
|
experimental: {
|
||||||
|
flags: {
|
||||||
|
detectSegmentUsageInChangeRequests: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
db.rawDatabase,
|
||||||
|
);
|
||||||
|
|
||||||
|
// likewise, we want to fetch from the right app to make sure
|
||||||
|
// we get the right data
|
||||||
|
const enterpriseFetchSegments = () =>
|
||||||
|
enterpriseApp.request
|
||||||
|
.get(SEGMENTS_BASE_PATH)
|
||||||
|
.expect(200)
|
||||||
|
.then((res) => res.body.segments);
|
||||||
|
|
||||||
|
// because they use the same db, we can use the regular app
|
||||||
|
// (through `createSegment` and `createFeatureToggle`) to
|
||||||
|
// create the segment and the flag
|
||||||
|
await createSegment({ name: 'a', constraints: [] });
|
||||||
|
const toggle = mockFeatureToggle();
|
||||||
|
await createFeatureToggle(app, toggle);
|
||||||
|
const [segment] = await enterpriseFetchSegments();
|
||||||
|
|
||||||
|
expect(segment).toMatchObject({ usedInFeatures: 0, usedInProjects: 0 });
|
||||||
|
|
||||||
|
await db.rawDatabase.table('change_request_events').insert({
|
||||||
|
feature: toggle.name,
|
||||||
|
action: 'addStrategy',
|
||||||
|
payload: {
|
||||||
|
name: 'flexibleRollout',
|
||||||
|
title: '',
|
||||||
|
disabled: false,
|
||||||
|
segments: [segment.id],
|
||||||
|
variants: [],
|
||||||
|
parameters: {
|
||||||
|
groupId: toggle.name,
|
||||||
|
rollout: '100',
|
||||||
|
stickiness: 'default',
|
||||||
|
},
|
||||||
|
constraints: [],
|
||||||
|
},
|
||||||
|
created_at: '2023-01-01 00:01:00',
|
||||||
|
change_request_id: CR_ID,
|
||||||
|
created_by: user.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
const segments = await enterpriseFetchSegments();
|
||||||
|
expect(segments).toMatchObject([
|
||||||
|
{ usedInFeatures: 1, usedInProjects: 1 },
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user