2023-02-27 10:56:56 +01:00
|
|
|
import {
|
|
|
|
FEATURE_STRATEGY_ADD,
|
|
|
|
FEATURE_STRATEGY_REMOVE,
|
|
|
|
FEATURE_STRATEGY_UPDATE,
|
|
|
|
IEvent,
|
|
|
|
} from '../types';
|
|
|
|
|
|
|
|
import { FeatureEventFormatterMd } from './feature-event-formatter-md';
|
|
|
|
import {
|
|
|
|
DATE_AFTER,
|
|
|
|
DATE_BEFORE,
|
|
|
|
IN,
|
|
|
|
NOT_IN,
|
|
|
|
NUM_EQ,
|
|
|
|
NUM_GT,
|
|
|
|
NUM_GTE,
|
|
|
|
NUM_LT,
|
|
|
|
NUM_LTE,
|
|
|
|
SEMVER_EQ,
|
|
|
|
SEMVER_GT,
|
|
|
|
SEMVER_LT,
|
|
|
|
STR_CONTAINS,
|
|
|
|
STR_ENDS_WITH,
|
|
|
|
STR_STARTS_WITH,
|
|
|
|
} from '../util';
|
|
|
|
|
2023-09-29 17:11:59 +02:00
|
|
|
const testCases: [string, IEvent][] = [
|
2023-02-27 10:56:56 +01:00
|
|
|
[
|
|
|
|
'when groupId changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'different-feature',
|
|
|
|
rollout: '32',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '32',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when rollout percentage changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '32',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when stickiness changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'random',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when constraints and rollout percentage and stickiness changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: IN,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '32',
|
|
|
|
stickiness: 'random',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when neither rollout percentage nor stickiness changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when strategy added',
|
|
|
|
{
|
|
|
|
id: 919,
|
|
|
|
type: FEATURE_STRATEGY_ADD,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:08.290Z'),
|
|
|
|
data: {
|
|
|
|
id: '3f4bf713-696c-43a4-8ce7-d6c607108858',
|
|
|
|
name: 'flexibleRollout',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
groupId: 'new-feature',
|
|
|
|
rollout: '67',
|
|
|
|
stickiness: 'default',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: null,
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when strategy removed',
|
|
|
|
{
|
|
|
|
id: 918,
|
|
|
|
type: FEATURE_STRATEGY_REMOVE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:00.229Z'),
|
|
|
|
data: null,
|
|
|
|
preData: {
|
|
|
|
id: '9591090e-acb0-4088-8958-21faaeb7147d',
|
|
|
|
name: 'default',
|
|
|
|
parameters: {},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
2023-09-29 17:11:59 +02:00
|
|
|
...[IN, NOT_IN, STR_CONTAINS, STR_STARTS_WITH, STR_ENDS_WITH].map(
|
|
|
|
(operator) =>
|
|
|
|
<[string, IEvent]>[
|
2023-02-27 10:56:56 +01:00
|
|
|
'when default strategy updated',
|
|
|
|
{
|
|
|
|
id: 39,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'admin',
|
|
|
|
createdAt: new Date('2023-02-20T20:23:28.791Z'),
|
|
|
|
data: {
|
|
|
|
id: 'f2d34aac-52ec-49d2-82d3-08d710e89eaa',
|
|
|
|
name: 'default',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: operator,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
values: ['x'],
|
|
|
|
inverted: true,
|
|
|
|
operator: operator,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {},
|
|
|
|
segments: [],
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: 'f2d34aac-52ec-49d2-82d3-08d710e89eaa',
|
|
|
|
name: 'default',
|
|
|
|
segments: [],
|
|
|
|
parameters: {},
|
|
|
|
constraints: [],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'aaa',
|
|
|
|
project: 'default',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
),
|
|
|
|
...[
|
2023-09-29 17:11:59 +02:00
|
|
|
NUM_EQ,
|
|
|
|
NUM_GT,
|
|
|
|
NUM_GTE,
|
|
|
|
NUM_LT,
|
|
|
|
NUM_LTE,
|
|
|
|
DATE_BEFORE,
|
|
|
|
DATE_AFTER,
|
|
|
|
SEMVER_EQ,
|
|
|
|
SEMVER_GT,
|
|
|
|
SEMVER_LT,
|
2023-02-27 10:56:56 +01:00
|
|
|
].map(
|
2023-09-29 17:11:59 +02:00
|
|
|
(operator) =>
|
|
|
|
<[string, IEvent]>[
|
2023-09-29 14:18:21 +02:00
|
|
|
`when default strategy updated with numeric constraint ${operator}`,
|
2023-02-27 10:56:56 +01:00
|
|
|
{
|
|
|
|
id: 39,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'admin',
|
|
|
|
createdAt: new Date('2023-02-20T20:23:28.791Z'),
|
|
|
|
data: {
|
|
|
|
id: 'f2d34aac-52ec-49d2-82d3-08d710e89eaa',
|
|
|
|
name: 'default',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {},
|
|
|
|
segments: [],
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
id: 'f2d34aac-52ec-49d2-82d3-08d710e89eaa',
|
|
|
|
name: 'default',
|
|
|
|
segments: [],
|
|
|
|
parameters: {},
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
value: '4',
|
|
|
|
values: [],
|
|
|
|
inverted: false,
|
|
|
|
operator: operator,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'aaa',
|
|
|
|
project: 'default',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
),
|
|
|
|
[
|
|
|
|
'when userIds changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
name: 'userWithId',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: IN,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {
|
|
|
|
userIds: 'a,b',
|
|
|
|
},
|
|
|
|
sortOrder: 9999,
|
|
|
|
id: '9a995d94-5944-4897-a82f-0f7e65c2fb3f',
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
name: 'userWithId',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
userIds: '',
|
|
|
|
},
|
|
|
|
sortOrder: 9999,
|
|
|
|
id: '9a995d94-5944-4897-a82f-0f7e65c2fb3f',
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when IPs changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
name: 'remoteAddress',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: IN,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {
|
|
|
|
IPs: '127.0.0.1',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
name: 'remoteAddress',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
IPs: '',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when host names changed',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
name: 'applicationHostname',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: IN,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {
|
|
|
|
hostNames: 'unleash.com',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
name: 'applicationHostname',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
hostNames: '',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'when no specific text for strategy exists yet',
|
|
|
|
{
|
|
|
|
id: 920,
|
|
|
|
type: FEATURE_STRATEGY_UPDATE,
|
|
|
|
createdBy: 'user@company.com',
|
|
|
|
createdAt: new Date('2022-06-01T10:03:11.549Z'),
|
|
|
|
data: {
|
|
|
|
name: 'newStrategy',
|
|
|
|
constraints: [
|
|
|
|
{
|
|
|
|
values: ['x', 'y'],
|
|
|
|
inverted: false,
|
|
|
|
operator: IN,
|
|
|
|
contextName: 'appName',
|
|
|
|
caseInsensitive: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parameters: {
|
|
|
|
IPs: '127.0.0.1',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
preData: {
|
|
|
|
name: 'newStrategy',
|
|
|
|
constraints: [],
|
|
|
|
parameters: {
|
|
|
|
IPs: '',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
tags: [],
|
|
|
|
featureName: 'new-feature',
|
|
|
|
project: 'my-other-project',
|
|
|
|
environment: 'production',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
];
|
|
|
|
|
2023-09-29 17:11:59 +02:00
|
|
|
testCases.forEach(([description, event]) =>
|
2023-09-29 14:18:21 +02:00
|
|
|
test(`Should format specialised text for events ${description}`, () => {
|
2023-02-27 10:56:56 +01:00
|
|
|
const formatter = new FeatureEventFormatterMd('unleashUrl');
|
2023-09-29 17:11:59 +02:00
|
|
|
const formattedEvent = formatter.format(event);
|
|
|
|
expect(formattedEvent).toMatchSnapshot();
|
2023-02-27 10:56:56 +01:00
|
|
|
}),
|
|
|
|
);
|