codeclimate-services 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/.rubocop.yml +1 -0
  4. data/Gemfile +1 -2
  5. data/Rakefile +4 -7
  6. data/base_rubocop.yml +152 -0
  7. data/bin/bundler +5 -5
  8. data/bin/coderay +5 -5
  9. data/bin/nokogiri +5 -5
  10. data/bin/pry +5 -5
  11. data/bin/rake +5 -5
  12. data/codeclimate-services.gemspec +15 -15
  13. data/config/load.rb +2 -2
  14. data/lib/cc/formatters/linked_formatter.rb +2 -2
  15. data/lib/cc/formatters/snapshot_formatter.rb +10 -10
  16. data/lib/cc/formatters/ticket_formatter.rb +0 -2
  17. data/lib/cc/helpers/quality_helper.rb +2 -2
  18. data/lib/cc/helpers/vulnerability_helper.rb +0 -2
  19. data/lib/cc/presenters/pull_requests_presenter.rb +1 -5
  20. data/lib/cc/pull_requests.rb +7 -3
  21. data/lib/cc/service.rb +9 -10
  22. data/lib/cc/service/formatter.rb +3 -3
  23. data/lib/cc/service/helper.rb +2 -3
  24. data/lib/cc/service/http.rb +9 -9
  25. data/lib/cc/service/invocation.rb +6 -6
  26. data/lib/cc/service/invocation/with_error_handling.rb +9 -8
  27. data/lib/cc/service/invocation/with_metrics.rb +4 -4
  28. data/lib/cc/service/invocation/with_return_values.rb +0 -1
  29. data/lib/cc/service/response_check.rb +4 -5
  30. data/lib/cc/services.rb +2 -2
  31. data/lib/cc/services/asana.rb +8 -9
  32. data/lib/cc/services/campfire.rb +2 -3
  33. data/lib/cc/services/flowdock.rb +5 -5
  34. data/lib/cc/services/github_issues.rb +6 -7
  35. data/lib/cc/services/github_pull_requests.rb +42 -5
  36. data/lib/cc/services/gitlab_merge_requests.rb +6 -2
  37. data/lib/cc/services/hipchat.rb +3 -4
  38. data/lib/cc/services/jira.rb +8 -9
  39. data/lib/cc/services/lighthouse.rb +4 -5
  40. data/lib/cc/services/pivotal_tracker.rb +6 -7
  41. data/lib/cc/services/slack.rb +8 -8
  42. data/lib/cc/services/stash_pull_requests.rb +2 -2
  43. data/lib/cc/services/version.rb +1 -1
  44. data/pull_request_test.rb +11 -10
  45. data/service_test.rb +5 -5
  46. data/spec/axiom/types/password_spec.rb +14 -0
  47. data/spec/cc/formatters/snapshot_formatter_spec.rb +44 -0
  48. data/spec/cc/presenters/pull_requests_presenter_spec.rb +45 -0
  49. data/{test/asana_test.rb → spec/cc/service/asana_spec.rb} +27 -29
  50. data/{test/campfire_test.rb → spec/cc/service/campfire_spec.rb} +40 -44
  51. data/{test/flowdock_test.rb → spec/cc/service/flowdock_spec.rb} +46 -48
  52. data/{test/github_issues_test.rb → spec/cc/service/github_issues_spec.rb} +33 -35
  53. data/spec/cc/service/github_pull_requests_spec.rb +223 -0
  54. data/{test/gitlab_merge_requests_test.rb → spec/cc/service/gitlab_merge_requests_spec.rb} +30 -35
  55. data/{test/hipchat_test.rb → spec/cc/service/hipchat_spec.rb} +38 -40
  56. data/spec/cc/service/invocation/error_handling_spec.rb +49 -0
  57. data/spec/cc/service/invocation/return_values_spec.rb +19 -0
  58. data/spec/cc/service/invocation/with_metrics_spec.rb +18 -0
  59. data/{test/invocation_test.rb → spec/cc/service/invocation_spec.rb} +31 -34
  60. data/{test/jira_test.rb → spec/cc/service/jira_spec.rb} +25 -27
  61. data/{test/lighthouse_test.rb → spec/cc/service/lighthouse_spec.rb} +23 -26
  62. data/spec/cc/service/pivotal_tracker_spec.rb +70 -0
  63. data/{test/slack_test.rb → spec/cc/service/slack_spec.rb} +66 -77
  64. data/spec/cc/service/stash_pull_requests_spec.rb +132 -0
  65. data/spec/cc/service_spec.rb +78 -0
  66. data/{test → spec}/fixtures.rb +3 -4
  67. data/spec/spec_helper.rb +37 -0
  68. data/{test → spec}/support/fake_logger.rb +0 -0
  69. data/spec/support/service_context.rb +42 -0
  70. metadata +57 -52
  71. data/test/axiom/types/password_test.rb +0 -22
  72. data/test/formatters/snapshot_formatter_test.rb +0 -47
  73. data/test/github_pull_requests_test.rb +0 -217
  74. data/test/helper.rb +0 -58
  75. data/test/invocation_error_handling_test.rb +0 -51
  76. data/test/invocation_return_values_test.rb +0 -21
  77. data/test/pivotal_tracker_test.rb +0 -73
  78. data/test/presenters/pull_requests_presenter_test.rb +0 -70
  79. data/test/service_test.rb +0 -84
  80. data/test/stash_pull_requests_test.rb +0 -146
  81. data/test/with_metrics_test.rb +0 -19
