diff --git a/src/lib/addons/__snapshots__/slack-app.test.ts.snap b/src/lib/addons/__snapshots__/slack-app.test.ts.snap deleted file mode 100644 index a19a23e0b1..0000000000 --- a/src/lib/addons/__snapshots__/slack-app.test.ts.snap +++ /dev/null @@ -1,127 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`SlackAppAddon should not post to unexisting tagged channels 1`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 2, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; - -exports[`SlackAppAddon should post message when feature is toggled 1`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 1, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; - -exports[`SlackAppAddon should post to all channels in tags 1`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 1, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; - -exports[`SlackAppAddon should post to all channels in tags 2`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 2, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; - -exports[`SlackAppAddon should use defaultChannels if no tagged channels are found 1`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 1, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; - -exports[`SlackAppAddon should use defaultChannels if no tagged channels are found 2`] = ` -{ - "attachments": [ - { - "actions": [ - { - "name": "featureToggle", - "style": "primary", - "text": "Open in Unleash", - "type": "button", - "url": "http://some-url.com/projects/default/features/some-toggle", - "value": "featureToggle", - }, - ], - }, - ], - "channel": 2, - "text": "some@user.com *enabled* in *development* environment in project *default*", -} -`; diff --git a/src/lib/addons/slack-app.test.ts b/src/lib/addons/slack-app.test.ts index 02325bbf41..fed3a56c32 100644 --- a/src/lib/addons/slack-app.test.ts +++ b/src/lib/addons/slack-app.test.ts @@ -3,34 +3,16 @@ import SlackAppAddon from './slack-app'; import { ChatPostMessageArguments, ErrorCode } from '@slack/web-api'; const slackApiCalls: ChatPostMessageArguments[] = []; -const conversationsList = jest.fn(); -let postMessage = jest.fn().mockImplementation((options) => { + +let scheduleMessage = jest.fn().mockImplementation((options) => { slackApiCalls.push(options); return Promise.resolve(); }); jest.mock('@slack/web-api', () => ({ WebClient: jest.fn().mockImplementation(() => ({ - conversations: { - list: conversationsList.mockImplementation(() => ({ - channels: [ - { - id: 1, - name: 'general', - }, - { - id: 2, - name: 'another-channel-1', - }, - { - id: 3, - name: 'another-channel-2', - }, - ], - })), - }, chat: { - postMessage, + scheduleMessage, }, on: jest.fn(), })), @@ -78,8 +60,7 @@ describe('SlackAppAddon', () => { beforeEach(() => { jest.useFakeTimers(); slackApiCalls.length = 0; - conversationsList.mockClear(); - postMessage.mockClear(); + scheduleMessage.mockClear(); addon = new SlackAppAddon({ getLogger, unleashUrl: 'http://some-url.com', @@ -88,15 +69,13 @@ describe('SlackAppAddon', () => { afterEach(() => { jest.useRealTimers(); - addon.destroy(); }); it('should post message when feature is toggled', async () => { await addon.handleEvent(event, { accessToken }); expect(slackApiCalls.length).toBe(1); - expect(slackApiCalls[0].channel).toBe(1); - expect(slackApiCalls[0]).toMatchSnapshot(); + expect(slackApiCalls[0].channel).toBe('general'); }); it('should post to all channels in tags', async () => { @@ -111,47 +90,8 @@ describe('SlackAppAddon', () => { await addon.handleEvent(eventWith2Tags, { accessToken }); expect(slackApiCalls.length).toBe(2); - expect(slackApiCalls[0].channel).toBe(1); - expect(slackApiCalls[0]).toMatchSnapshot(); - expect(slackApiCalls[1].channel).toBe(2); - expect(slackApiCalls[1]).toMatchSnapshot(); - }); - - it('should not post to unexisting tagged channels', async () => { - const eventWithUnexistingTaggedChannel: IEvent = { - ...event, - tags: [ - { type: 'slack', value: 'random' }, - { type: 'slack', value: 'another-channel-1' }, - ], - }; - - await addon.handleEvent(eventWithUnexistingTaggedChannel, { - accessToken, - }); - - expect(slackApiCalls.length).toBe(1); - expect(slackApiCalls[0].channel).toBe(2); - expect(slackApiCalls[0]).toMatchSnapshot(); - }); - - it('should cache Slack channels', async () => { - await addon.handleEvent(event, { accessToken }); - await addon.handleEvent(event, { accessToken }); - - expect(slackApiCalls.length).toBe(2); - expect(conversationsList).toHaveBeenCalledTimes(1); - }); - - it('should refresh Slack channels cache after 30 seconds', async () => { - await addon.handleEvent(event, { accessToken }); - - jest.advanceTimersByTime(30000); - - await addon.handleEvent(event, { accessToken }); - - expect(slackApiCalls.length).toBe(2); - expect(conversationsList).toHaveBeenCalledTimes(2); + expect(slackApiCalls[0].channel).toBe('general'); + expect(slackApiCalls[1].channel).toBe('another-channel-1'); }); it('should not post a message if there are no tagged channels and no defaultChannels', async () => { @@ -179,14 +119,12 @@ describe('SlackAppAddon', () => { }); expect(slackApiCalls.length).toBe(2); - expect(slackApiCalls[0].channel).toBe(1); - expect(slackApiCalls[0]).toMatchSnapshot(); - expect(slackApiCalls[1].channel).toBe(2); - expect(slackApiCalls[1]).toMatchSnapshot(); + expect(slackApiCalls[0].channel).toBe('general'); + expect(slackApiCalls[1].channel).toBe('another-channel-1'); }); it('should log error when an API call fails', async () => { - postMessage = jest.fn().mockRejectedValue(mockError); + scheduleMessage = jest.fn().mockRejectedValue(mockError); await addon.handleEvent(event, { accessToken }); @@ -196,7 +134,7 @@ describe('SlackAppAddon', () => { ); }); - it('should handle rejections in chat.postMessage', async () => { + it('should handle rejections in chat.scheduleMessage', async () => { const eventWith3Tags: IEvent = { ...event, tags: [ @@ -206,7 +144,7 @@ describe('SlackAppAddon', () => { ], }; - postMessage = jest + scheduleMessage = jest .fn() .mockResolvedValueOnce({ ok: true }) .mockResolvedValueOnce({ ok: true }) @@ -214,7 +152,7 @@ describe('SlackAppAddon', () => { await addon.handleEvent(eventWith3Tags, { accessToken }); - expect(postMessage).toHaveBeenCalledTimes(3); + expect(scheduleMessage).toHaveBeenCalledTimes(3); expect(loggerMock.warn).toHaveBeenCalledWith( `Error handling event ${FEATURE_ENVIRONMENT_ENABLED}. A platform error occurred: Platform error message`, expect.any(Object), diff --git a/src/lib/addons/slack-app.ts b/src/lib/addons/slack-app.ts index 82a33bb039..bdf61c91d0 100644 --- a/src/lib/addons/slack-app.ts +++ b/src/lib/addons/slack-app.ts @@ -93,7 +93,6 @@ export default class SlackAppAddon extends Addon { }, { type: 'actions', - block_id: url, elements: [ { type: 'button',