1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-01 00:08:27 +01:00
unleash.unleash/src/lib/addons/feature-event-formatter-md.test.ts
Nuno Góis 521cc24a22
feat: add more events in integrations (#4815)
https://linear.app/unleash/issue/2-1253/add-support-for-more-events-in-the-slack-app-integration

Adds support for a lot more events in our integrations. Here is how the
full list looks like:

- ADDON_CONFIG_CREATED
- ADDON_CONFIG_DELETED
- ADDON_CONFIG_UPDATED
- API_TOKEN_CREATED
- API_TOKEN_DELETED
- CHANGE_ADDED
- CHANGE_DISCARDED
- CHANGE_EDITED
- CHANGE_REQUEST_APPLIED
- CHANGE_REQUEST_APPROVAL_ADDED
- CHANGE_REQUEST_APPROVED
- CHANGE_REQUEST_CANCELLED
- CHANGE_REQUEST_CREATED
- CHANGE_REQUEST_DISCARDED
- CHANGE_REQUEST_REJECTED
- CHANGE_REQUEST_SENT_TO_REVIEW
- CONTEXT_FIELD_CREATED
- CONTEXT_FIELD_DELETED
- CONTEXT_FIELD_UPDATED
- FEATURE_ARCHIVED
- FEATURE_CREATED
- FEATURE_DELETED
- FEATURE_ENVIRONMENT_DISABLED
- FEATURE_ENVIRONMENT_ENABLED
- FEATURE_ENVIRONMENT_VARIANTS_UPDATED
- FEATURE_METADATA_UPDATED
- FEATURE_POTENTIALLY_STALE_ON
- FEATURE_PROJECT_CHANGE
- FEATURE_REVIVED
- FEATURE_STALE_OFF
- FEATURE_STALE_ON
- FEATURE_STRATEGY_ADD
- FEATURE_STRATEGY_REMOVE
- FEATURE_STRATEGY_UPDATE
- FEATURE_TAGGED
- FEATURE_UNTAGGED
- GROUP_CREATED
- GROUP_DELETED
- GROUP_UPDATED
- PROJECT_CREATED
- PROJECT_DELETED
- SEGMENT_CREATED
- SEGMENT_DELETED
- SEGMENT_UPDATED
- SERVICE_ACCOUNT_CREATED
- SERVICE_ACCOUNT_DELETED
- SERVICE_ACCOUNT_UPDATED
- USER_CREATED
- USER_DELETED
- USER_UPDATED

I added the events that I thought were relevant based on my own
discretion. Know of any event we should add? Let me know and I'll add it
🙂

For now I only added these events to the new Slack App integration, but
we can add them to the other integrations as well since they are now
supported.

The event formatter was refactored and changed quite a bit in order to
make it easier to maintain and add new events in the future. As a
result, events are now posted with different text. Do we consider this a
breaking change? If so, I can keep the old event formatter around,
create a new one and only use it for the new Slack App integration.

I noticed we don't have good 404 behaviors in the UI for things that are
deleted in the meantime, that's why I avoided some links to specific
resources (like feature strategies, integration configurations, etc),
but we could add them later if we improve this.

This PR also tries to add some consistency to the the way we log events.
2023-09-29 16:11:59 +01:00

493 lines
15 KiB
TypeScript

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';
const testCases: [string, IEvent][] = [
[
'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',
},
],
...[IN, NOT_IN, STR_CONTAINS, STR_STARTS_WITH, STR_ENDS_WITH].map(
(operator) =>
<[string, IEvent]>[
'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',
},
],
),
...[
NUM_EQ,
NUM_GT,
NUM_GTE,
NUM_LT,
NUM_LTE,
DATE_BEFORE,
DATE_AFTER,
SEMVER_EQ,
SEMVER_GT,
SEMVER_LT,
].map(
(operator) =>
<[string, IEvent]>[
`when default strategy updated with numeric constraint ${operator}`,
{
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',
},
],
];
testCases.forEach(([description, event]) =>
test(`Should format specialised text for events ${description}`, () => {
const formatter = new FeatureEventFormatterMd('unleashUrl');
const formattedEvent = formatter.format(event);
expect(formattedEvent).toMatchSnapshot();
}),
);