mirror of
https://github.com/Unleash/unleash.git
synced 2025-08-27 13:49:10 +02:00
feat: add tests!
This commit is contained in:
parent
002584b77a
commit
8c832d07cb
@ -0,0 +1,152 @@
|
|||||||
|
import {
|
||||||
|
sortAndFlattenStrategies,
|
||||||
|
sortStrategiesByFeature,
|
||||||
|
} from './sort-strategies';
|
||||||
|
|
||||||
|
describe('sorting strategies by feature', () => {
|
||||||
|
test('strategies with the same id are sorted: existing first, then change requests', () => {
|
||||||
|
const strategies = [{ id: 'a', featureName: 'feature1' }];
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ id: 'a', featureName: 'feature1' },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature(strategies, changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('the same strategy used in multiple change requests is sorted by change request id', () => {
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature([], changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('strategies are sorted by id, with change requests strategies being listed before existing strategies if their ids would indicate that', () => {
|
||||||
|
const strategies = [{ id: 'b', featureName: 'feature1' }];
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'b', featureName: 'feature1' },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature(strategies, changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('strategies without ids (new strategies) are sorted by change request id', () => {
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature([], changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('if new strategies have the same change request id, they should be listed in the same order as in the input', () => {
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ key: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ key: 'b', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ key: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ key: 'b', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature([], changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('all the various sorts work together', () => {
|
||||||
|
const strategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1' },
|
||||||
|
{ id: 'b', featureName: 'feature1' },
|
||||||
|
{ id: 'd', featureName: 'feature1' },
|
||||||
|
];
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'c', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ key: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ key: 'b', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
feature1: [
|
||||||
|
{ id: 'a', featureName: 'feature1' },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ id: 'b', featureName: 'feature1' },
|
||||||
|
{ id: 'c', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'd', featureName: 'feature1' },
|
||||||
|
{ key: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ key: 'b', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortStrategiesByFeature(strategies, changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('when multiple flag names are provided, the list will be sorted on flag name first, then the criteria used in `sortStrategiesByFeature`', () => {
|
||||||
|
const strategies = [
|
||||||
|
{ id: 'b', featureName: 'feature2' },
|
||||||
|
{ id: 'a', featureName: 'feature1' },
|
||||||
|
];
|
||||||
|
const changeRequestStrategies = [
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ id: 'b', featureName: 'feature2', changeRequest: { id: 2 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
const expected = [
|
||||||
|
{ id: 'a', featureName: 'feature1' },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 1 } },
|
||||||
|
{ id: 'a', featureName: 'feature1', changeRequest: { id: 2 } },
|
||||||
|
{ id: 'b', featureName: 'feature2' },
|
||||||
|
{ id: 'b', featureName: 'feature2', changeRequest: { id: 2 } },
|
||||||
|
];
|
||||||
|
|
||||||
|
expect(
|
||||||
|
sortAndFlattenStrategies(strategies, changeRequestStrategies),
|
||||||
|
).toStrictEqual(expected);
|
||||||
|
});
|
@ -0,0 +1,71 @@
|
|||||||
|
// use generics here to make it easier to test
|
||||||
|
export const sortStrategiesByFeature = <
|
||||||
|
T extends { id: string; featureName?: string },
|
||||||
|
U extends {
|
||||||
|
id?: string;
|
||||||
|
featureName: string;
|
||||||
|
changeRequest: { id: number };
|
||||||
|
},
|
||||||
|
>(
|
||||||
|
strategies: T[],
|
||||||
|
changeRequestStrategies: U[],
|
||||||
|
): { [flagName: string]: (T | U)[] } => {
|
||||||
|
const isExistingStrategy = (strategy: T | U) => 'id' in strategy;
|
||||||
|
const isNewStrategy = (strategy: T | U) => !isExistingStrategy(strategy);
|
||||||
|
|
||||||
|
const collected = [...strategies, ...changeRequestStrategies].reduce(
|
||||||
|
(acc, strategy) => {
|
||||||
|
if (!strategy.featureName) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
const registered = acc[strategy.featureName];
|
||||||
|
if (registered) {
|
||||||
|
registered.push(strategy);
|
||||||
|
} else {
|
||||||
|
acc[strategy.featureName] = [strategy];
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
{} as { [flagName: string]: (T | U)[] },
|
||||||
|
);
|
||||||
|
|
||||||
|
const sorted = Object.entries(collected).map(
|
||||||
|
([featureName, strategies]) => {
|
||||||
|
strategies.sort((a, b) => {
|
||||||
|
if (isNewStrategy(a) && isNewStrategy(b)) {
|
||||||
|
return a.changeRequest.id - b.changeRequest.id;
|
||||||
|
}
|
||||||
|
if (isNewStrategy(a)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (isNewStrategy(b)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
[featureName, strategies];
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const collected2 = Object.fromEntries(sorted);
|
||||||
|
|
||||||
|
return collected2;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const sortAndFlattenStrategies = <
|
||||||
|
T extends { id: string; featureName?: string },
|
||||||
|
U extends {
|
||||||
|
id?: string;
|
||||||
|
featureName: string;
|
||||||
|
changeRequest: { id: number };
|
||||||
|
},
|
||||||
|
>(
|
||||||
|
strategies: T[],
|
||||||
|
changeRequestStrategies: U[],
|
||||||
|
): (T | U)[] => {
|
||||||
|
const sorted = sortStrategiesByFeature(strategies, changeRequestStrategies);
|
||||||
|
|
||||||
|
// flatten list of
|
||||||
|
return Object.values(sorted).flat();
|
||||||
|
};
|
@ -11,7 +11,7 @@ type ChangeRequestNewStrategy = {
|
|||||||
featureName: string;
|
featureName: string;
|
||||||
strategyName: string;
|
strategyName: string;
|
||||||
environment: string;
|
environment: string;
|
||||||
changeRequests: [ChangeRequestInfo, ...ChangeRequestInfo[]];
|
changeRequest: ChangeRequestInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ChangeRequestUpdatedStrategy = ChangeRequestNewStrategy & { id: string };
|
type ChangeRequestUpdatedStrategy = ChangeRequestNewStrategy & { id: string };
|
||||||
|
Loading…
Reference in New Issue
Block a user