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

Commit 910193f

Browse files
committed
Merge pull request #61 from codeclimate/ia-issues-counts-in-pr-messages
Show count of new, fixed issues in PR statuses
2 parents 9789597 + be88d61 commit 910193f

File tree

5 files changed

+124
-2
lines changed

5 files changed

+124
-2
lines changed

codeclimate-services.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
2121
spec.add_dependency "virtus", "1.0.0"
2222
spec.add_dependency "nokogiri", "~> 1.6.0"
2323
spec.add_dependency "activemodel", ">= 3.0"
24+
spec.add_dependency "activesupport", ">= 3.0"
2425
spec.add_development_dependency "bundler", ">= 1.6.2"
2526
spec.add_development_dependency "rake"
2627
spec.add_development_dependency "test-unit"

lib/cc/services/github_pull_requests.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ def update_status_skipped
7070

7171
def update_status_success
7272
add_comment
73-
update_status("success", "Code Climate has analyzed this pull request.")
73+
update_status(
74+
"success",
75+
CC::Service::GitHubPullRequests::Presenter.new(@payload).success_message
76+
)
7477
end
7578

7679
def update_status_error
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class CC::Service::GitHubPullRequests::Presenter
2+
def initialize(payload)
3+
@fixed_count = payload["fixed_issue_count"]
4+
@new_count = payload["new_issue_count"]
5+
end
6+
7+
def success_message
8+
if issue_counts_in_payload?
9+
if both_issue_counts_zero?
10+
"Code Climate didn't find any new or fixed issues."
11+
else
12+
"Code Climate found #{formatted_issue_counts}."
13+
end
14+
else
15+
"Code Climate has analyzed this pull request."
16+
end
17+
end
18+
19+
private
20+
21+
def both_issue_counts_zero?
22+
issue_counts.all?(&:zero?)
23+
end
24+
25+
def formatted_fixed_issues
26+
if @fixed_count > 0
27+
"#{@fixed_count} fixed #{"issue".pluralize(@fixed_count)}"
28+
else
29+
nil
30+
end
31+
end
32+
33+
def formatted_new_issues
34+
if @new_count > 0
35+
"#{@new_count} new #{"issue".pluralize(@new_count)}"
36+
else
37+
nil
38+
end
39+
end
40+
41+
def formatted_issue_counts
42+
[formatted_new_issues, formatted_fixed_issues].compact.to_sentence
43+
end
44+
45+
def issue_counts
46+
[@new_count, @fixed_count]
47+
end
48+
49+
def issue_counts_in_payload?
50+
issue_counts.all?
51+
end
52+
end
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
require File.expand_path('../helper', __FILE__)
2+
3+
class TestGitHubPullRequestsPresenter < CC::Service::TestCase
4+
def test_message_no_issue_counts_in_payload
5+
assert_equal(
6+
"Code Climate has analyzed this pull request.",
7+
message_from_payload({})
8+
)
9+
end
10+
11+
def test_message_singular
12+
assert_equal(
13+
"Code Climate found 1 new issue and 1 fixed issue.",
14+
message_from_payload("fixed_issue_count" => 1, "new_issue_count" => 1)
15+
)
16+
end
17+
18+
def test_message_plural
19+
assert_equal(
20+
"Code Climate found 2 new issues and 1 fixed issue.",
21+
message_from_payload("fixed_issue_count" => 1, "new_issue_count" => 2)
22+
)
23+
end
24+
25+
def test_message_only_fixed
26+
assert_equal(
27+
"Code Climate found 1 fixed issue.",
28+
message_from_payload("fixed_issue_count" => 1, "new_issue_count" => 0)
29+
)
30+
end
31+
32+
def test_message_only_new
33+
assert_equal(
34+
"Code Climate found 3 new issues.",
35+
message_from_payload("fixed_issue_count" => 0, "new_issue_count" => 3)
36+
)
37+
end
38+
39+
def test_message_no_new_or_fixed
40+
assert_equal(
41+
"Code Climate didn't find any new or fixed issues.",
42+
message_from_payload("fixed_issue_count" => 0, "new_issue_count" => 0)
43+
)
44+
end
45+
46+
private
47+
48+
def message_from_payload(payload)
49+
CC::Service::GitHubPullRequests::Presenter.new(payload).success_message
50+
end
51+
end

test/github_pull_requests_test.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,22 @@ def test_pull_request_status_pending
1414
})
1515
end
1616

17-
def test_pull_request_status_success
17+
def test_pull_request_status_success_detailed
18+
expect_status_update("pbrisbin/foo", "abc123", {
19+
"state" => "success",
20+
"description" => "Code Climate found 1 new issue and 2 fixed issues.",
21+
})
22+
23+
receive_pull_request({ update_status: true }, {
24+
github_slug: "pbrisbin/foo",
25+
commit_sha: "abc123",
26+
state: "success",
27+
new_issue_count: 1,
28+
fixed_issue_count: 2,
29+
})
30+
end
31+
32+
def test_pull_request_status_success_generic
1833
expect_status_update("pbrisbin/foo", "abc123", {
1934
"state" => "success",
2035
"description" => /has analyzed/,

0 commit comments

Comments
 (0)