Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit cc201cf

Browse files
authored
QUA-360: Add skip diff coverage method (#152)
1 parent 09a7fcd commit cc201cf

File tree

5 files changed

+171
-19
lines changed

5 files changed

+171
-19
lines changed

lib/cc/pull_requests.rb

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,15 @@ def receive_test
66
end
77

88
def receive_pull_request
9-
setup_http
10-
state = @payload["state"]
11-
12-
if %w[pending success failure skipped error].include?(state) && report_status?
13-
send("update_status_#{state}")
14-
else
15-
@response = simple_failure("Unknown state")
16-
end
17-
18-
response
9+
receive_request(%w[pending success failure skipped error], :update_status)
1910
end
2011

2112
def receive_pull_request_coverage
22-
setup_http
23-
state = @payload["state"]
24-
25-
if state == "success" && report_status?
26-
update_coverage_status_success
27-
else
28-
@response = simple_failure("Unknown state")
29-
end
13+
receive_request("success", :update_coverage_status)
14+
end
3015

31-
response
16+
def receive_pull_request_diff_coverage
17+
receive_request("skipped", :update_diff_coverage_status)
3218
end
3319

3420
private
@@ -57,6 +43,10 @@ def update_coverage_status_success
5743
raise NotImplementedError
5844
end
5945

46+
def update_diff_coverage_status_skipped
47+
raise NotImplementedError
48+
end
49+
6050
def update_status_failure
6151
raise NotImplementedError
6252
end
@@ -91,6 +81,19 @@ def receive_test_status
9181
end
9282
end
9383

84+
def receive_request(*permitted_statuses, call_method)
85+
setup_http
86+
state = @payload["state"]
87+
88+
if permitted_statuses.flatten.include?(state) && report_status?
89+
send(call_method.to_s + "_#{state}")
90+
else
91+
@response = simple_failure("Unknown state")
92+
end
93+
94+
response
95+
end
96+
9497
def presenter
9598
CC::Service::PullRequestsPresenter.new(@payload)
9699
end

lib/cc/service.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def self.load_services
3636
issue
3737
pull_request
3838
pull_request_coverage
39+
pull_request_diff_coverage
3940
quality
4041
snapshot
4142
test

lib/cc/services/github_pull_requests.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ def update_coverage_status_success
7171
update_status("success", presenter.coverage_message, "#{config.context}/coverage")
7272
end
7373

74+
def update_diff_coverage_status_skipped
75+
update_status("success", presenter.skipped_message, "#{config.context}/diff-coverage")
76+
update_status("success", presenter.skipped_message, "#{config.context}/total-coverage")
77+
end
78+
7479
def update_status_failure
7580
update_status("failure", presenter.success_message)
7681
end

spec/cc/pull_requests_spec.rb

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
require "spec_helper"
2+
3+
describe CC::PullRequests do
4+
shared_examples "receive method" do
5+
before do
6+
allow(instance).to receive(:report_status?).and_return(true)
7+
expect(instance).to receive(:setup_http)
8+
end
9+
10+
context "when the status is valid" do
11+
let(:instance) { CC::PullRequests.new({}, name: "test", state: payload_status) }
12+
let(:response) do
13+
{
14+
ok: true,
15+
state: 201,
16+
message: "Success",
17+
}
18+
end
19+
20+
it "calls the corresponding method" do
21+
expect(instance).to receive(expected_method_name) do
22+
instance.instance_variable_set(:@response, response)
23+
end
24+
result = instance.send(method_to_call)
25+
26+
expect(result).to eq(response)
27+
end
28+
29+
context "when report_status? is false" do
30+
before { expect(instance).to receive(:report_status?).and_return(false) }
31+
32+
it "returns unknown status message" do
33+
expect(instance).not_to receive(expected_method_name)
34+
result = instance.send(method_to_call)
35+
36+
expect(result).to eq({ ok: false, message: "Unknown state" })
37+
end
38+
end
39+
end
40+
41+
context "when the status is not valid" do
42+
let(:instance) { CC::PullRequests.new({}, name: "test", status: "invalid_status") }
43+
44+
it "returns unknown status message" do
45+
expect(instance).not_to receive(expected_method_name)
46+
result = instance.send(method_to_call)
47+
48+
expect(result).to eq({ ok: false, message: "Unknown state" })
49+
end
50+
end
51+
end
52+
53+
describe "#receive_test" do
54+
let(:instance) { CC::PullRequests.new({}, name: "test") }
55+
56+
before do
57+
expect(instance).to receive(:base_status_url) do |param|
58+
"some_url" + param
59+
end
60+
expect(instance).to receive(:setup_http)
61+
end
62+
63+
it "makes a raw http test post" do
64+
expect_any_instance_of(CC::Service::HTTP).to receive(:raw_post).with(
65+
"some_url" + ("0" * 40),
66+
{ state: "success" }.to_json
67+
)
68+
69+
instance.receive_test
70+
end
71+
72+
context "when raising an HTTPError" do
73+
context "when message is equal to test_status_code" do
74+
it "returns an ok message" do
75+
expect(instance).to receive(:test_status_code) { 777 }
76+
expect(instance).to receive(:raw_post).
77+
and_raise(CC::Service::HTTPError.new("error", status: 777))
78+
79+
result = instance.receive_test
80+
expect(result).to include(
81+
ok: true,
82+
status: 777,
83+
message: "Access token is valid"
84+
)
85+
end
86+
end
87+
88+
context "when message is different than test_status_code" do
89+
it "raises the error" do
90+
expect(instance).to receive(:test_status_code) { 777 }
91+
expect(instance).to receive(:raw_post).
92+
and_raise(CC::Service::HTTPError.new("error", status: 000))
93+
94+
expect { instance.receive_test }.to raise_error
95+
end
96+
end
97+
end
98+
end
99+
100+
describe "#receive_pull_request" do
101+
let(:payload_status) { "skipped" }
102+
let(:expected_method_name) { :update_status_skipped }
103+
let(:method_to_call) { :receive_pull_request }
104+
105+
it_behaves_like "receive method"
106+
end
107+
108+
describe "#receive_pull_request_coverage" do
109+
let(:payload_status) { "success" }
110+
let(:expected_method_name) { :update_coverage_status_success }
111+
let(:method_to_call) { :receive_pull_request_coverage }
112+
113+
it_behaves_like "receive method"
114+
end
115+
116+
describe "#receive_pull_request_diff_coverage" do
117+
let(:payload_status) { "skipped" }
118+
let(:expected_method_name) { :update_diff_coverage_status_skipped }
119+
let(:method_to_call) { :receive_pull_request_diff_coverage }
120+
121+
it_behaves_like "receive method"
122+
end
123+
end

spec/cc/service/github_pull_requests_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@
8282
covered_percent_delta: 2.0)
8383
end
8484

