From f4aba80763af6626fbbe17825575f16ff4e0e751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Fri, 5 Mar 2021 12:59:35 +0100 Subject: [PATCH] fix: messages to slack for archied toggles (#750) Co-authored-by: Fredrik Strand Oseberg --- snapshots/src/lib/addons/slack.test.js.md | 6 +++ snapshots/src/lib/addons/slack.test.js.snap | Bin 372 -> 459 bytes src/lib/addons/slack.js | 49 ++++++++++++-------- src/lib/addons/slack.test.js | 25 +++++++++- 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/snapshots/src/lib/addons/slack.test.js.md b/snapshots/src/lib/addons/slack.test.js.md index f1e237a0b7..fca1f23fcb 100644 --- a/snapshots/src/lib/addons/slack.test.js.md +++ b/snapshots/src/lib/addons/slack.test.js.md @@ -9,3 +9,9 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 '{"username":"Unleash","icon_emoji":":unleash:","text":"some@user.com created feature toggle \\n*Enabled*: no | *Type*: undefined | *Project*: undefined\\n*Activation strategies*: ```- name: default\\n```","channel":"#undefined","attachments":[{"actions":[{"name":"featureToggle","text":"Open in Unleash","type":"button","value":"featureToggle","style":"primary","url":"http://some-url.com/#/features/strategies/some-toggle"}]}]}' + +## Should call slack webhook for archived toggle + +> Snapshot 1 + + '{"username":"Unleash","icon_emoji":":unleash:","text":"The feature toggle ** was *archived* by some@user.com.","channel":"#undefined","attachments":[{"actions":[{"name":"featureToggle","text":"Open in Unleash","type":"button","value":"featureToggle","style":"primary","url":"http://some-url.com/#/archive/strategies/some-toggle"}]}]}' diff --git a/snapshots/src/lib/addons/slack.test.js.snap b/snapshots/src/lib/addons/slack.test.js.snap index 0b80da9cf33d19c8ecbf81cebbda378fc5210c75..5f6729f149f0b9fee6d56231c3375a87f80ad758 100644 GIT binary patch literal 459 zcmV;+0W|(WRzV6a8dSHy?`#00000000Bk zQax`JF%b3MiBLrm)QMy{MWj_O+pkar#fcJ%qsj;8^GiSKcG#S zACW(hCUhx6O+&-@cEu%8Kg@nE8g8Vao@;M0a=`KWBCb>2eS$&sZ9n)+R&+ly>@m23U9+y`9h(d zO4Qcy#Zkl=4u?G+Mou}AWnJLDA&jO|xikg}8gTP>BZ4KORCx&oy-4?tg;b$w6SvZ} zLk;HFUg-3y0>ic83uTe6PaC5e(HhF9vZx3Q5%WHBGj_?<_#^FQ13cOe>gegVlVjjYoH004>M B(vScE literal 372 zcmV-)0gL`YRzV zkg-k!F${+9K)}QRGe}X`D$4CAgkb0lLzyVhH0SnG<(yN_si<0BfH&eHcm~*5cmo!k zwxS)FNQT&7emn6mk|ar!U01xles&)A)0dCq!}p^!iR+t>?PPBer#s2P)>k@{p#hJo z0-4KOw4j<&o=T$~K0@WjhH)O2Jm(97Ct}pN3NB;inRb=X9uz?#hI|AMg4}3iL7bOF zb)IEW+z#GGZFZ8aR87{9=dzKBVU#S(<{R-v4_h5n0}Dkf7wE)Xw7Sz8I0;z5&>+9c z?8dt>XxhYFd8Nrr6d8wN{S<5Z{eD}-k#oUf6)g3T8BeE6g$R}hJo#~*R)EyV z{B9G%DUB1-Nm=pK3&&G@mY9p_`sg$2GVFx+? Sm#6aip7#&aU0y^R0ssL13aknM diff --git a/src/lib/addons/slack.js b/src/lib/addons/slack.js index 712ea74a4a..6d33101a2f 100644 --- a/src/lib/addons/slack.js +++ b/src/lib/addons/slack.js @@ -36,10 +36,10 @@ class SlackAddon extends Addon { let text; - if (event.type === FEATURE_STALE_ON) { - text = this.generateStaleText(event, true); - } else if (event.type === FEATURE_STALE_OFF) { - text = this.generateStaleText(event, false); + if ([FEATURE_ARCHIVED, FEATURE_REVIVED].includes(event.type)) { + text = this.generateArchivedText(event); + } else if ([FEATURE_STALE_ON, FEATURE_STALE_OFF].includes(event.type)) { + text = this.generateStaleText(event); } else { text = this.generateText(event); } @@ -59,7 +59,7 @@ class SlackAddon extends Addon { type: 'button', value: 'featureToggle', style: 'primary', - url: `${this.unleashUrl}/#/features/strategies/${event.data.name}`, + url: this.featureLink(event), }, ], }, @@ -80,23 +80,38 @@ class SlackAddon extends Addon { this.logger.info(`Handled event ${event.type}. Status codes=${codes}`); } + featureLink(event) { + const path = event.type === FEATURE_ARCHIVED ? 'archive' : 'features'; + return `${this.unleashUrl}/#/${path}/strategies/${event.data.name}`; + } + findSlackChannels({ tags = [] }) { return tags.filter(tag => tag.type === 'slack').map(t => t.value); } - generateStaleText({ createdBy, data }, isStale) { - const feature = `<${this.unleashUrl}/#/features/strategies/${data.name}|${data.name}>`; + generateStaleText(event) { + const { createdBy, data, type } = event; + const isStale = type === FEATURE_STALE_ON; + const feature = `<${this.featureLink(event)}|${data.name}>`; if (isStale) { return `The feature toggle *${feature}* is now *ready to be removed* from the code. :technologist: This was changed by ${createdBy}.`; } - return `The feature toggle *${feature}* was is *unmarked as stale*. This was changed by ${createdBy}.`; + return `The feature toggle *${feature}* was *unmarked as stale* by ${createdBy}.`; } - generateText({ createdBy, data, type }) { - const eventName = this.eventName(type); - const feature = `<${this.unleashUrl}/#/features/strategies/${data.name}|${data.name}>`; + generateArchivedText(event) { + const { createdBy, data, type } = event; + const action = type === FEATURE_ARCHIVED ? 'archived' : 'revived'; + const feature = `<${this.featureLink(event)}|${data.name}>`; + return `The feature toggle *${feature}* was *${action}* by ${createdBy}.`; + } + + generateText(event) { + const { createdBy, data, type } = event; + const action = this.getAction(type); + const feature = `<${this.featureLink(event)}|${data.name}>`; const enabled = `*Enabled*: ${data.enabled ? 'yes' : 'no'}`; const stale = data.stale ? '("stale")' : ''; const typeStr = `*Type*: ${data.type}`; @@ -105,21 +120,17 @@ This was changed by ${createdBy}.`; data.strategies, { skipInvalid: true }, )}\`\`\``; - return `${createdBy} ${eventName} ${feature} + return `${createdBy} ${action} feature toggle ${feature} ${enabled}${stale} | ${typeStr} | ${project} ${strategies}`; } - eventName(type) { + getAction(type) { switch (type) { case FEATURE_CREATED: - return 'created feature toggle'; + return 'created'; case FEATURE_UPDATED: - return 'updated feature toggle'; - case FEATURE_ARCHIVED: - return 'archived feature toggle'; - case FEATURE_REVIVED: - return 'revive feature toggle'; + return 'updated'; default: return type; } diff --git a/src/lib/addons/slack.test.js b/src/lib/addons/slack.test.js index 4e908b3896..205cd5e5a5 100644 --- a/src/lib/addons/slack.test.js +++ b/src/lib/addons/slack.test.js @@ -1,6 +1,6 @@ const test = require('ava'); const proxyquire = require('proxyquire').noCallThru(); -const { FEATURE_CREATED } = require('../event-type'); +const { FEATURE_CREATED, FEATURE_ARCHIVED } = require('../event-type'); const SlackAddon = proxyquire.load('./slack', { './addon': class Addon { @@ -43,6 +43,29 @@ test('Should call slack webhook', async t => { t.snapshot(addon.fetchRetryCalls[0].options.body); }); +test('Should call slack webhook for archived toggle', async t => { + const addon = new SlackAddon({ + getLogger: noLogger, + unleashUrl: 'http://some-url.com', + }); + const event = { + type: FEATURE_ARCHIVED, + createdBy: 'some@user.com', + data: { + name: 'some-toggle', + }, + }; + + const parameters = { + url: 'http://hooks.slack.com', + }; + + await addon.handleEvent(event, parameters); + t.is(addon.fetchRetryCalls.length, 1); + t.is(addon.fetchRetryCalls[0].url, parameters.url); + t.snapshot(addon.fetchRetryCalls[0].options.body); +}); + test('Should use default channel', async t => { const addon = new SlackAddon({ getLogger: noLogger,