coverband 6.1.2.rc.1 → 6.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +1 -0
  3. data/.rubocop.yml +5 -0
  4. data/README.md +3 -16
  5. data/changes.md +20 -0
  6. data/coverband.gemspec +5 -4
  7. data/lib/coverband/adapters/base.rb +5 -22
  8. data/lib/coverband/adapters/file_store.rb +0 -4
  9. data/lib/coverband/adapters/hash_redis_store.rb +20 -106
  10. data/lib/coverband/adapters/memcached_store.rb +0 -4
  11. data/lib/coverband/adapters/null_store.rb +0 -4
  12. data/lib/coverband/adapters/redis_store.rb +9 -22
  13. data/lib/coverband/adapters/stdout_store.rb +0 -4
  14. data/lib/coverband/collectors/abstract_tracker.rb +7 -2
  15. data/lib/coverband/collectors/coverage.rb +7 -18
  16. data/lib/coverband/collectors/delta.rb +1 -1
  17. data/lib/coverband/collectors/view_tracker.rb +3 -2
  18. data/lib/coverband/configuration.rb +6 -20
  19. data/lib/coverband/integrations/background.rb +2 -0
  20. data/lib/coverband/integrations/sidekiq_swarm.rb +8 -0
  21. data/lib/coverband/reporters/base.rb +2 -2
  22. data/lib/coverband/reporters/console_report.rb +13 -3
  23. data/lib/coverband/reporters/json_report.rb +36 -2
  24. data/lib/coverband/utils/dead_methods.rb +1 -1
  25. data/lib/coverband/utils/html_formatter.rb +18 -1
  26. data/lib/coverband/utils/results.rb +13 -0
  27. data/lib/coverband/utils/source_file.rb +4 -3
  28. data/lib/coverband/utils/tasks.rb +97 -15
  29. data/lib/coverband/version.rb +1 -1
  30. data/lib/coverband.rb +3 -1
  31. data/test/benchmarks/benchmark.rake +0 -1
  32. data/test/coverband/adapters/base_test.rb +1 -4
  33. data/test/coverband/adapters/hash_redis_store_test.rb +0 -51
  34. data/test/coverband/adapters/memecached_store_test.rb +26 -0
  35. data/test/coverband/adapters/redis_store_test.rb +0 -8
  36. data/test/coverband/collectors/coverage_test.rb +0 -42
  37. data/test/coverband/collectors/delta_test.rb +24 -26
  38. data/test/coverband/collectors/route_tracker_test.rb +1 -1
  39. data/test/coverband/collectors/view_tracker_test.rb +15 -2
  40. data/test/coverband/configuration_test.rb +3 -21
  41. data/test/coverband/integrations/resque_worker_test.rb +3 -1
  42. data/test/coverband/reporters/base_test.rb +0 -1
  43. data/test/coverband/reporters/json_test.rb +11 -0
  44. data/test/coverband/reporters/web_test.rb +52 -54
  45. data/test/rails5_dummy/config/coverband.rb +0 -1
  46. data/test/rails5_dummy/config/coverband_missing_redis.rb +0 -1
  47. data/test/test_helper.rb +10 -3
  48. data/views/source_file.erb +1 -1
  49. metadata +37 -20
@@ -7,11 +7,21 @@ module Coverband
7
7
  ###
8
8
  class ConsoleReport < Base
9
9
  def self.report(store, options = {})
10
- scov_style_report = super(store, options)
11
- scov_style_report[:merged].each_pair do |file, usage|
10
+ coverband_reports = Coverband::Reporters::Base.report(store, options)
11
+ fix_reports(coverband_reports)
12
+ result = Coverband::Utils::Results.new(coverband_reports)
13
+ source_files = result.source_files
14
+
15
+ Coverband.configuration.logger.info "total_files: #{source_files.length}"
16
+ Coverband.configuration.logger.info "lines_of_code: #{source_files.lines_of_code}"
17
+ Coverband.configuration.logger.info "lines_covered: #{source_files.covered_lines}"
18
+ Coverband.configuration.logger.info "lines_missed: #{source_files.missed_lines}"
19
+ Coverband.configuration.logger.info "covered_percent: #{source_files.covered_percent}"
20
+
21
+ coverband_reports[:merged].each_pair do |file, usage|
12
22
  Coverband.configuration.logger.info "#{file}: #{usage["data"]}"
13
23
  end
14
- scov_style_report
24
+ coverband_reports
15
25
  end