@@ -0,0 +1,132 @@
1
+ describe CC::Service::StashPullRequests, type: :service do
2
+ it "receive test" do
3
+ http_stubs.get "/rest/api/1.0/users" do
4
+ [200, {}, "{ 'values': [] }"]
5
+ end
6
+
7
+ response = receive_test
8
+
9
+ expect({ ok: true, message: "Test succeeded" }).to eq(response)
10
+ end
11
+
12
+ it "failed receive test" do
13
+ http_stubs.get "/rest/api/1.0/users" do
14
+ [401, {}, ""]
15
+ end
16
+
17
+ response = receive_test
18
+
19
+ expect({ ok: false, message: "API request unsuccessful (401)" }).to eq(response)
20
+ end
21
+
22
+ it "pull request status pending" do
23
+ expect_status_update("abc123", "state" => "INPROGRESS",
24
+ "description" => /is analyzing/)
25
+
26
+ receive_pull_request(
27
+ commit_sha: "abc123",
28
+ state: "pending",
29
+ )
30
+ end
31
+
32
+ it "pull request status success detailed" do
33
+ expect_status_update("abc123", "state" => "SUCCESSFUL",
34
+ "description" => "Code Climate found 2 new issues and 1 fixed issue.")
35
+
36
+ receive_pull_request(
37
+ commit_sha: "abc123",
38
+ state: "success",
39
+ )
40
+ end
41
+
42
+ it "pull request status failure" do
43
+ expect_status_update("abc123", "state" => "FAILED",
44
+ "description" => "Code Climate found 2 new issues and 1 fixed issue.")
45
+
46
+ receive_pull_request(
47
+ commit_sha: "abc123",
48
+ state: "failure",
49
+ )
50
+ end
51
+
52
+ it "pull request status error" do
53
+ expect_status_update("abc123", "state" => "FAILED",
54
+ "description" => "Code Climate encountered an error attempting to analyze this pull request.")
55
+
56
+ receive_pull_request(
57
+ commit_sha: "abc123",
58
+ state: "error",
59
+ )
60
+ end
61
+
62
+ it "pull request status error message provided" do
63
+ message = "Everything broke."
64
+
65
+ expect_status_update("abc123", "state" => "FAILED",
66
+ "description" => message)
67
+
68
+ receive_pull_request(
69
+ commit_sha: "abc123",
70
+ message: message,
71
+ state: "error",
72
+ )
73
+ end
74
+
75
+ it "pull request status skipped" do
76
+ expect_status_update("abc123", "state" => "SUCCESSFUL",
77
+ "description" => "Code Climate has skipped analysis of this commit.")
78
+
79
+ receive_pull_request(
80
+ commit_sha: "abc123",
81
+ state: "skipped",
82
+ )
83
+ end
84
+
85
+ it "failed receive pull request" do
86
+ commit_sha = "abc123"
87
+
88
+ http_stubs.post("/rest/build-status/1.0/commits/#{commit_sha}") do
89
+ [401, {}, ""]
90
+ end
91
+
92
+
93
+ expect do
94
+ receive_pull_request(
95
+ commit_sha: "abc123",
96
+ state: "success",
97
+ )
98
+ end.to raise_error(CC::Service::HTTPError)
99
+ end
100
+
101
+ private
102
+
103
+ def expect_status_update(commit_sha, params)
104
+ http_stubs.post("/rest/build-status/1.0/commits/#{commit_sha}") do |env|
105
+ body = JSON.parse(env[:body])
106
+
107
+ params.each do |k, v|
108
+ expect(v).to match(body[k])
109
+ end
110
+ end
111
+ end
112
+
113
+ def default_config
114
+ { domain: "example.com", username: "zaphod", password: "g4rgl3bl4st3r" }
115
+ end
116
+
117
+ def receive_pull_request(event_data, config = {})
118
+ service_receive(
119
+ CC::Service::StashPullRequests,
120
+ default_config.merge(config),
121
+ { name: "pull_request", issue_comparison_counts: { "fixed" => 1, "new" => 2 } }.merge(event_data),
122
+ )
123
+ end
124
+
125
+ def receive_test(config = {}, event_data = {})
126
+ service_receive(
127
+ CC::Service::StashPullRequests,
128
+ default_config.merge(config),
129
+ { name: "test" }.merge(event_data),
130
+ )
131
+ end
132
+ end
@@ -0,0 +1,78 @@
1
+ describe CC::Service, type: :service do
2
+ it "validates events" do
3
+ expect { CC::Service.new(:foo, {}, {}, {}) }.to raise_error(ArgumentError)
4
+ end
5
+
6
+ it "default path to ca file" do
7
+ s = CC::Service.new({}, name: "test")
8
+ expect(File.expand_path("../../../config/cacert.pem", __FILE__)).to eq(s.ca_file)
9
+ expect(File.exist?(s.ca_file)).to eq(true)
10
+ end
11
+
12
+ it "custom path to ca file" do
13
+ begin
14
+ ENV["CODECLIMATE_CA_FILE"] = "/tmp/cacert.pem"
15
+ s = CC::Service.new({}, name: "test")
16
+ expect("/tmp/cacert.pem").to eq(s.ca_file)
17
+ ensure
18
+ ENV.delete("CODECLIMATE_CA_FILE")
19
+ end
20
+ end
21
+
22
+ it "nothing has a handler" do
23
+ service = CC::Service.new({}, name: "test")
24
+
25
+ result = service.receive
26
+
27
+ expect(result[:ok]).to eq(false)
28
+ expect(result[:ignored]).to eq(true)
29
+ expect(result[:message]).to eq("No service handler found")
30
+ end
31
+
32
+ it "post success" do
33
+ stub_http("/my/test/url", [200, {}, '{"ok": true, "thing": "123"}'])
34
+
35
+ response = service_post("/my/test/url", { token: "1234" }.to_json, {}) do |inner_response|
36
+ body = JSON.parse(inner_response.body)
37
+ { thing: body["thing"] }
38
+ end
39
+
40
+ expect(response[:ok]).to eq(true)
41
+ expect(response[:params]).to eq('{"token":"1234"}')
42
+ expect(response[:endpoint_url]).to eq("/my/test/url")
43
+ expect(response[:status]).to eq(200)
44
+ end
45
+
46
+ it "post redirect success" do
47
+ stub_http("/my/test/url", [307, { "Location" => "/my/redirect/url" }, '{"ok": false, "redirect": true}'])
48
+ stub_http("/my/redirect/url", [200, {}, '{"ok": true, "thing": "123"}'])
49
+
50
+ response = service_post_with_redirects("/my/test/url", { token: "1234" }.to_json, {}) do |inner_response|
51
+ body = JSON.parse(inner_response.body)
52
+ { thing: body["thing"] }
53
+ end
54
+
55
+ expect(response[:ok]).to eq(true)
56
+ expect(response[:params]).to eq('{"token":"1234"}')
57
+ expect(response[:endpoint_url]).to eq("/my/test/url")
58
+ expect(response[:status]).to eq(200)
59
+ end
60
+
61
+ it "post http failure" do
62
+ stub_http("/my/wrong/url", [404, {}, ""])
63
+
64
+ expect { service_post("/my/wrong/url", { token: "1234" }.to_json, {}) }.to raise_error(CC::Service::HTTPError)
65
+ end
66
+
67
+ it "post some other failure" do
68
+ stub_http("/my/wrong/url") { raise ArgumentError, "lol" }
69
+
70
+ expect { service_post("/my/wrong/url", { token: "1234" }.to_json, {}) }.to raise_error(ArgumentError)
71
+ end
72
+
73
+ it "services" do
74
+ services = CC::Service.services
75
+
76
+ expect(services.include?(CC::PullRequests)).not_to eq(true)
77
+ end
78
+ end
@@ -7,7 +7,7 @@ class EventFixtures
7
7
  "C" => 15,
