yankedcodecov 0.1.18

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c8db93c017510d6101f79d762b1a06aeb74caac4b809036eb78df3f67dd9abbb
4
+ data.tar.gz: 9c8fde6863c96871ffa0da5035beefb3722458e2b3f01cecfa98894822ea6e43
5
+ SHA512:
6
+ metadata.gz: a8b608173a4643929c3d0b875eb928e868e50b7d0bbbec6fc3cdc2affc99ee68a3ac489ee4bdda6a5502ff9e320caff83271f89d4116941cf096c89b66ccd084
7
+ data.tar.gz: '03854dd43fe91e2b67e1aedaa6c85f85019a1013e703cfcab9694b07b6925777427d9e85665da263b8ba72ca512d79e76643c856e9ed2b95b009ec8853014f05'
@@ -0,0 +1,478 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'json'
5
+ require 'net/http'
6
+ require 'simplecov'
7
+ require 'colorize'
8
+ require 'tempfile'
9
+ require 'zlib'
10
+
11
+ class SimpleCov::Formatter::Codecov
12
+ VERSION = '0.1.18'
13
+
14
+ ### CIs
15
+ RECOGNIZED_CIS = [
16
+ APPVEYOR = 'Appveyor CI',
17
+ AZUREPIPELINES = 'Azure Pipelines',
18
+ BITBUCKET = 'Bitbucket',
19
+ BITRISE = 'Bitrise CI',
20
+ BUILDKITE = 'Buildkite CI',
21
+ CIRCLE = 'Circle CI',
22
+ CODESHIP = 'Codeship CI',
23
+ DRONEIO = 'Drone CI',
24
+ GITLAB = 'GitLab CI',
25
+ HEROKU = 'Heroku CI',
26
+ JENKINS = 'Jenkins CI',
27
+ SEMAPHORE = 'Semaphore CI',
28
+ SHIPPABLE = 'Shippable',
29
+ SOLANO = 'Solano CI',
30
+ TEAMCITY = 'TeamCity CI',
31
+ TRAVIS = 'Travis CI',
32
+ WERCKER = 'Wercker CI'
33
+ ].freeze
34
+
35
+ def display_header
36
+ puts [
37
+ '',
38
+ ' _____ _',
39
+ ' / ____| | |',
40
+ '| | ___ __| | ___ ___ _____ __',
41
+ '| | / _ \ / _\`|/ _ \/ __/ _ \ \ / /',
42
+ '| |___| (_) | (_| | __/ (_| (_) \ V /',
43
+ ' \_____\___/ \__,_|\___|\___\___/ \_/',
44
+ " Ruby-#{VERSION}",
45
+ ''
46
+ ].join("\n")
47
+ end
48
+
49
+ def detect_ci
50
+ ci = if (ENV['CI'] == 'True') && (ENV['APPVEYOR'] == 'True')
51
+ APPVEYOR
52
+ elsif !ENV['TF_BUILD'].nil?
53
+ AZUREPIPELINES
54
+ elsif (ENV['CI'] == 'true') && !ENV['BITBUCKET_BRANCH'].nil?
55
+ BITBUCKET
56
+ elsif (ENV['CI'] == 'true') && (ENV['BITRISE_IO'] == 'true')
57
+ BITRISE
58
+ elsif (ENV['CI'] == 'true') && (ENV['BUILDKITE'] == 'true')
59
+ BUILDKITE
60
+ elsif (ENV['CI'] == 'true') && (ENV['CIRCLECI'] == 'true')
61
+ CIRCLE
62
+ elsif (ENV['CI'] == 'true') && (ENV['CI_NAME'] == 'codeship')
63
+ CODESHIP
64
+ elsif ((ENV['CI'] == 'true') || (ENV['CI'] == 'drone')) && (ENV['DRONE'] == 'true')
65
+ DRONEIO
66
+ elsif !ENV['GITLAB_CI'].nil?
67
+ GITLAB
68
+ elsif ENV['HEROKU_TEST_RUN_ID']
69
+ HEROKU
70
+ elsif !ENV['JENKINS_URL'].nil?
71
+ JENKINS
72
+ elsif (ENV['CI'] == 'true') && (ENV['SEMAPHORE'] == 'true')
73
+ SEMAPHORE
74
+ elsif (ENV['CI'] == 'true') && (ENV['SHIPPABLE'] == 'true')
75
+ SHIPPABLE
76
+ elsif ENV['TDDIUM'] == 'true'
77
+ SOLANO
78
+ elsif ENV['CI_SERVER_NAME'] == 'TeamCity'
79
+ TEAMCITY
80
+ elsif (ENV['CI'] == 'true') && (ENV['TRAVIS'] == 'true')
81
+ TRAVIS
82
+ elsif (ENV['CI'] == 'true') && !ENV['WERCKER_GIT_BRANCH'].nil?
83
+ WERCKER
84
+ end
85
+
86
+ if !RECOGNIZED_CIS.include?(ci)
87
+ puts ['x>'.red, 'No CI provider detected.'].join(' ')
88
+ else
89
+ puts "==> #{ci} detected"
90
+ end
91
+
92
+ ci
93
+ end
94
+
95
+ def build_params(ci)
96
+ params = {
97
+ 'token' => ENV['CODECOV_TOKEN'],
98
+ 'flags' => ENV['CODECOV_FLAG'] || ENV['CODECOV_FLAGS']
99
+ }
100
+
101
+ case ci
102
+ when APPVEYOR
103
+ # http://www.appveyor.com/docs/environment-variables
104
+ params[:service] = 'appveyor'
105
+ params[:branch] = ENV['APPVEYOR_REPO_BRANCH']
106
+ params[:build] = ENV['APPVEYOR_JOB_ID']
107
+ params[:pr] = ENV['APPVEYOR_PULL_REQUEST_NUMBER']
108
+ params[:job] = ENV['APPVEYOR_ACCOUNT_NAME'] + '/' + ENV['APPVEYOR_PROJECT_SLUG'] + '/' + ENV['APPVEYOR_BUILD_VERSION']
109
+ params[:slug] = ENV['APPVEYOR_REPO_NAME']
110
+ params[:commit] = ENV['APPVEYOR_REPO_COMMIT']
111
+ when AZUREPIPELINES
112
+ params[:service] = 'azure_pipelines'
113
+ params[:branch] = ENV['BUILD_SOURCEBRANCH']
114
+ params[:pull_request] = ENV['SYSTEM_PULLREQUEST_PULLREQUESTNUMBER']
115
+ params[:job] = ENV['SYSTEM_JOBID']
116
+ params[:build] = ENV['BUILD_BUILDID']
117
+ params[:build_url] = "#{ENV['SYSTEM_TEAMFOUNDATIONSERVERURI']}/#{ENV['SYSTEM_TEAMPROJECT']}/_build/results?buildId=#{ENV['BUILD_BUILDID']}"
118
+ params[:commit] = ENV['BUILD_SOURCEVERSION']
119
+ params[:slug] = ENV['BUILD_REPOSITORY_ID']
120
+ when BITBUCKET
121
+ # https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html
122
+ params[:service] = 'bitbucket'
123
+ params[:branch] = ENV['BITBUCKET_BRANCH']
124
+ # BITBUCKET_COMMIT does not always provide full commit sha due to a bug https://jira.atlassian.com/browse/BCLOUD-19393#
125
+ params[:commit] = (ENV['BITBUCKET_COMMIT'].length < 40 ? nil : ENV['BITBUCKET_COMMIT'])
126
+ params[:build] = ENV['BITBUCKET_BUILD_NUMBER']
127
+ when BITRISE
128
+ # http://devcenter.bitrise.io/faq/available-environment-variables/
129
+ params[:service] = 'bitrise'
130
+ params[:branch] = ENV['BITRISE_GIT_BRANCH']
131
+ params[:pr] = ENV['BITRISE_PULL_REQUEST']
132
+ params[:build] = ENV['BITRISE_BUILD_NUMBER']
133
+ params[:build_url] = ENV['BITRISE_BUILD_URL']
134
+ params[:commit] = ENV['BITRISE_GIT_COMMIT']
135
+ params[:slug] = ENV['BITRISEIO_GIT_REPOSITORY_OWNER'] + '/' + ENV['BITRISEIO_GIT_REPOSITORY_SLUG']
136
+ when BUILDKITE
137
+ # https://buildkite.com/docs/guides/environment-variables
138
+ params[:service] = 'buildkite'
139
+ params[:branch] = ENV['BUILDKITE_BRANCH']
140
+ params[:build] = ENV['BUILDKITE_BUILD_NUMBER']
141
+ params[:job] = ENV['BUILDKITE_JOB_ID']
142
+ params[:build_url] = ENV['BUILDKITE_BUILD_URL']
143
+ params[:slug] = ENV['BUILDKITE_PROJECT_SLUG']
144
+ params[:commit] = ENV['BUILDKITE_COMMIT']
145
+ when CIRCLE
146
+ # https://circleci.com/docs/environment-variables
147
+ params[:service] = 'circleci'
148
+ params[:build] = ENV['CIRCLE_BUILD_NUM']
149
+ params[:job] = ENV['CIRCLE_NODE_INDEX']
150
+ params[:slug] = if !ENV['CIRCLE_PROJECT_REPONAME'].nil?
151
+ ENV['CIRCLE_PROJECT_USERNAME'] + '/' + ENV['CIRCLE_PROJECT_REPONAME']
152
+ else
153
+ ENV['CIRCLE_REPOSITORY_URL'].gsub(/^.*:/, '').gsub(/\.git$/, '')
154
+ end
155
+ params[:pr] = ENV['CIRCLE_PR_NUMBER']
156
+ params[:branch] = ENV['CIRCLE_BRANCH']
157
+ params[:commit] = ENV['CIRCLE_SHA1']
158
+ when CODESHIP
159
+ # https://www.codeship.io/documentation/continuous-integration/set-environment-variables/
160
+ params[:service] = 'codeship'
161
+ params[:branch] = ENV['CI_BRANCH']
162
+ params[:commit] = ENV['CI_COMMIT_ID']
163
+ params[:build] = ENV['CI_BUILD_NUMBER']
164
+ params[:build_url] = ENV['CI_BUILD_URL']
165
+ when DRONEIO
166
+ # https://semaphoreapp.com/docs/available-environment-variables.html
167
+ params[:service] = 'drone.io'
168
+ params[:branch] = ENV['DRONE_BRANCH']
169
+ params[:commit] = ENV['DRONE_COMMIT_SHA']
170
+ params[:job] = ENV['DRONE_JOB_NUMBER']
171
+ params[:build] = ENV['DRONE_BUILD_NUMBER']
172
+ params[:build_url] = ENV['DRONE_BUILD_LINK'] || ENV['DRONE_BUILD_URL'] || ENV['CI_BUILD_URL']
173
+ params[:pr] = ENV['DRONE_PULL_REQUEST']
174
+ params[:tag] = ENV['DRONE_TAG']
175
+ when GITLAB
176
+ # http://doc.gitlab.com/ci/examples/README.html#environmental-variables
177
+ # https://gitlab.com/gitlab-org/gitlab-ci-runner/blob/master/lib/build.rb#L96
178
+ # GitLab Runner v9 renamed some environment variables, so we check both old and new variable names.
179
+ params[:service] = 'gitlab'
180
+ params[:branch] = ENV['CI_BUILD_REF_NAME'] || ENV['CI_COMMIT_REF_NAME']
181
+ params[:build] = ENV['CI_BUILD_ID'] || ENV['CI_JOB_ID']
182
+ slug = ENV['CI_BUILD_REPO'] || ENV['CI_REPOSITORY_URL']
183
+ params[:slug] = slug.split('/', 4)[-1].sub('.git', '') if slug
184
+ params[:commit] = ENV['CI_BUILD_REF'] || ENV['CI_COMMIT_SHA']
185
+ when HEROKU
186
+ params[:service] = 'heroku'
187
+ params[:branch] = ENV['HEROKU_TEST_RUN_BRANCH']
188
+ params[:build] = ENV['HEROKU_TEST_RUN_ID']
189
+ params[:commit] = ENV['HEROKU_TEST_RUN_COMMIT_VERSION']
190
+ when JENKINS
191
+ # https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
192
+ # https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin#GitHubpullrequestbuilderplugin-EnvironmentVariables
193
+ params[:service] = 'jenkins'
194
+ params[:branch] = ENV['ghprbSourceBranch'] || ENV['GIT_BRANCH']
195
+ params[:commit] = ENV['ghprbActualCommit'] || ENV['GIT_COMMIT']
196
+ params[:pr] = ENV['ghprbPullId']
197
+ params[:build] = ENV['BUILD_NUMBER']
198
+ params[:root] = ENV['WORKSPACE']
199
+ params[:build_url] = ENV['BUILD_URL']
200
+ when SEMAPHORE
201
+ # https://semaphoreapp.com/docs/available-environment-variables.html
202
+ params[:service] = 'semaphore'
203
+ params[:branch] = ENV['BRANCH_NAME']
204
+ params[:commit] = ENV['REVISION']
205
+ params[:build] = ENV['SEMAPHORE_BUILD_NUMBER']
206
+ params[:job] = ENV['SEMAPHORE_CURRENT_THREAD']
207
+ params[:slug] = ENV['SEMAPHORE_REPO_SLUG']
208
+ when SHIPPABLE
209
+ # http://docs.shippable.com/en/latest/config.html#common-environment-variables
210
+ params[:service] = 'shippable'
211
+ params[:branch] = ENV['BRANCH']
212
+ params[:build] = ENV['BUILD_NUMBER']
213
+ params[:build_url] = ENV['BUILD_URL']
214
+ params[:pull_request] = ENV['PULL_REQUEST']
215
+ params[:slug] = ENV['REPO_NAME']
216
+ params[:commit] = ENV['COMMIT']
217
+ when SOLANO
218
+ # http://docs.solanolabs.com/Setup/tddium-set-environment-variables/
219
+ params[:service] = 'solano'
220
+ params[:branch] = ENV['TDDIUM_CURRENT_BRANCH']
221
+ params[:commit] = ENV['TDDIUM_CURRENT_COMMIT']
222
+ params[:build] = ENV['TDDIUM_TID']
223
+ params[:pr] = ENV['TDDIUM_PR_ID']
224
+ when TEAMCITY
225
+ # https://confluence.jetbrains.com/display/TCD8/Predefined+Build+Parameters
226
+ # Teamcity does not automatically make build parameters available as environment variables.
227
+ # Add the following environment parameters to the build configuration
228
+ # env.TEAMCITY_BUILD_BRANCH = %teamcity.build.branch%
229
+ # env.TEAMCITY_BUILD_ID = %teamcity.build.id%
230
+ # env.TEAMCITY_BUILD_URL = %teamcity.serverUrl%/viewLog.html?buildId=%teamcity.build.id%
231
+ # env.TEAMCITY_BUILD_COMMIT = %system.build.vcs.number%
232
+ # env.TEAMCITY_BUILD_REPOSITORY = %vcsroot.<YOUR TEAMCITY VCS NAME>.url%
233
+ params[:service] = 'teamcity'
234
+ params[:branch] = ENV['TEAMCITY_BUILD_BRANCH']
235
+ params[:build] = ENV['TEAMCITY_BUILD_ID']
236
+ params[:build_url] = ENV['TEAMCITY_BUILD_URL']
237
+ params[:commit] = ENV['TEAMCITY_BUILD_COMMIT']
238
+ params[:slug] = ENV['TEAMCITY_BUILD_REPOSITORY'].split('/', 4)[-1].sub('.git', '')
239
+ when TRAVIS
240
+ # http://docs.travis-ci.com/user/ci-environment/#Environment-variables
241
+ params[:service] = 'travis'
242
+ params[:branch] = ENV['TRAVIS_BRANCH']
243
+ params[:pull_request] = ENV['TRAVIS_PULL_REQUEST']
244
+ params[:job] = ENV['TRAVIS_JOB_ID']
245
+ params[:slug] = ENV['TRAVIS_REPO_SLUG']
246
+ params[:build] = ENV['TRAVIS_JOB_NUMBER']
247
+ params[:commit] = ENV['TRAVIS_COMMIT']
248
+ params[:env] = ENV['TRAVIS_RUBY_VERSION']
249
+ when WERCKER
250
+ # http://devcenter.wercker.com/articles/steps/variables.html
251
+ params[:service] = 'wercker'
252
+ params[:branch] = ENV['WERCKER_GIT_BRANCH']
253
+ params[:build] = ENV['WERCKER_MAIN_PIPELINE_STARTED']
254
+ params[:slug] = ENV['WERCKER_GIT_OWNER'] + '/' + ENV['WERCKER_GIT_REPOSITORY']
255
+ params[:commit] = ENV['WERCKER_GIT_COMMIT']
256
+ end
257
+
258
+ if params[:branch].nil?
259
+ # find branch, commit, repo from git command
260
+ branch = `git rev-parse --abbrev-ref HEAD`.strip
261
+ params[:branch] = branch != 'HEAD' ? branch : 'master'
262
+ end
263
+
264
+ if !ENV['VCS_COMMIT_ID'].nil?
265
+ params[:commit] = ENV['VCS_COMMIT_ID']
266
+
267
+ elsif params[:commit].nil?
268
+ params[:commit] = `git rev-parse HEAD`.strip
269
+ end
270
+
271
+ slug = ENV['CODECOV_SLUG']
272
+ params[:slug] = slug unless slug.nil?
273
+
274
+ params[:pr] = params[:pr].sub('#', '') unless params[:pr].nil?
275
+
276
+ params
277
+ end
278
+
279
+ def retry_request(req, https)
280
+ retries = 3
281
+ begin
282
+ response = https.request(req)
283
+ rescue Timeout::Error => e
284
+ retries -= 1
285
+
286
+ if retries.zero?
287
+ puts 'Timeout error uploading coverage reports to Codecov. Out of retries.'
288
+ puts e
289
+ return response
290
+ end
291
+
292
+ puts 'Timeout error uploading coverage reports to Codecov. Retrying...'
293
+ puts e
294
+ retry
295
+ rescue StandardError => e
296
+ puts 'Error uploading coverage reports to Codecov. Sorry'
297
+ puts e
298
+ return response
299
+ end
300
+
301
+ response
302
+ end
303
+
304
+ def create_report(report)
305
+ result = {
306
+ 'meta' => {
307
+ 'version' => 'codecov-ruby/v' + SimpleCov::Formatter::Codecov::VERSION
308
+ }
309
+ }
310
+ result.update(result_to_codecov(report))
311
+ result
312
+ end
313
+
314
+ def gzip_report(report)
315
+ puts ['==>'.green, 'Gzipping contents'].join(' ')
316
+
317
+ file = Tempfile.new
318
+ Zlib::GzipWriter.open(file.path) do |gz|
319
+ gz.write report
320
+ end
321
+ file.rewind
322
+ gzipped_report = file.read
323
+ file.close
324
+
325
+ gzipped_report
326
+ end
327
+
328
+ def upload_to_codecov(ci, report)
329
+ url = ENV['CODECOV_URL'] || 'https://codecov.io'
330
+
331
+ params = build_params(ci)
332
+ params_secret_token = params.clone
333
+ params_secret_token['token'] = 'secret'
334
+
335
+ query = URI.encode_www_form(params)
336
+ query_without_token = URI.encode_www_form(params_secret_token)
337
+
338
+ gzipped_report = gzip_report(report)
339
+
340
+ report['params'] = params
341
+ report['query'] = query
342
+
343
+ puts ['==>'.green, 'Uploading reports'].join(' ')
344
+ puts " url: #{url}"
345
+ puts " query: #{query_without_token}"
346
+
347
+ upload_to_v2(url, gzipped_report, query, query_without_token)
348
+ end
349
+
350
+ def upload_to_v2(url, report, query, query_without_token)
351
+ uri = URI.parse(url.chomp('/') + '/upload/v2')
352
+ https = Net::HTTP.new(uri.host, uri.port)
353
+ https.use_ssl = !url.match(/^https/).nil?
354
+
355
+ puts ['-> '.green, 'Uploading to Codecov'].join(' ')
356
+ puts "#{url}/#{uri.path}?#{query_without_token}"
357
+
358
+ req = Net::HTTP::Post.new(
359
+ "#{uri.path}?#{query}",
360
+ {
361
+ 'X-Reduced-Redundancy' => 'false',
362
+ 'Content-Type' => 'text/plain'
363
+ }
364
+ )
365
+ req.body = report
366
+ retry_request(req, https)
367
+ end
368
+
369
+ def handle_report_response(report)
370
+ if report['result']['uploaded']
371
+ puts " View reports at #{report['result']['url']}"
372
+ else
373
+ puts ' X> Failed to upload coverage reports'.red
374
+ end
375
+ end
376
+
377
+ def format(result)
378
+ net_blockers(:off)
379
+
380
+ display_header
381
+ ci = detect_ci
382
+ report = create_report(result)
383
+ response = upload_to_codecov(ci, report)
384
+ report['result'] = JSON.parse(response.body)
385
+ handle_report_response(report)
386
+ net_blockers(:on)
387
+ report
388
+ end
389
+
390
+ private
391
+
392
+ # Format SimpleCov coverage data for the Codecov.io API.
393
+ #
394
+ # @param result [SimpleCov::Result] The coverage data to process.
395
+ # @return [Hash]
396
+ def result_to_codecov(result)
397
+ {
398
+ 'coverage' => result_to_codecov_coverage(result),
399
+ 'messages' => result_to_codecov_messages(result)
400
+ }
401
+ end
402
+
403
+ # Format SimpleCov coverage data for the Codecov.io coverage API.
404
+ #
405
+ # @param result [SimpleCov::Result] The coverage data to process.
406
+ # @return [Hash<String, Array>]
407
+ def result_to_codecov_coverage(result)
408
+ result.files.each_with_object({}) do |file, memo|
409
+ memo[shortened_filename(file)] = file_to_codecov(file)
410
+ end
411
+ end
412
+
413
+ # Format SimpleCov coverage data for the Codecov.io messages API.
414
+ #
415
+ # @param result [SimpleCov::Result] The coverage data to process.
416
+ # @return [Hash<String, Hash>]
417
+ def result_to_codecov_messages(result)
418
+ result.files.each_with_object({}) do |file, memo|
419
+ memo[shortened_filename(file)] = file.lines.each_with_object({}) do |line, lines_memo|
420
+ lines_memo[line.line_number.to_s] = 'skipped' if line.skipped?
421
+ end
422
+ end
423
+ end
424
+
425
+ # Format coverage data for a single file for the Codecov.io API.
426
+ #
427
+ # @param file [SimpleCov::SourceFile] The file to process.
428
+ # @return [Array<nil, Integer>]
429
+ def file_to_codecov(file)
430
+ # Initial nil is required to offset line numbers.
431
+ [nil] + file.lines.map do |line|
432
+ if line.skipped?
433
+ nil
434
+ else
435
+ line.coverage
436
+ end
437
+ end
438
+ end
439
+
440
+ # Get a filename relative to the project root. Based on
441
+ # https://github.com/colszowka/simplecov-html, copyright Christoph Olszowka.
442
+ #
443
+ # @param file [SimeplCov::SourceFile] The file to use.
444
+ # @return [String]
445
+ def shortened_filename(file)
446
+ file.filename.gsub(/^#{SimpleCov.root}/, '.').gsub(%r{^\./}, '')
447
+ end
448
+
449
+ # Toggle VCR and WebMock on or off
450
+ #
451
+ # @param switch Toggle switch for Net Blockers.
452
+ # @return [Boolean]
453
+ def net_blockers(switch)
454
+ throw 'Only :on or :off' unless %i[on off].include? switch
455
+
456
+ if defined?(VCR)
457
+ case switch
458
+ when :on
459
+ VCR.turn_on!
460
+ when :off
461
+ VCR.turn_off!(ignore_cassettes: true)
462
+ end
463
+ end
464
+
465
+ if defined?(WebMock)
466
+ # WebMock on by default
467
+ # VCR depends on WebMock 1.8.11; no method to check whether enabled.
468
+ case switch
469
+ when :on
470
+ WebMock.enable!
471
+ when :off
472
+ WebMock.disable!
473
+ end
474
+ end
475
+
476
+ true
477
+ end
478
+ end
@@ -0,0 +1,516 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+
5
+ class TestCodecov < Minitest::Test
6
+ REALENV = {
7
+ 'TRAVIS_BRANCH' => ENV['TRAVIS_BRANCH'],
8
+ 'TRAVIS_COMMIT' => ENV['TRAVIS_COMMIT'],
9
+ 'TRAVIS_REPO_SLUG' => ENV['TRAVIS_REPO_SLUG'],
10
+ 'TRAVIS_JOB_NUMBER' => ENV['TRAVIS_JOB_NUMBER'],
11
+ 'TRAVIS_PULL_REQUEST' => ENV['TRAVIS_PULL_REQUEST'],
12
+ 'TRAVIS_JOB_ID' => ENV['TRAVIS_JOB_ID']
13
+ }.freeze
14
+ def url
15
+ ENV['CODECOV_URL'] || 'https://codecov.io'
16
+ end
17
+
18
+ def test_defined
19
+ assert defined?(SimpleCov::Formatter::Codecov)
20
+ assert defined?(SimpleCov::Formatter::Codecov::VERSION)
21
+ end
22
+
23
+ def stub_file(filename, coverage)
24
+ lines = coverage.each_with_index.map do |cov, i|
25
+ skipped = false
26
+ if cov == :skipped
27
+ skipped = true
28
+ cov = 0
29
+ end
30
+ stub('SimpleCov::SourceFile::Line', skipped?: skipped, line_number: i + 1, coverage: cov)
31
+ end
32
+ stub('SimpleCov::SourceFile', filename: filename, lines: lines)
33
+ end
34
+
35
+ def upload
36
+ formatter = SimpleCov::Formatter::Codecov.new
37
+ result = stub('SimpleCov::Result', files: [
38
+ stub_file('/path/lib/something.rb', [1, 0, 0, nil, 1, nil]),
39
+ stub_file('/path/lib/somefile.rb', [1, nil, 1, 1, 1, 0, 0, nil, 1, nil])
40
+ ])
41
+ SimpleCov.stubs(:root).returns('/path')
42
+ data = formatter.format(result)
43
+ puts data
44
+ puts data['params']
45
+ assert_equal(data['result']['uploaded'], true)
46
+ assert_equal(data['result']['message'], 'Coverage reports upload successfully')
47
+ assert_equal(data['meta']['version'], 'codecov-ruby/v' + SimpleCov::Formatter::Codecov::VERSION)
48
+ assert_equal(data['coverage'].to_json, {
49
+ 'lib/something.rb' => [nil, 1, 0, 0, nil, 1, nil],
50
+ 'lib/somefile.rb' => [nil, 1, nil, 1, 1, 1, 0, 0, nil, 1, nil]
51
+ }.to_json)
52
+ data
53
+ end
54
+
55
+ def setup
56
+ ENV['CI'] = nil
57
+ ENV['TRAVIS'] = nil
58
+ end
59
+
60
+ def teardown
61
+ # needed for sending this projects coverage
62
+ ENV['APPVEYOR'] = nil
63
+ ENV['APPVEYOR_ACCOUNT_NAME'] = nil
64
+ ENV['APPVEYOR_BUILD_VERSION'] = nil
65
+ ENV['APPVEYOR_JOB_ID'] = nil
66
+ ENV['APPVEYOR_PROJECT_SLUG'] = nil
67
+ ENV['APPVEYOR_PULL_REQUEST_NUMBER'] = nil
68
+ ENV['APPVEYOR_REPO_BRANCH'] = nil
69
+ ENV['APPVEYOR_REPO_COMMIT'] = nil
70
+ ENV['APPVEYOR_REPO_NAME'] = nil
71
+ ENV['BITBUCKET_BRANCH'] = nil
72
+ ENV['BITBUCKET_BUILD_NUMBER'] = nil
73
+ ENV['BITBUCKET_COMMIT'] = nil
74
+ ENV['BITRISE_BUILD_NUMBER'] = nil
75
+ ENV['BITRISE_BUILD_URL'] = nil
76
+ ENV['BITRISE_GIT_BRANCH'] = nil
77
+ ENV['BITRISE_GIT_COMMIT'] = nil
78
+ ENV['BITRISE_IO'] = nil
79
+ ENV['BITRISE_PULL_REQUEST'] = nil
80
+ ENV['BITRISEIO_GIT_REPOSITORY_OWNER'] = nil
81
+ ENV['BITRISEIO_GIT_REPOSITORY_SLUG'] = nil
82
+ ENV['BRANCH'] = nil
83
+ ENV['BRANCH_NAME'] = nil
84
+ ENV['BUILD_ID'] = nil
85
+ ENV['BUILD_NUMBER'] = nil
86
+ ENV['BUILD_NUMBER'] = nil
87
+ ENV['BUILD_URL'] = nil
88
+ ENV['BUILDKITE'] = nil
89
+ ENV['BUILDKITE_BRANCH'] = nil
90
+ ENV['BUILDKITE_JOB_ID'] = nil
91
+ ENV['BUILDKITE_BUILD_NUMBER'] = nil
92
+ ENV['BUILDKITE_BUILD_URL'] = nil
93
+ ENV['BUILDKITE_PROJECT_SLUG'] = nil
94
+ ENV['BUILDKITE_COMMIT'] = nil
95
+ ENV['CI'] = 'true'
96
+ ENV['CI_BRANCH'] = nil
97
+ ENV['CI_BUILD_ID'] = nil
98
+ ENV['CI_BUILD_NUMBER'] = nil
99
+ ENV['CI_BUILD_REF'] = nil
100
+ ENV['CI_BUILD_REF_NAME'] = nil
101
+ ENV['CI_BUILD_REPO'] = nil
102
+ ENV['CI_BUILD_URL'] = nil
103
+ ENV['CI_COMMIT'] = nil
104
+ ENV['CI_COMMIT_ID'] = nil
105
+ ENV['CI_NAME'] = nil
106
+ ENV['CI_PROJECT_DIR'] = nil
107
+ ENV['CI_SERVER_NAME'] = nil
108
+ ENV['CI_SERVER_NAME'] = nil
109
+ ENV['CIRCLE_BRANCH'] = nil
110
+ ENV['CIRCLE_BUILD_NUM'] = nil
111
+ ENV['CIRCLE_NODE_INDEX'] = nil
112
+ ENV['CIRCLE_PR_NUMBER'] = nil
113
+ ENV['CIRCLE_PROJECT_REPONAME'] = nil
114
+ ENV['CIRCLE_PROJECT_USERNAME'] = nil
115
+ ENV['CIRCLE_SHA1'] = nil
116
+ ENV['CIRCLECI'] = nil
117
+ ENV['CODECOV_ENV'] = nil
118
+ ENV['CODECOV_SLUG'] = nil
119
+ ENV['CODECOV_TOKEN'] = nil
120
+ ENV['CODECOV_URL'] = nil
121
+ ENV['COMMIT'] = nil
122
+ ENV['DRONE'] = nil
123
+ ENV['DRONE_BRANCH'] = nil
124
+ ENV['DRONE_BUILD_URL'] = nil
125
+ ENV['DRONE_COMMIT'] = nil
126
+ ENV['ghprbActualCommit'] = nil
127
+ ENV['ghprbPullId'] = nil
128
+ ENV['ghprbSourceBranch'] = nil
129
+ ENV['GIT_BRANCH'] = nil
130
+ ENV['GIT_COMMIT'] = nil
131
+ ENV['GITLAB_CI'] = nil
132
+ ENV['HEROKU_TEST_RUN_ID'] = nil
133
+ ENV['HEROKU_TEST_RUN_BRANCH'] = nil
134
+ ENV['HEROKU_TEST_RUN_COMMIT_VERSION'] = nil
135
+ ENV['JENKINS_URL'] = nil
136
+ ENV['MAGNUM'] = nil
137
+ ENV['PULL_REQUEST'] = nil
138
+ ENV['REPO_NAME'] = nil
139
+ ENV['REVISION'] = nil
140
+ ENV['SEMAPHORE'] = nil
141
+ ENV['SEMAPHORE_BUILD_NUMBER'] = nil
142
+ ENV['SEMAPHORE_CURRENT_THREAD'] = nil
143
+ ENV['SEMAPHORE_REPO_SLUG'] = nil
144
+ ENV['SHIPPABLE'] = nil
145
+ ENV['TF_BUILD'] = nil
146
+ ENV['TRAVIS'] = 'true'
147
+ ENV['TRAVIS_BRANCH'] = REALENV['TRAVIS_BRANCH']
148
+ ENV['TRAVIS_COMMIT'] = REALENV['TRAVIS_COMMIT']
149
+ ENV['TRAVIS_JOB_ID'] = REALENV['TRAVIS_JOB_ID']
150
+ ENV['TRAVIS_JOB_NUMBER'] = REALENV['TRAVIS_JOB_NUMBER']
151
+ ENV['TRAVIS_PULL_REQUEST'] = REALENV['TRAVIS_PULL_REQUEST']
152
+ ENV['TRAVIS_REPO_SLUG'] = REALENV['TRAVIS_REPO_SLUG']
153
+ ENV['VCS_COMMIT_ID'] = nil
154
+ ENV['WERCKER_GIT_BRANCH'] = nil
155
+ ENV['WERCKER_GIT_COMMIT'] = nil
156
+ ENV['WERCKER_GIT_OWNER'] = nil
157
+ ENV['WERCKER_GIT_REPOSITORY'] = nil
158
+ ENV['WERCKER_MAIN_PIPELINE_STARTED'] = nil
159
+ ENV['WORKSPACE'] = nil
160
+ end
161
+
162
+ def test_git
163
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
164
+ result = upload
165
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
166
+ branch = `git rev-parse --abbrev-ref HEAD`.strip
167
+ assert_equal(branch != 'HEAD' ? branch : 'master', result['params'][:branch])
168
+ assert_equal(`git rev-parse HEAD`.strip, result['params'][:commit])
169
+ end
170
+
171
+ def test_travis
172
+ ENV['CI'] = 'true'
173
+ ENV['TRAVIS'] = 'true'
174
+ ENV['TRAVIS_BRANCH'] = 'master'
175
+ ENV['TRAVIS_COMMIT'] = 'c739768fcac68144a3a6d82305b9c4106934d31a'
176
+ ENV['TRAVIS_JOB_ID'] = '33116958'
177
+ ENV['TRAVIS_PULL_REQUEST'] = 'false'
178
+ ENV['TRAVIS_JOB_NUMBER'] = '1'
179
+ ENV['TRAVIS_REPO_SLUG'] = 'codecov/ci-repo'
180
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
181
+ result = upload
182
+ assert_equal('travis', result['params'][:service])
183
+ assert_equal('c739768fcac68144a3a6d82305b9c4106934d31a', result['params'][:commit])
184
+ assert_equal('codecov/ci-repo', result['params'][:slug])
185
+ assert_equal('1', result['params'][:build])
186
+ assert_equal('33116958', result['params'][:job])
187
+ assert_equal('false', result['params'][:pull_request])
188
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
189
+ end
190
+
191
+ def test_codeship
192
+ ENV['CI'] = 'true'
193
+ ENV['CI_NAME'] = 'codeship'
194
+ ENV['CI_BRANCH'] = 'master'
195
+ ENV['CI_BUILD_NUMBER'] = '1'
196
+ ENV['CI_COMMIT_ID'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
197
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
198
+ result = upload
199
+ assert_equal('codeship', result['params'][:service])
200
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
201
+ assert_equal('1', result['params'][:build])
202
+ assert_equal('master', result['params'][:branch])
203
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
204
+ end
205
+
206
+ def test_buildkite
207
+ ENV['CI'] = 'true'
208
+ ENV['BUILDKITE'] = 'true'
209
+ ENV['BUILDKITE_BRANCH'] = 'master'
210
+ ENV['BUILDKITE_BUILD_NUMBER'] = '1'
211
+ ENV['BUILDKITE_JOB_ID'] = '2'
212
+ ENV['BUILDKITE_BUILD_URL'] = 'http://demo'
213
+ ENV['BUILDKITE_PROJECT_SLUG'] = 'owner/repo'
214
+ ENV['BUILDKITE_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
215
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
216
+ result = upload
217
+ assert_equal('buildkite', result['params'][:service])
218
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
219
+ assert_equal('1', result['params'][:build])
220
+ assert_equal('2', result['params'][:job])
221
+ assert_equal('master', result['params'][:branch])
222
+ assert_equal('owner/repo', result['params'][:slug])
223
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
224
+ end
225
+
226
+ def test_jenkins
227
+ ENV['JENKINS_URL'] = 'true'
228
+ ENV['ghprbSourceBranch'] = 'master'
229
+ ENV['BUILD_NUMBER'] = '1'
230
+ ENV['ghprbActualCommit'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
231
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
232
+ ENV['BUILD_URL'] = 'https://jenkins'
233
+ ENV['ghprbPullId'] = '1'
234
+ result = upload
235
+ assert_equal('jenkins', result['params'][:service])
236
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
237
+ assert_equal('1', result['params'][:build])
238
+ assert_equal('1', result['params'][:pr])
239
+ assert_equal('master', result['params'][:branch])
240
+ assert_equal('https://jenkins', result['params'][:build_url])
241
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
242
+ end
243
+
244
+ def test_jenkins_2
245
+ ENV['JENKINS_URL'] = 'true'
246
+ ENV['GIT_BRANCH'] = 'master'
247
+ ENV['BUILD_NUMBER'] = '1'
248
+ ENV['GIT_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
249
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
250
+ ENV['BUILD_URL'] = 'https://jenkins'
251
+ result = upload
252
+ assert_equal('jenkins', result['params'][:service])
253
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
254
+ assert_equal('1', result['params'][:build])
255
+ assert_equal('master', result['params'][:branch])
256
+ assert_equal('https://jenkins', result['params'][:build_url])
257
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
258
+ end
259
+
260
+ def test_shippable
261
+ ENV['CI'] = 'true'
262
+ ENV['SHIPPABLE'] = 'true'
263
+ ENV['BRANCH'] = 'master'
264
+ ENV['BUILD_NUMBER'] = '1'
265
+ ENV['BUILD_URL'] = 'http://shippable.com/...'
266
+ ENV['PULL_REQUEST'] = 'false'
267
+ ENV['REPO_NAME'] = 'owner/repo'
268
+ ENV['COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
269
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
270
+ result = upload
271
+ assert_equal('shippable', result['params'][:service])
272
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
273
+ assert_equal('false', result['params'][:pull_request])
274
+ assert_equal('1', result['params'][:build])
275
+ assert_equal('http://shippable.com/...', result['params'][:build_url])
276
+ assert_equal('master', result['params'][:branch])
277
+ assert_equal('owner/repo', result['params'][:slug])
278
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
279
+ end
280
+
281
+ def test_appveyor
282
+ ENV['CI'] = 'True'
283
+ ENV['APPVEYOR'] = 'True'
284
+ ENV['APPVEYOR_REPO_BRANCH'] = 'master'
285
+ ENV['APPVEYOR_JOB_ID'] = 'build'
286
+ ENV['APPVEYOR_PULL_REQUEST_NUMBER'] = '1'
287
+ ENV['APPVEYOR_ACCOUNT_NAME'] = 'owner'
288
+ ENV['APPVEYOR_PROJECT_SLUG'] = 'repo'
289
+ ENV['APPVEYOR_BUILD_VERSION'] = 'job'
290
+ ENV['APPVEYOR_REPO_NAME'] = 'owner/repo'
291
+ ENV['APPVEYOR_REPO_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
292
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
293
+ result = upload
294
+ assert_equal('appveyor', result['params'][:service])
295
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
296
+ assert_equal('master', result['params'][:branch])
297
+ assert_equal('owner/repo', result['params'][:slug])
298
+ assert_equal('1', result['params'][:pr])
299
+ assert_equal('build', result['params'][:build])
300
+ assert_equal('owner/repo/job', result['params'][:job])
301
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
302
+ end
303
+
304
+ def test_circleci
305
+ ENV['CI'] = 'true'
306
+ ENV['CIRCLECI'] = 'true'
307
+ ENV['CIRCLE_BRANCH'] = 'master'
308
+ ENV['CIRCLE_BUILD_NUM'] = '1'
309
+ ENV['CIRCLE_NODE_INDEX'] = '2'
310
+ ENV['CIRCLE_PR_NUMBER'] = '3'
311
+ ENV['CIRCLE_PROJECT_USERNAME'] = 'owner'
312
+ ENV['CIRCLE_PROJECT_REPONAME'] = 'repo'
313
+ ENV['CIRCLE_SHA1'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
314
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
315
+ result = upload
316
+ assert_equal('circleci', result['params'][:service])
317
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
318
+ assert_equal('1', result['params'][:build])
319
+ assert_equal('2', result['params'][:job])
320
+ assert_equal('3', result['params'][:pr])
321
+ assert_equal('master', result['params'][:branch])
322
+ assert_equal('owner/repo', result['params'][:slug])
323
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
324
+ end
325
+
326
+ def test_semaphore
327
+ ENV['CI'] = 'true'
328
+ ENV['SEMAPHORE'] = 'true'
329
+ ENV['BRANCH_NAME'] = 'master'
330
+ ENV['SEMAPHORE_REPO_SLUG'] = 'owner/repo'
331
+ ENV['SEMAPHORE_BUILD_NUMBER'] = '1'
332
+ ENV['SEMAPHORE_CURRENT_THREAD'] = '2'
333
+ ENV['REVISION'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
334
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
335
+ result = upload
336
+ assert_equal('semaphore', result['params'][:service])
337
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
338
+ assert_equal('1', result['params'][:build])
339
+ assert_equal('2', result['params'][:job])
340
+ assert_equal('master', result['params'][:branch])
341
+ assert_equal('owner/repo', result['params'][:slug])
342
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
343
+ end
344
+
345
+ def test_drone
346
+ ENV['CI'] = 'true'
347
+ ENV['DRONE'] = 'true'
348
+ ENV['DRONE_BRANCH'] = 'master'
349
+ ENV['DRONE_BUILD_NUMBER'] = '1'
350
+ ENV['DRONE_BUILD_URL'] = 'https://drone.io/...'
351
+ ENV['DRONE_COMMIT'] = '1123566'
352
+ ENV['CODECOV_SLUG'] = 'codecov/ci-repo'
353
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
354
+ result = upload
355
+ assert_equal('drone.io', result['params'][:service])
356
+ assert_equal(`git rev-parse HEAD`.strip, result['params'][:commit])
357
+ assert_equal('1', result['params'][:build])
358
+ assert_equal('https://drone.io/...', result['params'][:build_url])
359
+ assert_equal('codecov/ci-repo', result['params'][:slug])
360
+ assert_equal('master', result['params'][:branch])
361
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
362
+ end
363
+
364
+ def test_wercker
365
+ ENV['CI'] = 'true'
366
+ ENV['WERCKER_GIT_BRANCH'] = 'master'
367
+ ENV['WERCKER_MAIN_PIPELINE_STARTED'] = '1'
368
+ ENV['WERCKER_GIT_OWNER'] = 'owner'
369
+ ENV['WERCKER_GIT_REPOSITORY'] = 'repo'
370
+ ENV['WERCKER_GIT_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
371
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
372
+ result = upload
373
+ assert_equal('wercker', result['params'][:service])
374
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
375
+ assert_equal('1', result['params'][:build])
376
+ assert_equal('master', result['params'][:branch])
377
+ assert_equal('owner/repo', result['params'][:slug])
378
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
379
+ end
380
+
381
+ def test_gitlab
382
+ ENV['GITLAB_CI'] = 'true'
383
+ ENV['CI_BUILD_REF_NAME'] = 'master'
384
+ ENV['CI_BUILD_ID'] = '1'
385
+ ENV['CI_BUILD_REPO'] = 'https://gitlab.com/owner/repo.git'
386
+ ENV['CI_BUILD_REF'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
387
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
388
+ result = upload
389
+ assert_equal('gitlab', result['params'][:service])
390
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
391
+ assert_equal('1', result['params'][:build])
392
+ assert_equal('master', result['params'][:branch])
393
+ assert_equal('owner/repo', result['params'][:slug])
394
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
395
+ end
396
+
397
+ def test_bitrise
398
+ ENV['CI'] = 'true'
399
+ ENV['BITRISE_IO'] = 'true'
400
+ ENV['BITRISE_BUILD_NUMBER'] = '1'
401
+ ENV['BITRISE_BUILD_URL'] = 'https://app.bitrise.io/build/123'
402
+ ENV['BITRISE_GIT_BRANCH'] = 'master'
403
+ ENV['BITRISE_PULL_REQUEST'] = '2'
404
+ ENV['BITRISEIO_GIT_REPOSITORY_OWNER'] = 'owner'
405
+ ENV['BITRISEIO_GIT_REPOSITORY_SLUG'] = 'repo'
406
+ ENV['BITRISE_GIT_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
407
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
408
+ result = upload
409
+ assert_equal('bitrise', result['params'][:service])
410
+ assert_equal('1', result['params'][:build])
411
+ assert_equal('https://app.bitrise.io/build/123', result['params'][:build_url])
412
+ assert_equal('master', result['params'][:branch])
413
+ assert_equal('2', result['params'][:pr])
414
+ assert_equal('owner/repo', result['params'][:slug])
415
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
416
+ end
417
+
418
+ def test_teamcity
419
+ ENV['CI_SERVER_NAME'] = 'TeamCity'
420
+ ENV['TEAMCITY_BUILD_BRANCH'] = 'master'
421
+ ENV['TEAMCITY_BUILD_ID'] = '1'
422
+ ENV['TEAMCITY_BUILD_URL'] = 'http://teamcity/...'
423
+ ENV['TEAMCITY_BUILD_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
424
+ ENV['TEAMCITY_BUILD_REPOSITORY'] = 'https://github.com/owner/repo.git'
425
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
426
+ result = upload
427
+ assert_equal('teamcity', result['params'][:service])
428
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
429
+ assert_equal('1', result['params'][:build])
430
+ assert_equal('master', result['params'][:branch])
431
+ assert_equal('owner/repo', result['params'][:slug])
432
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
433
+ end
434
+
435
+ def test_azure_pipelines
436
+ ENV['TF_BUILD'] = '1'
437
+ ENV['BUILD_SOURCEBRANCH'] = 'master'
438
+ ENV['SYSTEM_JOBID'] = '92a2fa25-f940-5df6-a185-81eb9ae2031d'
439
+ ENV['BUILD_BUILDID'] = '1'
440
+ ENV['SYSTEM_TEAMFOUNDATIONSERVERURI'] = 'https://dev.azure.com/codecov/'
441
+ ENV['SYSTEM_TEAMPROJECT'] = 'repo'
442
+ ENV['BUILD_SOURCEVERSION'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
443
+ ENV['BUILD_REPOSITORY_ID'] = 'owner/repo'
444
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
445
+ result = upload
446
+ assert_equal('azure_pipelines', result['params'][:service])
447
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
448
+ assert_equal('1', result['params'][:build])
449
+ assert_equal('master', result['params'][:branch])
450
+ assert_equal('owner/repo', result['params'][:slug])
451
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
452
+ end
453
+
454
+ def test_heroku
455
+ ENV['HEROKU_TEST_RUN_ID'] = '454f5dc9-afa4-433f-bb28-84678a00fd98'
456
+ ENV['HEROKU_TEST_RUN_BRANCH'] = 'master'
457
+ ENV['HEROKU_TEST_RUN_COMMIT_VERSION'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
458
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
459
+
460
+ result = upload
461
+ assert_equal('heroku', result['params'][:service])
462
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
463
+ assert_equal('454f5dc9-afa4-433f-bb28-84678a00fd98', result['params'][:build])
464
+ assert_equal('master', result['params'][:branch])
465
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
466
+ end
467
+
468
+ def test_bitbucket_pr
469
+ ENV['CI'] = 'true'
470
+ ENV['BITBUCKET_BUILD_NUMBER'] = '100'
471
+ ENV['BITBUCKET_BRANCH'] = 'master'
472
+ ENV['BITBUCKET_COMMIT'] = '743b04806ea67'
473
+ ENV['VCS_COMMIT_ID'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
474
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
475
+
476
+ result = upload
477
+ assert_equal('bitbucket', result['params'][:service])
478
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
479
+ assert_equal('100', result['params'][:build])
480
+ assert_equal('master', result['params'][:branch])
481
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
482
+ end
483
+
484
+ def test_bitbucket
485
+ ENV['CI'] = 'true'
486
+ ENV['BITBUCKET_BUILD_NUMBER'] = '100'
487
+ ENV['BITBUCKET_BRANCH'] = 'master'
488
+ ENV['BITBUCKET_COMMIT'] = '743b04806ea677403aa2ff26c6bdeb85005de658'
489
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
490
+
491
+ result = upload
492
+ assert_equal('bitbucket', result['params'][:service])
493
+ assert_equal('743b04806ea677403aa2ff26c6bdeb85005de658', result['params'][:commit])
494
+ assert_equal('100', result['params'][:build])
495
+ assert_equal('master', result['params'][:branch])
496
+ assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
497
+ end
498
+
499
+ def test_filenames_are_shortened_correctly
500
+ ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
501
+
502
+ formatter = SimpleCov::Formatter::Codecov.new
503
+ result = stub('SimpleCov::Result', files: [
504
+ stub_file('/path/lib/something.rb', []),
505
+ stub_file('/path/path/lib/path_somefile.rb', [])
506
+ ])
507
+ SimpleCov.stubs(:root).returns('/path')
508
+ data = formatter.format(result)
509
+ puts data
510
+ puts data['params']
511
+ assert_equal(data['coverage'].to_json, {
512
+ 'lib/something.rb' => [nil],
513
+ 'path/lib/path_somefile.rb' => [nil]
514
+ }.to_json)
515
+ end
516
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yankedcodecov
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.18
5
+ platform: ruby
6
+ authors:
7
+ - codecov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: url
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: hosted code coverage
112
+ email:
113
+ - hello@codecov.io
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - lib/yankedcodecov.rb
119
+ - test/test_yankedcodecov.rb
120
+ homepage: https://github.com/codecov/codecov-ruby
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.1.2
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: hosted code coverage ruby/rails reporter
143
+ test_files:
144
+ - test/test_yankedcodecov.rb