16
26
  end
17
27
  end
@@ -5,13 +5,16 @@
5
5
  module Coverband
6
6
  module Reporters
7
7
  class JSONReport < Base
8
- attr_accessor :filtered_report_files, :options, :page, :as_report, :store, :filename, :base_path
8
+ attr_accessor :filtered_report_files, :options, :page, :as_report, :store, :filename, :base_path, :line_coverage,
9
+ :for_merged_report
9
10
 
10
11
  def initialize(store, options = {})
11
12
  self.options = options
12
13
  self.page = options.fetch(:page) { nil }
13
14
  self.filename = options.fetch(:filename) { nil }
14
15
  self.as_report = options.fetch(:as_report) { false }
16
+ self.line_coverage = options.fetch(:line_coverage) { false }
17
+ self.for_merged_report = options.fetch(:for_merged_report) { false }
15
18
  self.base_path = options.fetch(:base_path) { "./" }
16
19
  self.store = store
17
20
 
@@ -28,6 +31,33 @@ module Coverband
28
31
  report_as_json
29
32
  end
30
33
 
34
+ def merge_reports(first_report, second_report, options = {})
35
+ merged_data = {}
36
+ merged_data[Coverband::RUNTIME_TYPE.to_s] = Coverband::Adapters::Base.new.send(
37
+ :merge_reports,
38
+ first_report[Coverband::RUNTIME_TYPE.to_s],
39
+ second_report[Coverband::RUNTIME_TYPE.to_s],
40
+ {skip_expansion: true}
41
+ )
42
+ if first_report[Coverband::EAGER_TYPE.to_s] && second_report[Coverband::EAGER_TYPE.to_s]
43
+ merged_data[Coverband::EAGER_TYPE.to_s] = Coverband::Adapters::Base.new.send(
44
+ :merge_reports,
45
+ first_report[Coverband::EAGER_TYPE.to_s],
46
+ second_report[Coverband::EAGER_TYPE.to_s],
47
+ {skip_expansion: true}
48
+ )
49
+ end
50
+ if first_report[Coverband::MERGED_TYPE.to_s] && second_report[Coverband::MERGED_TYPE.to_s]
51
+ merged_data[Coverband::MERGED_TYPE.to_s] = Coverband::Adapters::Base.new.send(
52
+ :merge_reports,
53
+ first_report[Coverband::MERGED_TYPE.to_s],
54
+ second_report[Coverband::MERGED_TYPE.to_s],
55
+ {skip_expansion: true}
56
+ )
57
+ end
58
+ merged_data
59
+ end
60
+
31
61
  private
32
62
 
33
63
  def coverage_css_class(covered_percent)
@@ -43,6 +73,8 @@ module Coverband
43
73
  end
44
74
 
45
75
  def report_as_json
76
+ return filtered_report_files.to_json if for_merged_report
77
+
46
78
  result = Coverband::Utils::Results.new(filtered_report_files)
47
79
  source_files = result.source_files
48
80
 
@@ -97,7 +129,7 @@ module Coverband
97
129
  def coverage_files(result, source_files)
98
130
  source_files.each_with_object({}) do |source_file, hash|
99
131
  runtime_coverage = result.file_with_type(source_file, Coverband::RUNTIME_TYPE)&.covered_lines_count || 0
