Skip to content
This repository was archived by the owner on Nov 8, 2018. It is now read-only.

Commit b8ebec3

Browse files
nat-hendersonjtarchie
authored andcommitted
Add tests for filters.
1 parent 1ebf079 commit b8ebec3

File tree

3 files changed

+93
-7
lines changed

3 files changed

+93
-7
lines changed

spec/commands/check_spec.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,17 @@ def stub_json(uri, body)
1717
.to_return(headers: { 'Content-Type' => 'application/json' }, body: body.to_json)
1818
end
1919

20+
def stub_prs(uri, body)
21+
stub_json(uri, body)
22+
body.each do |pr|
23+
stub_json(uri.sub('pulls', 'pulls/' + pr[:number].to_s).sub('&per_page=100', ''), pr)
24+
end
25+
end
26+
2027
context 'when targetting a base branch other than master' do
2128
before do
2229
stub_json('https://api.github.com/repos/jtarchie/test/statuses/abcdef', [])
23-
stub_json('https://api.github.com:443/repos/jtarchie/test/pulls?base=my-base-branch&direction=asc&per_page=100&sort=updated&state=open', [{ number: 1, head: { sha: 'abcdef' } }])
30+
stub_prs('https://api.github.com:443/repos/jtarchie/test/pulls?base=my-base-branch&direction=asc&per_page=100&sort=updated&state=open', [{ number: 1, head: { sha: 'abcdef' } }])
2431
end
2532

2633
it 'retrieves pull requests for the specified base branch' do
@@ -48,7 +55,7 @@ def stub_json(uri, body)
4855

4956
context 'when there is an open pull request' do
5057
before do
51-
stub_json('https://api.github.com:443/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open', [{ number: 1, head: { sha: 'abcdef' } }])
58+
stub_prs('https://api.github.com:443/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open', [{ number: 1, head: { sha: 'abcdef' } }])
5259
end
5360

5461
it 'returns SHA of the pull request' do
@@ -79,7 +86,7 @@ def stub_json(uri, body)
7986