8
8
  "D" => 20,
9
9
  "F" => 25,
10
- }
10
+ }.freeze
11
11
 
12
12
  def initialize(options)
13
13
  @options = {
@@ -27,7 +27,7 @@ class EventFixtures
27
27
  name: "coverage",
28
28
  covered_percent: to,
29
29
  previous_covered_percent: from,
30
- covered_percent_delta: delta
30
+ covered_percent_delta: delta,
31
31
  )
32
32
  end
33
33
 
@@ -42,7 +42,7 @@ class EventFixtures
42
42
  rating: to,
43
43
  previous_rating: from,
44
44
  remediation_cost: REMEDIATIONS[to],
45
- previous_remediation_cost: REMEDIATIONS[from]
45
+ previous_remediation_cost: REMEDIATIONS[from],
46
46
  )
47
47
  end
48
48
 
@@ -54,7 +54,6 @@ class EventFixtures
54
54
  def issue
55
55
  options.merge(name: "issue")
56
56
  end
57
-
58
57
  end
59
58
 
60
59
  def event(name, options = {})
@@ -0,0 +1,37 @@
1
+ require "codeclimate-test-reporter"
2
+ CodeClimate::TestReporter.start
3
+
4
+ cwd = File.expand_path(File.dirname(__FILE__))
5
+ require "#{cwd}/../config/load"
6
+ require "#{cwd}/fixtures"
7
+ Dir["#{cwd}/support/*.rb"].sort.each do |helper|
8
+ require helper
9
+ end
10
+ CC::Service.load_services
11
+
12
+ require "#{cwd}/support/service_context"
13
+
14
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
15
+ RSpec.configure do |config|
16
+ config.expect_with :rspec do |expectations|
17
+ # This option will default to `true` in RSpec 4. It makes the `description`
18
+ # and `failure_message` of custom matchers include text for helper methods
19
+ # defined using `chain`, e.g.:
20
+ # be_bigger_than(2).and_smaller_than(4).description
21
+ # # => "be bigger than 2 and smaller than 4"
22
+ # ...rather than:
23
+ # # => "be bigger than 2"
24
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
25
+ end
26
+
27
+ config.mock_with :rspec do |mocks|
28
+ # Prevents you from mocking or stubbing a method that does not exist on
29
+ # a real object. This is generally recommended, and will default to
30
+ # `true` in RSpec 4.
31
+ mocks.verify_partial_doubles = true
32
+ end
33
+
34
+ # This setting enables warnings. It's recommended, but in some cases may
35
+ # be too noisy due to issues in dependencies.
36
+ config.warnings = true
37
+ end
File without changes
@@ -0,0 +1,42 @@
1
+ RSpec.shared_examples "Service Context", type: :service do
2
+ let!(:http_stubs) { Faraday::Adapter::Test::Stubs.new }
3
+
4
+ before do
5
+ I18n.enforce_available_locales = true
6
+ end
7
+
8
+ after do
9
+ http_stubs.verify_stubbed_calls
10
+ end
11
+
12
+ def service(klass, data, payload)
13
+ service = klass.new(data, payload)
14
+ service.http adapter: [:test, http_stubs]
15
+ service
16
+ end
17
+
18
+ def service_receive(*args)
19
+ service(*args).receive
20
+ end
21
+
22
+ def service_post(*args)
23
+ service(
24
+ CC::Service,
25
+ { data: "my data" },
26
+ event(:quality, to: "D", from: "C"),
27
+ ).service_post(*args)
28
+ end
29
+
30
+ def service_post_with_redirects(*args)
31
+ service(
32
+ CC::Service,
33
+ { data: "my data" },
34
+ event(:quality, to: "D", from: "C"),
35
+ ).service_post_with_redirects(*args)
36
+ end
37
+
38
+ def stub_http(url, response = nil, &block)
39
+ block ||= ->(*_args) { response }
40
+ http_stubs.post(url, &block)
41
+ end
42
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codeclimate-services
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Helmkamp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-31 00:00:00.000000000 Z
11
+ date: 2016-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.6.2
97
97
  - !ruby/object:Gem::Dependency
