Skip to content

Commit 7fb1ee7

Browse files
committed
test: Add tests for ReleaseCreated
1 parent 25f0823 commit 7fb1ee7

4 files changed

Lines changed: 155 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ReleaseCreatedPayloadBuilder } from './release-created-payload-builder';
2+
import { ReleaseCreatedPayload } from '../../src/schemas/github/release-created-payload';
3+
4+
describe('ReleasePayloadBuilder', () => {
5+
describe('#constructor', () => {
6+
it('instantiates a builder with a default valid payload', () => {
7+
const subject = new ReleaseCreatedPayloadBuilder();
8+
9+
expect(subject.getInstance()).toBeTruthy();
10+
});
11+
});
12+
13+
describe('#with', () => {
14+
it('merges values correctly', () => {
15+
const subject = new ReleaseCreatedPayloadBuilder().with({
16+
repository: { html_url: 'hello' },
17+
} as Partial<ReleaseCreatedPayload>);
18+
19+
expect(subject.getInstance()).toEqual(
20+
expect.objectContaining({
21+
repository: {
22+
html_url: 'hello',
23+
full_name: 'streamdevs/webhook',
24+
},
25+
}),
26+
);
27+
});
28+
});
29+
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ReleaseCreatedPayload } from '../../src/schemas/github/release-created-payload';
2+
import { merge } from 'lodash';
3+
4+
export class ReleaseCreatedPayloadBuilder {
5+
private payload: ReleaseCreatedPayload = {
6+
sender: {
7+
login: 'orestes',
8+
},
9+
repository: {
10+
full_name: 'streamdevs/webhook',
11+
html_url: 'http://github.com/streamdevs/webhook',
12+
},
13+
action: 'created',
14+
release: {
15+
tag_name: '1.0.0',
16+
html_url: 'http://github.com/streamdevs/webhook/releases/1.0.0',
17+
},
18+
};
19+
20+
getInstance(): ReleaseCreatedPayload {
21+
return this.payload;
22+
}
23+
24+
with(values: Partial<ReleaseCreatedPayload>): ReleaseCreatedPayloadBuilder {
25+
this.payload = merge(this.payload, values);
26+
27+
return this;
28+
}
29+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { ReleaseCreated } from '../../../src/reactions/github/release-created';
2+
import { TwitchChatMock } from '../../__mocks__/TwitchChat';
3+
import { StreamLabsMock } from '../../__mocks__/StreamLabs';
4+
import { ReleaseCreatedPayload } from '../../../src/schemas/github/release-created-payload';
5+
import { ReleaseCreatedPayloadBuilder } from '../../builders/release-created-payload-builder';
6+
7+
describe('ReleaseCreated', () => {
8+
let twitchChat: TwitchChatMock;
9+
let streamLabs: StreamLabsMock;
10+
11+
beforeEach(() => {
12+
twitchChat = new TwitchChatMock();
13+
streamLabs = new StreamLabsMock();
14+
});
15+
16+
describe('#canHandle', () => {
17+
it('returns false when the event is not release', () => {
18+
const subject = new ReleaseCreated(twitchChat, streamLabs);
19+
const event = 'star';
20+
21+
const payload: ReleaseCreatedPayload = {} as ReleaseCreatedPayload;
22+
23+
expect(subject.canHandle({ payload, event })).toEqual(false);
24+
});
25+
it('returns false when the release is not published', () => {
26+
const subject = new ReleaseCreated(twitchChat, streamLabs);
27+
const event = 'release';
28+
29+
const payload = new ReleaseCreatedPayloadBuilder().with({ action: 'created' }).getInstance();
30+
31+
expect(subject.canHandle({ payload, event })).toEqual(false);
32+
});
33+
it('returns true when the release is published', () => {
34+
const subject = new ReleaseCreated(twitchChat, streamLabs);
35+
const event = 'release';
36+
37+
const payload = new ReleaseCreatedPayloadBuilder()
38+
.with({ action: 'published' })
39+
.getInstance();
40+
41+
expect(subject.canHandle({ payload, event })).toEqual(true);
42+
});
43+
});
44+
45+
describe('#getTwitchChatMessage', () => {
46+
const subject = new ReleaseCreated(twitchChat, streamLabs);
47+
const payload = new ReleaseCreatedPayloadBuilder().with({ action: 'published' }).getInstance();
48+
49+
expect(subject.getTwitchChatMessage({ payload })).toEqual(
50+
`streamdevs/webhook version 1.0.0 has just been released 🚀! Check it out http://github.com/streamdevs/webhook/releases/1.0.0`,
51+
);
52+
});
53+
54+
describe('#getStreamLabsMessage', () => {
55+
const subject = new ReleaseCreated(twitchChat, streamLabs);
56+
const payload = new ReleaseCreatedPayloadBuilder().with({ action: 'published' }).getInstance();
57+
58+
expect(subject.getStreamLabsMessage({ payload })).toEqual(
59+
`*streamdevs/webhook* version *1.0.0* has just been released 🚀!`,
60+
);
61+
});
62+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { initServer } from '../../../src/server';
2+
import { getConfig } from '../../../src/config';
3+
import { StreamLabs } from '../../../src/services/StreamLabs';
4+
import { TwitchChat } from '../../../src/services/TwitchChat';
5+
import { ReleaseCreatedPayloadBuilder } from '../../builders/release-created-payload-builder';
6+
7+
describe('/github', () => {
8+
let streamLabsSpy: jest.SpyInstance<Promise<void>>;
9+
let twitchChatSpy: jest.SpyInstance<Promise<void>>;
10+
11+
beforeEach(() => {
12+
streamLabsSpy = jest.spyOn(StreamLabs.prototype, 'alert');
13+
streamLabsSpy.mockImplementationOnce(jest.fn());
14+
15+
twitchChatSpy = jest.spyOn(TwitchChat.prototype, 'send');
16+
twitchChatSpy.mockImplementationOnce(jest.fn());
17+
});
18+
19+
it('handles release events', async () => {
20+
const payload = new ReleaseCreatedPayloadBuilder().getInstance();
21+
22+
const subject = await initServer(getConfig());
23+
24+
const response = await subject.inject({
25+
method: 'POST',
26+
url: '/github',
27+
payload,
28+
headers: {
29+
'x-github-event': 'release',
30+
},
31+
});
32+
33+
expect(response.statusCode).toEqual(200);
34+
});
35+
});

0 commit comments

Comments
 (0)