From b8b578337882f1833689c263234b51f6106f41c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:04:57 +0200 Subject: [PATCH 01/12] chore: creates a new 'MergeRequestOpened' reaction --- src/reactions/gitlab/merge-request-opened.ts | 26 +++++++++++++++++++ .../gitlab/merge-request-opened.spec.ts | 16 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/reactions/gitlab/merge-request-opened.ts create mode 100644 test/reactions/gitlab/merge-request-opened.spec.ts diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts new file mode 100644 index 0000000..8305627 --- /dev/null +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -0,0 +1,26 @@ +import { Reaction } from '../github/reaction'; + +export class MergeRequestOpened extends Reaction { + getStreamLabsMessage({ + payload, + }: import('../github/reaction').ReactionHandleOptions< + import('../../schemas/github/webhook-payload').WebhookPayload + >): string { + throw new Error('Method not implemented.'); + } + getTwitchChatMessage({ + payload, + }: import('../github/reaction').ReactionHandleOptions< + import('../../schemas/github/webhook-payload').WebhookPayload + >): string { + throw new Error('Method not implemented.'); + } + canHandle({ + payload, + event, + }: import('../github/reaction').ReactionCanHandleOptions< + import('../../schemas/github/webhook-payload').WebhookPayload + >): boolean { + throw new Error('Method not implemented.'); + } +} diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts new file mode 100644 index 0000000..9de56d3 --- /dev/null +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -0,0 +1,16 @@ +import { StreamLabsMock } from '../../__mocks__/StreamLabs'; +import { TwitchChatMock } from '../../__mocks__/TwitchChat'; +import { MergeRequestOpened } from '../../../src/reactions/gitlab/merge-request-opened'; + +describe('MergeRequestOpened', () => { + const twitchChat = new TwitchChatMock(); + const streamlabs = new StreamLabsMock(); + + describe('#canHandle', () => { + it("creates a new 'MergeRequestOpened' reaction", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + expect(subject).not.toBeNull(); + }); + }); +}); From b9ceca8d1f41be8b5166449365fc1b70ecd5e5a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:07:48 +0200 Subject: [PATCH 02/12] chore: returns true if the event is 'Merge Request Hook' and 'object_attributes.state' is 'opened' --- src/reactions/gitlab/merge-request-opened.ts | 25 +++++-------------- .../gitlab/merge-request-opened.spec.ts | 11 ++++++++ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 8305627..9265a58 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -1,26 +1,13 @@ -import { Reaction } from '../github/reaction'; +import { Reaction, ReactionHandleOptions, ReactionCanHandleOptions } from '../github/reaction'; -export class MergeRequestOpened extends Reaction { - getStreamLabsMessage({ - payload, - }: import('../github/reaction').ReactionHandleOptions< - import('../../schemas/github/webhook-payload').WebhookPayload - >): string { +export class MergeRequestOpened extends Reaction { + getStreamLabsMessage({ payload }: ReactionHandleOptions): string { throw new Error('Method not implemented.'); } - getTwitchChatMessage({ - payload, - }: import('../github/reaction').ReactionHandleOptions< - import('../../schemas/github/webhook-payload').WebhookPayload - >): string { + getTwitchChatMessage({ payload }: ReactionHandleOptions): string { throw new Error('Method not implemented.'); } - canHandle({ - payload, - event, - }: import('../github/reaction').ReactionCanHandleOptions< - import('../../schemas/github/webhook-payload').WebhookPayload - >): boolean { - throw new Error('Method not implemented.'); + canHandle({ payload, event }: ReactionCanHandleOptions): boolean { + return true; } } diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index 9de56d3..b7fda51 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -12,5 +12,16 @@ describe('MergeRequestOpened', () => { expect(subject).not.toBeNull(); }); + + it("returns true if the event is 'Merge Request Hook' and 'object_attributes.state' is 'opened'", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + const result = subject.canHandle({ + event: 'Merge Request Hook', + payload: { object_attributes: { state: 'opened' } }, + }); + + expect(result).toEqual(true); + }); }); }); From c1d5170b1bfffad9bcba13e5b0f65d2e87305783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:09:21 +0200 Subject: [PATCH 03/12] chore: returns false if the event is 'Fork' and 'object_attributes.state' is 'opened' --- src/reactions/gitlab/merge-request-opened.ts | 2 +- test/reactions/gitlab/merge-request-opened.spec.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 9265a58..5cde18e 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -8,6 +8,6 @@ export class MergeRequestOpened extends Reaction { throw new Error('Method not implemented.'); } canHandle({ payload, event }: ReactionCanHandleOptions): boolean { - return true; + return event === 'Merge Request Hook'; } } diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index b7fda51..c50edb2 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -23,5 +23,16 @@ describe('MergeRequestOpened', () => { expect(result).toEqual(true); }); + + it("returns false if the event is 'Fork' and 'object_attributes.state' is 'opened'", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + const result = subject.canHandle({ + event: 'Fork', + payload: { object_attributes: { state: 'opened' } }, + }); + + expect(result).toEqual(false); + }); }); }); From 3e938ffc5256dd124510d3533eae39a6cd2d4b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:12:13 +0200 Subject: [PATCH 04/12] chore: returns false if the event is 'Merge Request Hook' and 'object_attributes.state' is 'merged' --- src/reactions/gitlab/merge-request-opened.ts | 2 +- test/reactions/gitlab/merge-request-opened.spec.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 5cde18e..d442457 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -8,6 +8,6 @@ export class MergeRequestOpened extends Reaction { throw new Error('Method not implemented.'); } canHandle({ payload, event }: ReactionCanHandleOptions): boolean { - return event === 'Merge Request Hook'; + return event === 'Merge Request Hook' && payload.object_attributes.state === 'opened'; } } diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index c50edb2..8eebfaf 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -34,5 +34,16 @@ describe('MergeRequestOpened', () => { expect(result).toEqual(false); }); + + it("returns false if the event is 'Merge Request Hook' and 'object_attributes.state' is 'merged'", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + const result = subject.canHandle({ + event: 'Merge Request Hook', + payload: { object_attributes: { state: 'merged' } }, + }); + + expect(result).toEqual(false); + }); }); }); From f944f8c33b19fe7c36aed1cce0f5dd69e2ea5443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:18:01 +0200 Subject: [PATCH 05/12] chore: returns false if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' but the opener is in the ignore list --- src/reactions/gitlab/merge-request-opened.ts | 8 ++++++-- test/reactions/gitlab/merge-request-opened.spec.ts | 13 +++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index d442457..f404cfd 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -7,7 +7,11 @@ export class MergeRequestOpened extends Reaction { getTwitchChatMessage({ payload }: ReactionHandleOptions): string { throw new Error('Method not implemented.'); } - canHandle({ payload, event }: ReactionCanHandleOptions): boolean { - return event === 'Merge Request Hook' && payload.object_attributes.state === 'opened'; + canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { + return ( + event === 'Merge Request Hook' && + payload.object_attributes.state === 'opened' && + (!config || !config.IGNORE_PR_OPENED_BY.includes(payload.user.username)) + ); } } diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index 8eebfaf..bbd483e 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -1,6 +1,7 @@ import { StreamLabsMock } from '../../__mocks__/StreamLabs'; import { TwitchChatMock } from '../../__mocks__/TwitchChat'; import { MergeRequestOpened } from '../../../src/reactions/gitlab/merge-request-opened'; +import { Config } from '../../../src/config'; describe('MergeRequestOpened', () => { const twitchChat = new TwitchChatMock(); @@ -45,5 +46,17 @@ describe('MergeRequestOpened', () => { expect(result).toEqual(false); }); + + it("returns false if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' but the opener is in the ignore list", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + const result = subject.canHandle({ + event: 'Merge Request Hook', + payload: { object_attributes: { state: 'opened' }, user: { username: 'SantiMA10' } }, + config: { IGNORE_PR_OPENED_BY: ['SantiMA10'] } as Config, + }); + + expect(result).toEqual(false); + }); }); }); From 7c1bc471b375d3f0878c5d7279dd15c0141a1d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:22:13 +0200 Subject: [PATCH 06/12] chore: returns true if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' and the 'IGNORE_PR_OPENED_BY' is empty --- src/reactions/gitlab/merge-request-opened.ts | 4 +++- test/reactions/gitlab/merge-request-opened.spec.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index f404cfd..358e426 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -11,7 +11,9 @@ export class MergeRequestOpened extends Reaction { return ( event === 'Merge Request Hook' && payload.object_attributes.state === 'opened' && - (!config || !config.IGNORE_PR_OPENED_BY.includes(payload.user.username)) + (!config || + !config.IGNORE_PR_OPENED_BY.includes(payload.user.username) || + config.IGNORE_PR_OPENED_BY.length === 0) ); } } diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index bbd483e..138aafe 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -58,5 +58,17 @@ describe('MergeRequestOpened', () => { expect(result).toEqual(false); }); + + it("returns true if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' and the 'IGNORE_PR_OPENED_BY' is empty", () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + + const result = subject.canHandle({ + event: 'Merge Request Hook', + payload: { object_attributes: { state: 'opened' }, user: { username: 'SantiMA10' } }, + config: { IGNORE_PR_OPENED_BY: [] as string[] } as Config, + }); + + expect(result).toEqual(true); + }); }); }); From bb8fee1b14defdb09a0357c2f6acab6a041abbda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:24:42 +0200 Subject: [PATCH 07/12] refactor: returns true if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' and the 'IGNORE_PR_OPENED_BY' is empty --- src/reactions/gitlab/merge-request-opened.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 358e426..d58624a 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -1,4 +1,5 @@ -import { Reaction, ReactionHandleOptions, ReactionCanHandleOptions } from '../github/reaction'; +import { Config } from '../../config'; +import { Reaction, ReactionCanHandleOptions, ReactionHandleOptions } from '../github/reaction'; export class MergeRequestOpened extends Reaction { getStreamLabsMessage({ payload }: ReactionHandleOptions): string { @@ -11,9 +12,15 @@ export class MergeRequestOpened extends Reaction { return ( event === 'Merge Request Hook' && payload.object_attributes.state === 'opened' && - (!config || - !config.IGNORE_PR_OPENED_BY.includes(payload.user.username) || - config.IGNORE_PR_OPENED_BY.length === 0) + this.isAllowedByConfig(config, payload) + ); + } + + private isAllowedByConfig(config: Config | undefined, payload: any): boolean { + return ( + !config || + !config.IGNORE_PR_OPENED_BY.includes(payload.user.username) || + config.IGNORE_PR_OPENED_BY.length === 0 ); } } From 0a30c3456d65121499cfaba2f4ca8193fc0de9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:25:31 +0200 Subject: [PATCH 08/12] refactor: returns true if the event is 'Merge Request Hook', 'object_attributes.state' is 'opened' and the 'IGNORE_PR_OPENED_BY' is empty --- src/reactions/gitlab/merge-request-opened.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index d58624a..99d772c 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -1,14 +1,16 @@ import { Config } from '../../config'; import { Reaction, ReactionCanHandleOptions, ReactionHandleOptions } from '../github/reaction'; -export class MergeRequestOpened extends Reaction { - getStreamLabsMessage({ payload }: ReactionHandleOptions): string { +type Payload = any; + +export class MergeRequestOpened extends Reaction { + getStreamLabsMessage({ payload }: ReactionHandleOptions): string { throw new Error('Method not implemented.'); } - getTwitchChatMessage({ payload }: ReactionHandleOptions): string { + getTwitchChatMessage({ payload }: ReactionHandleOptions): string { throw new Error('Method not implemented.'); } - canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { + canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { return ( event === 'Merge Request Hook' && payload.object_attributes.state === 'opened' && @@ -16,7 +18,7 @@ export class MergeRequestOpened extends Reaction { ); } - private isAllowedByConfig(config: Config | undefined, payload: any): boolean { + private isAllowedByConfig(config: Config | undefined, payload: Payload): boolean { return ( !config || !config.IGNORE_PR_OPENED_BY.includes(payload.user.username) || From b0ebefa60cce5b26207fccc7e85c6d32c693b382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:33:09 +0200 Subject: [PATCH 09/12] chore: sends the expected message to TwitchChat --- src/reactions/gitlab/merge-request-opened.ts | 3 ++- .../gitlab/merge-request-opened.spec.ts | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 99d772c..41021fb 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -8,8 +8,9 @@ export class MergeRequestOpened extends Reaction { throw new Error('Method not implemented.'); } getTwitchChatMessage({ payload }: ReactionHandleOptions): string { - throw new Error('Method not implemented.'); + return `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`; } + canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { return ( event === 'Merge Request Hook' && diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index 138aafe..c49c223 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -71,4 +71,22 @@ describe('MergeRequestOpened', () => { expect(result).toEqual(true); }); }); + + describe('#handle', () => { + it('sends the expected message to TwitchChat', async () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + const payload = { + object_attributes: { state: 'opened' }, + user: { username: 'SantiMA10' }, + repository: { homepage: 'https://gitlab.com/streamlabs/webhook' }, + }; + + const { twitchChat: response } = await subject.handle({ payload }); + + expect(response).toEqual({ + notified: true, + message: `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`, + }); + }); + }); }); From 3d881f982ea315d3c5362c541f2b8aa7add556de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:48:37 +0200 Subject: [PATCH 10/12] chore: sends the expected message to StreamLabs --- src/reactions/gitlab/merge-request-opened.ts | 2 +- .../reactions/gitlab/merge-request-opened.spec.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index 41021fb..ebdde94 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -5,7 +5,7 @@ type Payload = any; export class MergeRequestOpened extends Reaction { getStreamLabsMessage({ payload }: ReactionHandleOptions): string { - throw new Error('Method not implemented.'); + return `*${payload.user.username}* just opened a merge request in *${payload.repository.name}*`; } getTwitchChatMessage({ payload }: ReactionHandleOptions): string { return `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`; diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index c49c223..5359a3a 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -88,5 +88,20 @@ describe('MergeRequestOpened', () => { message: `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`, }); }); + + it('sends the expected message to StreamLabs', async () => { + const subject = new MergeRequestOpened(twitchChat, streamlabs); + const payload = { + user: { username: 'SantiMA10' }, + repository: { name: 'streamdevs/webhook' }, + }; + + const { streamlabs: response } = await subject.handle({ payload }); + + expect(response).toEqual({ + notified: true, + message: `*${payload.user.username}* just opened a merge request in *${payload.repository.name}*`, + }); + }); }); }); From 4026ade22d2d497afeefb6222b91ca7bce9593ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:49:29 +0200 Subject: [PATCH 11/12] refactor: sends the expected message to StreamLabs --- src/reactions/gitlab/merge-request-opened.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index ebdde94..e099872 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -7,6 +7,7 @@ export class MergeRequestOpened extends Reaction { getStreamLabsMessage({ payload }: ReactionHandleOptions): string { return `*${payload.user.username}* just opened a merge request in *${payload.repository.name}*`; } + getTwitchChatMessage({ payload }: ReactionHandleOptions): string { return `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`; } From 4cf8a8a3d0138e5b5680dd9c0fac9a68250d5192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Mart=C3=ADn=20Agra?= Date: Thu, 30 Apr 2020 19:53:42 +0200 Subject: [PATCH 12/12] refactor: sends the expected message to StreamLabs --- src/reactions/gitlab/merge-request-opened.ts | 13 ++++++------ src/schemas/gitlab/merge-request-payload.ts | 18 ++++++++++++++++ .../gitlab/merge-request-opened.spec.ts | 21 ++++++++++++------- 3 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 src/schemas/gitlab/merge-request-payload.ts diff --git a/src/reactions/gitlab/merge-request-opened.ts b/src/reactions/gitlab/merge-request-opened.ts index e099872..0d7ffb3 100644 --- a/src/reactions/gitlab/merge-request-opened.ts +++ b/src/reactions/gitlab/merge-request-opened.ts @@ -1,18 +1,17 @@ import { Config } from '../../config'; import { Reaction, ReactionCanHandleOptions, ReactionHandleOptions } from '../github/reaction'; +import { MergeRequestPayload } from '../../schemas/gitlab/merge-request-payload'; -type Payload = any; - -export class MergeRequestOpened extends Reaction { - getStreamLabsMessage({ payload }: ReactionHandleOptions): string { +export class MergeRequestOpened extends Reaction { + getStreamLabsMessage({ payload }: ReactionHandleOptions): string { return `*${payload.user.username}* just opened a merge request in *${payload.repository.name}*`; } - getTwitchChatMessage({ payload }: ReactionHandleOptions): string { + getTwitchChatMessage({ payload }: ReactionHandleOptions): string { return `${payload.user.username} just opened a merge request in ${payload.repository.homepage}`; } - canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { + canHandle({ payload, event, config }: ReactionCanHandleOptions): boolean { return ( event === 'Merge Request Hook' && payload.object_attributes.state === 'opened' && @@ -20,7 +19,7 @@ export class MergeRequestOpened extends Reaction { ); } - private isAllowedByConfig(config: Config | undefined, payload: Payload): boolean { + private isAllowedByConfig(config: Config | undefined, payload: MergeRequestPayload): boolean { return ( !config || !config.IGNORE_PR_OPENED_BY.includes(payload.user.username) || diff --git a/src/schemas/gitlab/merge-request-payload.ts b/src/schemas/gitlab/merge-request-payload.ts new file mode 100644 index 0000000..cc44015 --- /dev/null +++ b/src/schemas/gitlab/merge-request-payload.ts @@ -0,0 +1,18 @@ +type url = string; + +export interface MergeRequestPayload { + user: { + name: string; + username: string; + avatar_url: url; + }; + repository: { + name: string; + url: url; + description: string; + homepage: url; + }; + object_attributes: { + state: 'merged' | 'created' | 'updated' | 'closed' | 'opened'; + }; +} diff --git a/test/reactions/gitlab/merge-request-opened.spec.ts b/test/reactions/gitlab/merge-request-opened.spec.ts index 5359a3a..2af648a 100644 --- a/test/reactions/gitlab/merge-request-opened.spec.ts +++ b/test/reactions/gitlab/merge-request-opened.spec.ts @@ -2,6 +2,7 @@ import { StreamLabsMock } from '../../__mocks__/StreamLabs'; import { TwitchChatMock } from '../../__mocks__/TwitchChat'; import { MergeRequestOpened } from '../../../src/reactions/gitlab/merge-request-opened'; import { Config } from '../../../src/config'; +import { MergeRequestPayload } from '../../../src/schemas/gitlab/merge-request-payload'; describe('MergeRequestOpened', () => { const twitchChat = new TwitchChatMock(); @@ -19,7 +20,7 @@ describe('MergeRequestOpened', () => { const result = subject.canHandle({ event: 'Merge Request Hook', - payload: { object_attributes: { state: 'opened' } }, + payload: { object_attributes: { state: 'opened' } } as MergeRequestPayload, }); expect(result).toEqual(true); @@ -30,7 +31,7 @@ describe('MergeRequestOpened', () => { const result = subject.canHandle({ event: 'Fork', - payload: { object_attributes: { state: 'opened' } }, + payload: { object_attributes: { state: 'opened' } } as MergeRequestPayload, }); expect(result).toEqual(false); @@ -41,7 +42,7 @@ describe('MergeRequestOpened', () => { const result = subject.canHandle({ event: 'Merge Request Hook', - payload: { object_attributes: { state: 'merged' } }, + payload: { object_attributes: { state: 'merged' } } as MergeRequestPayload, }); expect(result).toEqual(false); @@ -52,7 +53,10 @@ describe('MergeRequestOpened', () => { const result = subject.canHandle({ event: 'Merge Request Hook', - payload: { object_attributes: { state: 'opened' }, user: { username: 'SantiMA10' } }, + payload: { + object_attributes: { state: 'opened' }, + user: { username: 'SantiMA10' }, + } as MergeRequestPayload, config: { IGNORE_PR_OPENED_BY: ['SantiMA10'] } as Config, }); @@ -64,7 +68,10 @@ describe('MergeRequestOpened', () => { const result = subject.canHandle({ event: 'Merge Request Hook', - payload: { object_attributes: { state: 'opened' }, user: { username: 'SantiMA10' } }, + payload: { + object_attributes: { state: 'opened' }, + user: { username: 'SantiMA10' }, + } as MergeRequestPayload, config: { IGNORE_PR_OPENED_BY: [] as string[] } as Config, }); @@ -79,7 +86,7 @@ describe('MergeRequestOpened', () => { object_attributes: { state: 'opened' }, user: { username: 'SantiMA10' }, repository: { homepage: 'https://gitlab.com/streamlabs/webhook' }, - }; + } as MergeRequestPayload; const { twitchChat: response } = await subject.handle({ payload }); @@ -94,7 +101,7 @@ describe('MergeRequestOpened', () => { const payload = { user: { username: 'SantiMA10' }, repository: { name: 'streamdevs/webhook' }, - }; + } as MergeRequestPayload; const { streamlabs: response } = await subject.handle({ payload });