8087
context 'when there is more than one open pull request' do
8188
before do
82-
stub_json('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open', [
89+
stub_prs('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open', [
8390
{ number: 1, head: { sha: 'abcdef', repo: { full_name: 'jtarchie/test' } }, base: { repo: { full_name: 'jtarchie/test' } } },
8491
{ number: 2, head: { sha: 'zyxwvu', repo: { full_name: 'someotherowner/repo' } }, base: { repo: { full_name: 'jtarchie/test' } } }
8592
])
@@ -119,7 +126,9 @@ def stub_cache_json(uri)
119126
end
120127

121128
stub_body_json('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open', pull_requests[0..49], 'Link' => '<https://api.github.com/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open&page=2>; rel="next"')
129+
stub_prs('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&sort=updated&state=open', pull_requests[0..49])
122130
stub_body_json('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&per_page=100&sort=updated&state=open&page=2', pull_requests[50..99])
131+
stub_prs('https://api.github.com/repos/jtarchie/test/pulls?direction=asc&sort=updated&state=open', pull_requests[50..99])
123132

124133
first_prs = check('source' => { 'repo' => 'jtarchie/test' })
125134
expect(first_prs.length).to eq 100

spec/filters/approval_spec.rb

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
require_relative '../../assets/lib/filters/approval'
2+
require_relative '../../assets/lib/pull_request'
3+
require_relative '../../assets/lib/input'
4+
require 'webmock/rspec'
5+
6+
describe Filters::Approval do
7+
let(:ignore_pr) do
8+
PullRequest.new(pr: { 'number' => 1, 'head' => { 'sha' => 'abc' }, 'author_association' => 'NONE',
9+
'base' => { 'repo' => {'full_name' => 'user/repo', 'permissions' => {'push' => true} } } })
10+
end
11+
12+
let(:pr) do
13+
PullRequest.new(pr: { 'number' => 2, 'head' => { 'sha' => 'def' }, 'author_association' => 'OWNER',
14+
'base' => { 'repo' => {'full_name' => 'user/repo', 'permissions' => {'push' => true} } } })
15+
end
16+
17+
let(:pull_requests) { [ignore_pr, pr] }
18+
19+
def stub_json(uri, body)
20+
stub_request(:get, uri)
21+
.to_return(headers: { 'Content-Type' => 'application/json' }, body: body.to_json)
22+
end
23+
24+
context 'when all approval requirements are disabled' do
25+
it 'does not filter' do
26+
payload = { 'source' => { 'repo' => 'user/repo' } }
27+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
28+
29+
expect(filter.pull_requests).to eq pull_requests
30+
end
31+
32+
it 'does not filter when explictly disabled' do
33+
payload = { 'source' => { 'repo' => 'user/repo', 'require_manual_approval' => false, 'require_review_approval' => false, 'authorship_restriction' => false } }
34+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
35+
36+
expect(filter.pull_requests).to eq pull_requests
37+
end
38+
end
39+
40+
context 'when owner filtering is enabled' do
41+
it 'only returns PRs that are repo-owners' do
42+
payload = { 'source' => { 'repo' => 'user/repo', 'require_manual_approval' => false, 'require_review_approval' => false, 'authorship_restriction' => true } }
43+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
44+
45+
expect(filter.pull_requests).to eq [pr]
46+
end
47+
end
48+
49+
context 'when approval filtering is enabled' do
50+
before do
51+
stub_json(%r{https://api.github.com/repos/user/repo/pulls/1/reviews}, [{ 'state' => 'CHANGES_REQUESTED' }])
52+
stub_json(%r{https://api.github.com/repos/user/repo/pulls/2/reviews}, [{ 'state' => 'APPROVED' }])
53+
end
54+
55+
it 'only returns PRs that are approved' do
56+
payload = { 'source' => { 'repo' => 'user/repo', 'require_manual_approval' => false, 'require_review_approval' => true, 'authorship_restriction' => false } }
57+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
58+
59+
expect(filter.pull_requests).to eq [pr]
60+
end
61+
end
62+
63+
context 'when manual approval filtering is enabled' do
64+
before do
65+
stub_json(%r{https://api.github.com/repos/user/repo/pulls/1/comments}, [{ 'author_association' => 'OWNER', 'body' => 'other comment' },
66+
{ 'author_association' => 'NONE', 'body' => 'ci ok' }])
67+
stub_json(%r{https://api.github.com/repos/user/repo/pulls/2/comments}, [{ 'author_association' => 'OWNER', 'body' => 'ci ok' }])
68+
end
69+
70+
it 'only returns PRs that are approved' do
71+
payload = { 'source' => { 'repo' => 'user/repo', 'require_manual_approval' => true, 'require_review_approval' => false, 'authorship_restriction' => false } }
72+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
73+
74+
expect(filter.pull_requests).to eq [pr]
75+
end
76+
end
77+
78+
79+
end

spec/filters/mergeable_spec.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55

66
describe Filters::Mergeable do
77
let(:ignore_pr) do
8-
PullRequest.new(pr: { 'number' => 1, 'head' => { 'sha' => 'abc' }, 'mergeable' => false,
9-
'base' => { 'repo' => {'full_name' => 'user/repo', 'permissions' => {'push' => true} } } })
8+
PullRequest.new(pr: { 'number' => 1, 'head' => { 'sha' => 'abc' }, 'mergeable' => false})
109
end
1110

1211
let(:pr) do
13-
PullRequest.new(pr: { 'number' => 2, 'head' => { 'sha' => 'def' }, 'mergeable' => true ,
14-
'base' => { 'repo' => {'full_name' => 'user/repo', 'permissions' => {'push' => true} } } })
12+
PullRequest.new(pr: { 'number' => 2, 'head' => { 'sha' => 'def' }, 'mergeable' => true})
1513
end
1614

1715
let(:pull_requests) { [ignore_pr, pr] }

0 commit comments

Comments
 (0)