98
- name: rake
98
+ name: codeclimate-test-reporter
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: test-unit
112
+ name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: mocha
126
+ name: rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -144,11 +144,14 @@ extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
146
  - ".gitignore"
147
+ - ".rspec"
148
+ - ".rubocop.yml"
147
149
  - ".ruby-version"
148
150
  - Gemfile
149
151
  - LICENSE.txt
150
152
  - README.md
151
153
  - Rakefile
154
+ - base_rubocop.yml
152
155
  - bin/bundler
153
156
  - bin/coderay
154
157
  - bin/nokogiri
@@ -196,29 +199,30 @@ files:
196
199
  - lib/cc/services/version.rb
197
200
  - pull_request_test.rb
198
201
  - service_test.rb
199
- - test/asana_test.rb
200
- - test/axiom/types/password_test.rb
201
- - test/campfire_test.rb
202
- - test/fixtures.rb
203
- - test/flowdock_test.rb
204
- - test/formatters/snapshot_formatter_test.rb
205
- - test/github_issues_test.rb
206
- - test/github_pull_requests_test.rb
207
- - test/gitlab_merge_requests_test.rb
208
- - test/helper.rb
209
- - test/hipchat_test.rb
210
- - test/invocation_error_handling_test.rb
211
- - test/invocation_return_values_test.rb
212
- - test/invocation_test.rb
213
- - test/jira_test.rb
214
- - test/lighthouse_test.rb
215
- - test/pivotal_tracker_test.rb
216
- - test/presenters/pull_requests_presenter_test.rb
217
- - test/service_test.rb
218
- - test/slack_test.rb
219
- - test/stash_pull_requests_test.rb
220
- - test/support/fake_logger.rb
221
- - test/with_metrics_test.rb
202
+ - spec/axiom/types/password_spec.rb
203
+ - spec/cc/formatters/snapshot_formatter_spec.rb
204
+ - spec/cc/presenters/pull_requests_presenter_spec.rb
205
+ - spec/cc/service/asana_spec.rb
206
+ - spec/cc/service/campfire_spec.rb
207
+ - spec/cc/service/flowdock_spec.rb
208
+ - spec/cc/service/github_issues_spec.rb
209
+ - spec/cc/service/github_pull_requests_spec.rb
210
+ - spec/cc/service/gitlab_merge_requests_spec.rb
211
+ - spec/cc/service/hipchat_spec.rb
212
+ - spec/cc/service/invocation/error_handling_spec.rb
213
+ - spec/cc/service/invocation/return_values_spec.rb
214
+ - spec/cc/service/invocation/with_metrics_spec.rb
215
+ - spec/cc/service/invocation_spec.rb
216
+ - spec/cc/service/jira_spec.rb
217
+ - spec/cc/service/lighthouse_spec.rb
218
+ - spec/cc/service/pivotal_tracker_spec.rb
219
+ - spec/cc/service/slack_spec.rb
220
+ - spec/cc/service/stash_pull_requests_spec.rb
221
+ - spec/cc/service_spec.rb
222
+ - spec/fixtures.rb
223
+ - spec/spec_helper.rb
224
+ - spec/support/fake_logger.rb
225
+ - spec/support/service_context.rb
222
226
  homepage: ''
