mirror of
https://github.com/Unleash/unleash.git
synced 2024-11-01 19:07:38 +01:00
204 lines
5.6 KiB
TypeScript
204 lines
5.6 KiB
TypeScript
|
import { subDays } from 'date-fns';
|
||
|
import type { IFeatureType } from 'lib/types/stores/feature-type-store';
|
||
|
import {
|
||
|
calculateProjectHealth,
|
||
|
calculateHealthRating,
|
||
|
} from './project-health';
|
||
|
|
||
|
const exampleFeatureTypes: IFeatureType[] = [
|
||
|
{
|
||
|
id: 'default',
|
||
|
name: 'Default',
|
||
|
description: '',
|
||
|
lifetimeDays: 30,
|
||
|
},
|
||
|
{
|
||
|
id: 'short-lived',
|
||
|
name: 'Short lived',
|
||
|
description: '',
|
||
|
lifetimeDays: 7,
|
||
|
},
|
||
|
{
|
||
|
id: 'non-expiring',
|
||
|
name: 'Long lived',
|
||
|
description: '',
|
||
|
lifetimeDays: null,
|
||
|
},
|
||
|
];
|
||
|
|
||
|
describe('calculateProjectHealth', () => {
|
||
|
it('works with empty features', () => {
|
||
|
expect(calculateProjectHealth([], exampleFeatureTypes)).toEqual({
|
||
|
activeCount: 0,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 0,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('counts active toggles', () => {
|
||
|
const features = [{ stale: false }, {}];
|
||
|
|
||
|
expect(calculateProjectHealth(features, exampleFeatureTypes)).toEqual({
|
||
|
activeCount: 2,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 0,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('counts stale toggles', () => {
|
||
|
const features = [{ stale: true }, { stale: false }, {}];
|
||
|
|
||
|
expect(calculateProjectHealth(features, exampleFeatureTypes)).toEqual({
|
||
|
activeCount: 2,
|
||
|
staleCount: 1,
|
||
|
potentiallyStaleCount: 0,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('takes feature type into account when calculating potentially stale toggles', () => {
|
||
|
expect(
|
||
|
calculateProjectHealth(
|
||
|
[
|
||
|
{
|
||
|
stale: false,
|
||
|
createdAt: subDays(Date.now(), 15),
|
||
|
type: 'default',
|
||
|
},
|
||
|
],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual({
|
||
|
activeCount: 1,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 0,
|
||
|
});
|
||
|
|
||
|
expect(
|
||
|
calculateProjectHealth(
|
||
|
[
|
||
|
{
|
||
|
stale: false,
|
||
|
createdAt: subDays(Date.now(), 31),
|
||
|
type: 'default',
|
||
|
},
|
||
|
],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual({
|
||
|
activeCount: 1,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 1,
|
||
|
});
|
||
|
|
||
|
expect(
|
||
|
calculateProjectHealth(
|
||
|
[
|
||
|
{
|
||
|
stale: false,
|
||
|
createdAt: subDays(Date.now(), 15),
|
||
|
type: 'short-lived',
|
||
|
},
|
||
|
],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual({
|
||
|
activeCount: 1,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 1,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("doesn't count stale toggles as potentially stale or stale as active", () => {
|
||
|
const features = [
|
||
|
{
|
||
|
stale: true,
|
||
|
createdAt: subDays(Date.now(), 31),
|
||
|
type: 'default',
|
||
|
},
|
||
|
{
|
||
|
stale: false,
|
||
|
createdAt: subDays(Date.now(), 31),
|
||
|
type: 'default',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
expect(calculateProjectHealth(features, exampleFeatureTypes)).toEqual({
|
||
|
activeCount: 1,
|
||
|
staleCount: 1,
|
||
|
potentiallyStaleCount: 1,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('counts non-expiring types properly', () => {
|
||
|
const features = [
|
||
|
{
|
||
|
createdAt: subDays(Date.now(), 366),
|
||
|
type: 'non-expiring',
|
||
|
},
|
||
|
{
|
||
|
createdAt: subDays(Date.now(), 366),
|
||
|
type: 'default',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
expect(calculateProjectHealth(features, exampleFeatureTypes)).toEqual({
|
||
|
activeCount: 2,
|
||
|
staleCount: 0,
|
||
|
potentiallyStaleCount: 1,
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('calculateHealthRating', () => {
|
||
|
it('works with empty feature toggles', () => {
|
||
|
expect(calculateHealthRating([], exampleFeatureTypes)).toEqual(100);
|
||
|
});
|
||
|
|
||
|
it('works with stale and active feature toggles', () => {
|
||
|
expect(
|
||
|
calculateHealthRating(
|
||
|
[{ stale: true }, { stale: true }],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual(0);
|
||
|
expect(
|
||
|
calculateHealthRating(
|
||
|
[{ stale: true }, { stale: false }],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual(50);
|
||
|
expect(
|
||
|
calculateHealthRating(
|
||
|
[{ stale: false }, { stale: true }, { stale: false }],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual(67);
|
||
|
});
|
||
|
|
||
|
it('counts potentially stale toggles', () => {
|
||
|
expect(
|
||
|
calculateHealthRating(
|
||
|
[
|
||
|
{ createdAt: subDays(Date.now(), 1), type: 'default' },
|
||
|
{
|
||
|
stale: true,
|
||
|
createdAt: subDays(Date.now(), 1),
|
||
|
type: 'default',
|
||
|
},
|
||
|
{
|
||
|
stale: true,
|
||
|
createdAt: subDays(Date.now(), 31),
|
||
|
type: 'default',
|
||
|
},
|
||
|
{
|
||
|
stale: false,
|
||
|
createdAt: subDays(Date.now(), 31),
|
||
|
type: 'default',
|
||
|
},
|
||
|
],
|
||
|
exampleFeatureTypes,
|
||
|
),
|
||
|
).toEqual(25);
|
||
|
});
|
||
|
});
|