85+
it "pull request diff coverage skipped" do
86+
expect_status_update("pbrisbin/foo", "abc123", "state" => "success",
87+
"description" => /skipped analysis/, "context" => /diff-coverage/)
88+
expect_status_update("pbrisbin/foo", "abc123", "state" => "success",
89+
"description" => /skipped analysis/, "context" => /total-coverage/)
90+
91+
receive_pull_request_diff_coverage({},
92+
github_slug: "pbrisbin/foo",
93+
commit_sha: "abc123",
94+
state: "skipped")
95+
end
96+
8597
it "pull request status test success" do
8698
http_stubs.post("/repos/pbrisbin/foo/statuses/#{"0" * 40}") { |_env| [422, {}, ""] }
8799

@@ -213,6 +225,14 @@ def receive_pull_request_coverage(config, event_data)
213225
)
214226
end
215227

228+
def receive_pull_request_diff_coverage(config, event_data)
229+
service_receive(
230+
CC::Service::GitHubPullRequests,
231+
{ oauth_token: "123" }.merge(config),
232+
{ name: "pull_request_diff_coverage" }.merge(event_data),
233+
)
234+
end
235+
216236
def receive_test(config, event_data = {})
217237
service_receive(
218238
CC::Service::GitHubPullRequests,

0 commit comments

Comments
 (0)