223
227
  licenses:
224
228
  - MIT
@@ -239,31 +243,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
243
  version: '0'
240
244
  requirements: []
241
245
  rubyforge_project:
242
- rubygems_version: 2.4.5
246
+ rubygems_version: 2.5.1
243
247
  signing_key:
244
248
  specification_version: 4
245
249
  summary: Service classes for Code Climate
246
250
  test_files:
247
- - test/asana_test.rb
248
- - test/axiom/types/password_test.rb
249
- - test/campfire_test.rb
250
- - test/fixtures.rb
251
- - test/flowdock_test.rb
252
- - test/formatters/snapshot_formatter_test.rb
253
- - test/github_issues_test.rb
254
- - test/github_pull_requests_test.rb
255
- - test/gitlab_merge_requests_test.rb
256
- - test/helper.rb
257
- - test/hipchat_test.rb
258
- - test/invocation_error_handling_test.rb
259
- - test/invocation_return_values_test.rb
260
- - test/invocation_test.rb
261
- - test/jira_test.rb
262
- - test/lighthouse_test.rb
263
- - test/pivotal_tracker_test.rb
264
- - test/presenters/pull_requests_presenter_test.rb
265
- - test/service_test.rb
266
- - test/slack_test.rb
267
- - test/stash_pull_requests_test.rb
268
- - test/support/fake_logger.rb
269
- - test/with_metrics_test.rb
251
+ - spec/axiom/types/password_spec.rb
252
+ - spec/cc/formatters/snapshot_formatter_spec.rb
253
+ - spec/cc/presenters/pull_requests_presenter_spec.rb
254
+ - spec/cc/service/asana_spec.rb
255
+ - spec/cc/service/campfire_spec.rb
256
+ - spec/cc/service/flowdock_spec.rb
257
+ - spec/cc/service/github_issues_spec.rb
258
+ - spec/cc/service/github_pull_requests_spec.rb
259
+ - spec/cc/service/gitlab_merge_requests_spec.rb
260
+ - spec/cc/service/hipchat_spec.rb
261
+ - spec/cc/service/invocation/error_handling_spec.rb
262
+ - spec/cc/service/invocation/return_values_spec.rb
263
+ - spec/cc/service/invocation/with_metrics_spec.rb
264
+ - spec/cc/service/invocation_spec.rb
265
+ - spec/cc/service/jira_spec.rb
266
+ - spec/cc/service/lighthouse_spec.rb
267
+ - spec/cc/service/pivotal_tracker_spec.rb
268
+ - spec/cc/service/slack_spec.rb
269
+ - spec/cc/service/stash_pull_requests_spec.rb
270
+ - spec/cc/service_spec.rb
271
+ - spec/fixtures.rb
272
+ - spec/spec_helper.rb
273
+ - spec/support/fake_logger.rb
274
+ - spec/support/service_context.rb