100
- hash[source_file.short_name] = {
132
+ data = {
101
133
  filename: source_file.filename,
102
134
  hash: Digest::SHA1.hexdigest(source_file.filename),
103
135
  never_loaded: source_file.never_loaded,
@@ -109,6 +141,8 @@ module Coverband
109
141
  covered_percent: source_file.covered_percent,
110
142
  covered_strength: source_file.covered_strength
111
143
  }
144
+ data[:coverage] = source_file.coverage if line_coverage
145
+ hash[source_file.short_name] = data
112
146
  end
113
147
  end
114
148
  end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: ntrue
1
+ # frozen_string_literal: true
2
2
 
3
3
  require "coverband/utils/method_definition_scanner"
4
4
 
@@ -150,6 +150,14 @@ module Coverband
150
150
  end
151
151
  end
152
152
 
153
+ def missed_lines_css_class(count)
154
+ if count == 0
155
+ "green"
156
+ else
157
+ "red"
158
+ end
159
+ end
160
+
153
161
  # Return a (kind of) unique id for the source file given. Uses SHA1 on path for the id
154
162
  def id(source_file)
155
163
  Digest::SHA1.hexdigest(source_file.filename)
@@ -169,7 +177,16 @@ module Coverband
169
177
 
170
178
  def link_to_source_file(source_file)
171
179
  data_loader_url = "#{base_path}load_file_details?filename=#{source_file.filename}"
172
- %(<a href="##{id source_file}" class="src_link" title="#{shortened_filename source_file}" data-loader-url="#{data_loader_url}" onclick="src_link_click(this)">#{shortened_filename source_file}</a>)
180
+ %(<a href="##{id source_file}" class="src_link" title="#{shortened_filename source_file}" data-loader-url="#{data_loader_url}" onclick="src_link_click(this)">#{truncate(shortened_filename(source_file))}</a>)
181
+ end
182
+
183
+ def truncate(text, length: 50)
184
+ if text.length <= length
185
+ text
186
+ else
187
+ omission = "..."
188
+ "#{text[0, length - omission.length]}#{omission}"
189
+ end
173
190
  end
174
191
  end
175
192
  end
@@ -73,6 +73,19 @@ module Coverband
73
73
  get_results(type).respond_to?(method)
74
74
  end
75
75
 
76
+ # Note: small set of hacks for static html simplecov report (groups, created_at, & command_name)
77
+ def groups
78
+ @groups ||= {}
79
+ end
80
+
81
+ def created_at
82
+ @created_at ||= Time.now
83
+ end
84
+
85
+ def command_name
86
+ @command_name ||= "Coverband"
87
+ end
88
+
76
89
  private
77
90
 
78
91
  def get_eager_file(source_file)
@@ -191,7 +191,9 @@ module Coverband
191
191
  end
192
192
 
193
193
  def lines_strength
194
- lines.map(&:coverage).compact.reduce(:+)
194
+ lines.sum do |line|
195
+ line.coverage || 0
196
+ end
195
197
  end
196
198
 
197
199
  def relevant_lines
@@ -256,8 +258,7 @@ module Coverband
256
258
  # was at the start of the file name
257
259
  # I had previously patched this in my local Rails app
258
260
  def short_name
259
- filename.sub(/^#{Coverband.configuration.root}/, ".")
260
- .gsub(%r{^\.\/}, "")
261
+ filename.delete_prefix("#{Coverband.configuration.root}/")
261
262
  end
262
263
 
263
264
  def relative_path
@@ -12,21 +12,100 @@ namespace :coverband do
12
12
  FileUtils.cp(config_template, "./config/coverband.rb")
13
13
  end
14
14
 
15
- desc "report runtime Coverband code coverage"
15
+ desc "console formated report of Coverband code coverage"
16
16
  task :coverage do
17
+ require "coverband/utils/html_formatter"
18
+ require "coverband/utils/result"
19
+ require "coverband/utils/file_list"
20
+ require "coverband/utils/source_file"
21
+ require "coverband/utils/lines_classifier"
22
+ require "coverband/utils/results"
17
23
  Coverband::Reporters::ConsoleReport.report(Coverband.configuration.store)
18
24
  end
19
25
 
20
- if defined?(RubyVM::AbstractSyntaxTree)
21
- require "coverband/utils/dead_methods"
26
+ desc "JSON formated report of Coverband code coverage"
27
+ task :coverage_json do
28
+ require "coverband/utils/html_formatter"
29
+ require "coverband/utils/result"
30
+ require "coverband/utils/file_list"
31
+ require "coverband/utils/source_file"
32
+ require "coverband/utils/lines_classifier"
33
+ require "coverband/utils/results"
34
+ require "coverband/reporters/json_report"
22
35
 
23
- desc "Output all dead methods"
24
- task :dead_methods do
25
- Coverband::Utils::DeadMethods.output_all
36
+ report = Coverband::Reporters::JSONReport.new(Coverband.configuration.store, {
37
+ for_merged_report: !!ENV["FOR_MERGED_REPORT"],
38
+ line_coverage: true
39
+ }).report
40
+ `mkdir -p coverage`
41
+ File.write("coverage/coverage.json.#{Time.now.to_f}", report)
42
+ end
43
+
44
+ ###
45
+ # The Coverband UI now requires the dynamic rack server, however
46
+ # Coverband can still generate a SimpleCov compatible JSON report
47
+ # for use with the SimpleCov HTML formatter.
48
+ #
49
+ # To use this your project Gemfile must include simplecov and simplecov-html
50
+ # gem "simplecov", require: false
51
+ # gem "simplecov-html", require: false
52
+ # the file is written to coverage/index.html
53
+ ###
54
+ desc "static HTML formated report of Coverband code coverage"
55
+ task :coverage_html do
56
+ require "coverband/utils/html_formatter"
57
+ require "coverband/utils/result"
58
+ require "coverband/utils/file_list"
59
+ require "coverband/utils/source_file"
60
+ require "coverband/utils/lines_classifier"
61
+ require "coverband/utils/results"
62
+
63
+ require "simplecov"
64
+ require "simplecov-html"
65
+ `mkdir -p coverage`
66
+ # For a fully static HTML that can be copied to artifacts are part of CI
67
+ # we generate with inline assets
68
+ ENV["SIMPLECOV_INLINE_ASSETS"] = "true"
69
+ coverband_reports = Coverband::Reporters::Base.report(Coverband.configuration.store)
70
+ Coverband::Reporters::Base.fix_reports(coverband_reports)
71
+ result = Coverband::Utils::Results.new(coverband_reports)
72
+ SimpleCov::Formatter::HTMLFormatter.new.format(result)
73
+ end
74
+
75
+ ####
76
+ # This task can aggregate multiple coverage files into a single coverage report
77
+ # * `FOR_MERGED_REPORT=true bundle exec rake coverband:coverage_json` to generate the JSON files
78
+ # * collect all the files over time in some system or as artifacts in CI, then run...
79
+ # * `bundle exec rake coverband:aggregate_coverage` to merge the files
80
+ # * the output will include a timestamp of when it was output...
81
+ ####
82
+ task :aggregate_coverage do |task, args|
83
+ require "coverband/utils/result"
84
+ require "coverband/utils/file_list"
85
+ require "coverband/utils/source_file"
86
+ require "coverband/utils/lines_classifier"
87
+ require "coverband/utils/results"
88
+ require "coverband/reporters/json_report"
89
+
90
+ directory = "./coverage"
91
+ pattern = "coverage.json*"
92
+
93
+ # Use Dir.glob to find files matching the pattern in the specified directory
94
+ files = Dir.glob(File.join(directory, pattern))
95
+
96
+ report = {}
97
+ files.each do |file|
98
+ data = JSON.parse(File.read(file))
99
+ report = if report.empty?
100
+ data
101
+ else
102
+ Coverband::Reporters::JSONReport.new(Coverband.configuration.store).merge_reports(report, data)
103
+ end
26
104
  end
105
+ File.write("coverage/coverage_merged.json.#{Time.now.to_f}", report.to_json)
27
106
  end
28
107
 
29
- desc "report runtime Coverband code coverage"
108
+ desc "Run a simple rack app to report Coverband code coverage"
30
109
  task :coverage_server do
31
110
  if Rake::Task.task_defined?("environment")
32
111
  Rake.application["environment"].invoke
@@ -38,6 +117,17 @@ namespace :coverband do
38
117
  Port: ENV.fetch("COVERBAND_COVERAGE_PORT", 9022).to_i
39
118
  end
40
119
 
120
+ # experimental dead method detection using RubyVM::AbstractSyntaxTree
121
+ # combined with the coverband coverage.
122
+ if defined?(RubyVM::AbstractSyntaxTree)
123
+ require "coverband/utils/dead_methods"
124
+
125
+ desc "Output all dead methods"
126
+ task :dead_methods do
127
+ Coverband::Utils::DeadMethods.output_all
128
+ end
129
+ end
130
+
41
131
  ###
42
132
  # clear data helpful for development or after configuration issues
43
133
  ###
@@ -54,12 +144,4 @@ namespace :coverband do
54
144
  trackers = Coverband.configuration.trackers
55
145
  trackers.each(&:reset_recordings)
56
146
  end
57
-
58
- ###
59
- # Updates the data in the coverband store from one format to another
60
- ###
61
- desc "upgrade previous Coverband datastore to latest format"
62
- task :migrate do
63
- Coverband.configuration.store.migrate!
64
- end
65
147
  end
@@ -5,5 +5,5 @@
5
5
  # use format "4.2.1.rc.1" ~> 4.2.1.rc to prerelease versions like v4.2.1.rc.2 and v4.2.1.rc.3
6
6
  ###
7
7
  module Coverband
8
- VERSION = "6.1.2.rc.1"
8
+ VERSION = "6.1.3"
9
9
  end
data/lib/coverband.rb CHANGED
@@ -14,6 +14,7 @@ require "coverband/adapters/hash_redis_store"
14
14
  require "coverband/adapters/file_store"
15
15
  require "coverband/adapters/stdout_store"
16
16
  require "coverband/adapters/null_store"
17
+ require "coverband/adapters/memcached_store"
17
18
  require "coverband/utils/file_hasher"
18
19
  require "coverband/collectors/coverage"
19
20
  require "coverband/collectors/abstract_tracker"
@@ -51,7 +52,7 @@ module Coverband
51
52
  elsif File.exist?(configuration_file)
52
53
  load configuration_file
53
54
  else
54
- configuration.logger.debug("using default configuration")
55
+ configuration.logger.debug("using default configuration") if Coverband.configuration.verbose
55
56
  end
56
57
  @@configured = true
57
58
  coverage_instance.reset_instance
@@ -116,6 +117,7 @@ module Coverband
116
117
  start
117
118
  end
118
119
  require "coverband/integrations/resque" if defined? ::Resque
120
+ require "coverband/integrations/sidekiq_swarm" if defined? ::Sidekiq::Enterprise::Swarm
119
121
  rescue Redis::CannotConnectError => error
120
122
  Coverband.configuration.logger.info "Redis is not available (#{error}), Coverband not configured"
121
123
  Coverband.configuration.logger.info "If this is a setup task like assets:precompile feel free to ignore"
@@ -61,7 +61,6 @@ namespace :benchmarks do
61
61
  config.logger = $stdout
62
62
  config.store = benchmark_redis_store
63
63
  config.use_oneshot_lines_coverage = true if ENV["ONESHOT"]
64
- config.simulate_oneshot_lines_coverage = true if ENV["SIMULATE_ONESHOT"]
65
64
  end
66
65
  end
67
66
 
@@ -4,7 +4,7 @@ require File.expand_path("../../test_helper", File.dirname(__FILE__))
4
4
 
5
5
  class AdaptersBaseTest < Minitest::Test
6
6
  def test_abstract_methods
7
- abstract_methods = %w[clear! clear_file! migrate! size save_coverage coverage]
7
+ abstract_methods = %w[clear! clear_file! size save_coverage coverage]
8
8
  abstract_methods.each do |method|
9
9
  assert_raises RuntimeError do
10
10
  Coverband::Adapters::Base.new.send(method.to_sym)
@@ -26,9 +26,6 @@ class AdaptersBaseTest < Minitest::Test
26
26
  assert_equal [8, 11, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
27
27
  Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
28
28
  assert_equal [1, 1, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
29
- Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(false)
30
- Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
31
- assert_equal [1, 1, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
32
29
  end
33
30
 
34
31
  describe "Coverband::Adapters::Base using file" do
@@ -192,57 +192,6 @@ class HashRedisStoreTest < Minitest::Test
192
192
  assert_nil @store.get_coverage_report[:merged]["./dog.rb"]
193
193
  end
194
194
 
195
- def test_get_coverage_cache
196
- @store = Coverband::Adapters::HashRedisStore.new(
197
- @redis,
198
- redis_namespace: "coverband_test",
199
- relative_file_converter: MockRelativeFileConverter,
200
- get_coverage_cache: true
201
- )
202
- @store.get_coverage_cache.stubs(:deferred_time).returns(0)
203
- @store.get_coverage_cache.clear!
204
- mock_file_hash
205
- yesterday = DateTime.now.prev_day.to_time
206
- mock_time(yesterday)
207
- @store.save_report(
208
- "app_path/dog.rb" => [0, 1, 2]
209
- )
210
- assert_equal(
211
- {
212
- "first_updated_at" => yesterday.to_i,
213
- "last_updated_at" => yesterday.to_i,
214
- "file_hash" => "abcd",
215
- "data" => [0, 1, 2],
216
- "timedata" => [nil, Time.at(yesterday.to_i), Time.at(yesterday.to_i)]
217
- },
218
- @store.coverage["./dog.rb"]
219
- )
220
- @store.save_report(
221
- "app_path/dog.rb" => [0, 1, 2]
222
- )
223
- assert_equal(
224
- {
225
- "first_updated_at" => yesterday.to_i,
226
- "last_updated_at" => yesterday.to_i,
227
- "file_hash" => "abcd",
228
- "data" => [0, 1, 2],
229
- "timedata" => [nil, Time.at(yesterday.to_i), Time.at(yesterday.to_i)]
230
- },
231
- @store.coverage["./dog.rb"]
232
- )
233
- sleep 0.1 # wait caching thread finish
234
- assert_equal(
235
- {
236
- "first_updated_at" => yesterday.to_i,
237
- "last_updated_at" => yesterday.to_i,
238
- "file_hash" => "abcd",
239
- "data" => [0, 2, 4],
240
- "timedata" => [nil, Time.at(yesterday.to_i), Time.at(yesterday.to_i)]
241
- },
242
- @store.coverage["./dog.rb"]
243
- )
244
- end
245
-
246
195
  def test_split_coverage
247
196
  @store = Coverband::Adapters::HashRedisStore.new(
248
197
  @redis,
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path("../../test_helper", File.dirname(__FILE__))
4
+
5
+ if ENV["COVERBAND_MEMCACHED"]
6
+ require "active_support"
7
+ require "dalli"
8
+
9
+ class MemcachedTest < Minitest::Test
10
+ def setup
11
+ super
12
+ @store = Coverband::Adapters::MemcachedStore.new(ActiveSupport::Cache::MemCacheStore.new)
13
+ end
14
+
15
+ def test_coverage
16
+ @store.clear!
17
+ mock_file_hash
18
+ expected = basic_coverage
19
+ @store.save_report(expected)
20
+ assert_equal expected.keys, @store.coverage.keys
21
+ @store.coverage.each_pair do |key, data|
22
+ assert_equal expected[key], data["data"]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -79,14 +79,6 @@ unless ENV["COVERBAND_HASH_REDIS_STORE"]
79
79
  assert_equal example_line, @store.coverage["app_path/dog.rb"]["data"]
80
80
  end
81
81
 
82
- def test_coverage_with_simulate_oneshot_lines_coverage
83
- Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
84
- mock_file_hash
85
- expected = basic_coverage
86
- @store.save_report(expected)
87
- assert_equal example_line, @store.get_coverage_report[:runtime]["app_path/dog.rb"]["data"]
88
- end
89
-
90
82
  def test_coverage_when_null
91
83
  assert_nil @store.coverage["app_path/dog.rb"]
92
84
  end
@@ -92,46 +92,4 @@ class CollectorsCoverageTest < Minitest::Test
92
92
  ::Coverage.expects(:resume)
93
93
  Coverband::Collectors::Coverage.send(:new)
94
94
  end
95
-
96
- test "one shot line coverage disabled for ruby >= 2.6" do
97
- return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.5.0")
98
- ::Coverage.expects(:respond_to?).returns(false)
99
-
100
- Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with("2.6.0").returns(true)
101
- ::Coverage.expects(:running?).returns(false)
102
- ::Coverage.expects(:start).with(oneshot_lines: false)
103
- Coverband::Collectors::Coverage.send(:new)
104
- end
105
-
106
- test "one shot line coverage enabled for ruby >= 2.6" do
107
- return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.5.0")
108
- ::Coverage.expects(:respond_to?).returns(false)
109
-
110
- Coverband.configuration.expects(:use_oneshot_lines_coverage).returns(true)
111
- Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with("2.6.0").returns(true)
112
- ::Coverage.expects(:running?).returns(false)
113
- ::Coverage.expects(:start).with(oneshot_lines: true)
114
- Coverband::Collectors::Coverage.send(:new)
115
- end
116
-
117
- test "one shot line coverage for ruby >= 2.6 when already running" do
118
- return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.5.0")
119
- ::Coverage.expects(:respond_to?).returns(false)
120
-
121
- Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with("2.6.0").returns(true)
122
- ::Coverage.expects(:running?).returns(true)
123
- ::Coverage.expects(:start).never
124
- Coverband::Collectors::Coverage.send(:new)
125
- end
126
-
127
- test "no one shot line coverage for ruby < 2.6" do
128
- return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.5.0")
129
- ::Coverage.expects(:respond_to?).returns(false)
130
-
131
- Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with("2.6.0").returns(false)
132
- Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with("2.5.0").returns(true)
133
- ::Coverage.expects(:running?).returns(false)
134
- ::Coverage.expects(:start).with
135
- Coverband::Collectors::Coverage.send(:new)
136
- end
137
95
  end
@@ -92,35 +92,33 @@ class CollectorsDeltaTest < Minitest::Test
92
92
  assert_equal({"car.rb" => [nil, 0, 2, 0]}, results)
93
93
  end
94
94
 
95
- if Coverband.configuration.one_shot_coverage_implemented_in_ruby_version?
96
- test "oneshot coverage calls clear" do
97
- Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
98
- current_coverage = {
99
- "car.rb" => [1, 5]
100
- }
95
+ test "oneshot coverage calls clear" do
96
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
97
+ current_coverage = {
98
+ "car.rb" => [1, 5]
99
+ }
101
100
 
102
- ::Coverage.expects(:result).with(clear: true, stop: false).returns(current_coverage)
103
- Coverband::Collectors::Delta::RubyCoverage.results
104
- end
101
+ ::Coverage.expects(:result).with(clear: true, stop: false).returns(current_coverage)
102
+ Coverband::Collectors::Delta::RubyCoverage.results
103
+ end
105
104
 
106
- test "one shot lines results" do
107
- Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
108
- current_coverage = {}
109
- results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
110
- assert_equal(current_coverage, results)
105
+ test "one shot lines results" do
106
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
107
+ current_coverage = {}
108
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
109
+ assert_equal(current_coverage, results)
111
110
 
112
- current_coverage = {
113
- "dealership.rb" => {
114
- oneshot_lines: [2, 3]
115
- }
116
- }
117
- Coverband::Collectors::Delta.class_variable_set(:@@project_directory, "dealership.rb")
118
- ::Coverage.expects(:line_stub).with("dealership.rb").returns([nil, 0, 0, nil])
119
- results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
120
- expected = {
121
- "dealership.rb" => [nil, 1, 1, nil]
111
+ current_coverage = {
112
+ "dealership.rb" => {
113
+ oneshot_lines: [2, 3]
122
114
  }
123
- assert_equal(expected, results)
124
- end
115
+ }
116
+ Coverband::Collectors::Delta.class_variable_set(:@@project_directory, "dealership.rb")
117
+ ::Coverage.expects(:line_stub).with("dealership.rb").returns([nil, 0, 0, nil])
118
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
119
+ expected = {
120
+ "dealership.rb" => [nil, 1, 1, nil]
121
+ }
122
+ assert_equal(expected, results)
125
123
  end
126
124
  end
@@ -174,7 +174,7 @@ class RouterTrackerTest < Minitest::Test
174
174
  method: "GET"
175
175
  }
176
176
  store.raw_store.expects(:del).with(tracker_key)
177
- store.raw_store.expects(:del).with("RouteTracker_tracker_time")
177
+ store.raw_store.expects(:del).with("#{tracker_key}_time")
178
178
  tracker = Coverband::Collectors::RouteTracker.new(store: store, roots: "dir")
179
179
  tracker.track_key(payload)
180
180
  tracker.reset_recordings
@@ -4,11 +4,12 @@ require File.expand_path("../../test_helper", File.dirname(__FILE__))
4
4
 
5
5
  class ViewTrackerTest < Minitest::Test
6
6
  def tracker_key
7
- "ViewTracker_tracker"
7
+ "coverband_test_ViewTracker_tracker"
8
8
  end
9
9
 
10
10
  def setup
11
11
  super
12
+ Coverband.configuration.ignore += ["app/views/anything/ignore_me.html.erb"]
12
13
  fake_store.raw_store.del(tracker_key)
13
14
  end
14
15
 
@@ -94,11 +95,23 @@ class ViewTrackerTest < Minitest::Test
94
95
  assert_equal ["not_used"], tracker.unused_keys
95
96
  end
96
97
 
98
+ test "report hides partials marked in ignore config" do
99
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
100
+ store = fake_store
101
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/app/views/anything/ignore_me.html.erb"
102
+ target = [file_path, "not_used"]
103
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: "dir", target: target)
104
+ tracker.track_key(identifier: file_path)
105
+ tracker.save_report
106
+ assert_equal ["not_used"], tracker.unused_keys
107
+ assert_equal [], tracker.used_keys.keys
108
+ end
109
+
97
110
  test "reset store" do
98
111
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
99
112
  store = fake_store
100
113
  store.raw_store.expects(:del).with(tracker_key)
101
- store.raw_store.expects(:del).with("ViewTracker_tracker_time")
114
+ store.raw_store.expects(:del).with("#{tracker_key}_time")
102
115
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: "dir")
103
116
  tracker.track_key(identifier: "file")
104
117
  tracker.reset_recordings