-
Notifications
You must be signed in to change notification settings - Fork 29
/
pullRequest.test.ts
120 lines (103 loc) 路 3.28 KB
/
pullRequest.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { Octokit } from '@octokit/rest';
import git from 'isomorphic-git';
import { getPullRequestNumber } from './pullRequest';
jest.mock('@octokit/rest');
jest.mock('isomorphic-git');
const mockClient = {
repos: {
listPullRequestsAssociatedWithCommit: jest.fn(),
},
};
beforeEach(() => jest.mocked(Octokit).mockReturnValue(mockClient as never));
afterEach(jest.resetAllMocks);
describe('getPullRequestNumber', () => {
it('prefers a Buildkite environment variable', async () => {
await expect(
getPullRequestNumber({ env: { BUILDKITE_PULL_REQUEST: '123' } }),
).resolves.toBe(123);
expect(Octokit).not.toHaveBeenCalled();
});
it('prefers a GitHub Actions environment variable', async () => {
await expect(
getPullRequestNumber({ env: { GITHUB_REF: 'refs/pull/456/merge' } }),
).resolves.toBe(456);
expect(Octokit).not.toHaveBeenCalled();
});
it('falls back to the most recently updated pull request from the GitHub API', async () => {
jest.mocked(git.log).mockResolvedValue([{ oid: 'commit-id' }] as never);
jest
.mocked(git.listRemotes)
.mockResolvedValue([
{ remote: 'origin', url: 'git@github.com:seek-oss/skuba.git' },
]);
mockClient.repos.listPullRequestsAssociatedWithCommit.mockResolvedValue({
data: [
{
created_at: new Date(0).toISOString(),
locked: false,
number: 1,
state: 'open',
updated_at: new Date(0).toISOString(),
},
{
created_at: new Date(0).toISOString(),
locked: false,
number: 2,
state: 'open',
updated_at: new Date(1).toISOString(),
},
{
created_at: new Date(1).toISOString(),
locked: false,
number: 3,
state: 'open',
updated_at: new Date(0).toISOString(),
},
{
created_at: new Date(2).toISOString(),
locked: false,
number: 4,
state: 'closed',
updated_at: new Date(2).toISOString(),
},
{
created_at: new Date(2).toISOString(),
locked: true,
number: 5,
state: 'open',
updated_at: new Date(2).toISOString(),
},
],
});
await expect(getPullRequestNumber({ env: {} })).resolves.toBe(2);
expect(
mockClient.repos.listPullRequestsAssociatedWithCommit,
).toHaveBeenCalledTimes(1);
expect(
mockClient.repos.listPullRequestsAssociatedWithCommit.mock.calls[0][0],
).toMatchInlineSnapshot(`
{
"commit_sha": "commit-id",
"owner": "seek-oss",
"repo": "skuba",
}
`);
expect(Octokit).toHaveBeenCalledTimes(1);
});
it('throws on an empty response from the GitHub API', async () => {
jest.mocked(git.log).mockResolvedValue([{ oid: 'commit-id' }] as never);
jest
.mocked(git.listRemotes)
.mockResolvedValue([
{ remote: 'origin', url: 'git@github.com:seek-oss/skuba.git' },
]);
mockClient.repos.listPullRequestsAssociatedWithCommit.mockResolvedValue({
data: [],
});
await expect(
getPullRequestNumber({ env: {} }),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"Commit commit-id is not associated with an open GitHub pull request"`,
);
});
});