Skip to content

Commit 358808a

Browse files
authored
Merge pull request #154 from streamdevs/152-gitlab-mr-merged
feat: new 'MergeRequestMerged' reaction
2 parents 2bfe167 + 8d3bad2 commit 358808a

File tree

4 files changed

+148
-0
lines changed

4 files changed

+148
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { MergeRequestPayload } from '../../schemas/gitlab/merge-request-payload';
2+
import { Reaction, ReactionCanHandleOptions, ReactionHandleOptions } from '../github/reaction';
3+
4+
export class MergeRequestMerged extends Reaction<MergeRequestPayload> {
5+
getStreamLabsMessage({ payload }: ReactionHandleOptions<MergeRequestPayload>): string {
6+
return `The merge request from *${payload.user.username}* has been merged into *${payload.repository.name}*`;
7+
}
8+
9+
getTwitchChatMessage({ payload }: ReactionHandleOptions<MergeRequestPayload>): string {
10+
return `The merge request from ${payload.user.username} has been merged into ${payload.repository.homepage}`;
11+
}
12+
13+
canHandle({ payload, event }: ReactionCanHandleOptions<MergeRequestPayload>): boolean {
14+
return event === 'Merge Request Hook' && payload.object_attributes.state === 'merged';
15+
}
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
type url = string;
2+
3+
export interface MergeRequestPayload {
4+
user: {
5+
name: string;
6+
username: string;
7+
avatar_url: url;
8+
};
9+
repository: {
10+
name: string;
11+
url: url;
12+
description: string;
13+
homepage: url;
14+
};
15+
object_attributes: {
16+
state: 'merged' | 'created' | 'updated' | 'closed' | 'opened';
17+
};
18+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { MergeRequestPayload } from '../../../../src/schemas/gitlab/merge-request-payload';
2+
import { merge } from 'lodash';
3+
4+
export class MergeRequestPayloadBuilder {
5+
private payload: MergeRequestPayload = {
6+
user: {
7+
name: 'Administrator',
8+
username: 'root',
9+
avatar_url:
10+
'http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon',
11+
},
12+
repository: {
13+
name: 'Gitlab Test',
14+
url: 'http://example.com/gitlabhq/gitlab-test.git',
15+
description: 'Aut reprehenderit ut est.',
16+
homepage: 'http://example.com/gitlabhq/gitlab-test',
17+
},
18+
object_attributes: {
19+
state: 'merged',
20+
},
21+
};
22+
23+
public with(payload: Partial<MergeRequestPayload>): MergeRequestPayloadBuilder {
24+
merge(this.payload, payload);
25+
26+
return this;
27+
}
28+
29+
public getInstance(): MergeRequestPayload {
30+
return this.payload;
31+
}
32+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { MergeRequestMerged } from '../../../src/reactions/gitlab/merge-request-merged';
2+
import { MergeRequestPayloadBuilder } from '../../builders/payload/gitlab/merge-request-payload-builder';
3+
import { StreamLabsMock } from '../../__mocks__/StreamLabs';
4+
import { TwitchChatMock } from '../../__mocks__/TwitchChat';
5+
6+
describe('MergeRequestMerged', () => {
7+
const twitchChat = new TwitchChatMock();
8+
const streamlabs = new StreamLabsMock();
9+
10+
describe('#canHandle', () => {
11+
it("returns true if the event is 'Merge Request Hook' and 'object_attributes.state' is 'merged'", () => {
12+
const payload = new MergeRequestPayloadBuilder()
13+
.with({ object_attributes: { state: 'merged' } })
14+
.getInstance();
15+
const subject = new MergeRequestMerged(twitchChat, streamlabs);
16+
17+
const result = subject.canHandle({ event: 'Merge Request Hook', payload });
18+
19+
expect(result).toEqual(true);
20+
});
21+
22+
it("returns false if the event is 'test' and 'object_attributes.state' is 'merged'", () => {
23+
const payload = new MergeRequestPayloadBuilder()
24+
.with({ object_attributes: { state: 'merged' } })
25+
.getInstance();
26+
const subject = new MergeRequestMerged(twitchChat, streamlabs);
27+
28+
const result = subject.canHandle({ event: 'test', payload });
29+
30+
expect(result).toEqual(false);
31+
});
32+
33+
it("returns false if the event is 'Merge Request Hook' and 'object_attributes.state' is 'opened'", () => {
34+
const payload = new MergeRequestPayloadBuilder()
35+
.with({ object_attributes: { state: 'opened' } })
36+
.getInstance();
37+
const subject = new MergeRequestMerged(twitchChat, streamlabs);
38+
39+
const result = subject.canHandle({ event: 'Merge Request Hook', payload });
40+
41+
expect(result).toEqual(false);
42+
});
43+
});
44+
45+
describe('#handle', () => {
46+
it("sends the proper message to 'TwitchChat'", async () => {
47+
const payload = new MergeRequestPayloadBuilder()
48+
.with({ object_attributes: { state: 'merged' } })
49+
.getInstance();
50+
const subject = new MergeRequestMerged(twitchChat, streamlabs);
51+
52+
const result = await subject.handle({ payload });
53+
54+
expect(result).toEqual(
55+
expect.objectContaining({
56+
twitchChat: {
57+
notified: true,
58+
message: `The merge request from ${payload.user.username} has been merged into ${payload.repository.homepage}`,
59+
},
60+
}),
61+
);
62+
});
63+
64+
it("sends the proper message to 'StreamLabs'", async () => {
65+
const payload = new MergeRequestPayloadBuilder()
66+
.with({ object_attributes: { state: 'merged' } })
67+
.getInstance();
68+
const subject = new MergeRequestMerged(twitchChat, streamlabs);
69+
70+
const result = await subject.handle({ payload });
71+
72+
expect(result).toEqual(
73+
expect.objectContaining({
74+
streamlabs: {
75+
notified: true,
76+
message: `The merge request from *${payload.user.username}* has been merged into *${payload.repository.name}*`,
77+
},
78+
}),
79+
);
80+
});
81+
});
82+
});

0 commit comments

Comments
 (0)