coverband 6.1.2 → 6.1.4

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 (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 +6 -14
  5. data/changes.md +21 -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 +6 -2
  18. data/lib/coverband/configuration.rb +7 -21
  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 +4 -2
  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 +17 -4
  40. data/test/coverband/configuration_test.rb +6 -23
  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 +35 -18
@@ -37,7 +37,7 @@ module Coverband
37
37
 
38
38
  # apply coverband filters
39
39
  report_files.each_pair do |file, data|
40
- next if Coverband.configuration.ignore.any? { |i| file.match(i) }
40
+ next if Coverband.configuration.ignore.any? { |i| file.match?(i) }
41
41
 
42
42
  filtered_report_files[report_name][file] = data
43
43
  end
@@ -93,7 +93,7 @@ module Coverband
93
93
  scov_style_report = {}
94
94
  store.get_coverage_report(options).each_pair do |name, data|
95
95
  data.each_pair do |key, line_data|
96
- next if Coverband.configuration.ignore.any? { |i| key.match(i) }
96
+ next if Coverband.configuration.ignore.any? { |i| key.match?(i) }
97
97
  next unless line_data
98
98
 
99
99
  scov_style_report[name] = {} unless scov_style_report.key?(name)
@@ -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"
8
+ VERSION = "6.1.4"
9
9
  end
data/lib/coverband.rb CHANGED
@@ -5,7 +5,6 @@ require "json"
5
5
  require "redis"
6
6
  require "coverband/version"
7
7
  require "coverband/at_exit"
8
- require "coverband/configuration"
9
8
  require "coverband/utils/relative_file_converter"
10
9
  require "coverband/utils/absolute_file_converter"
11
10
  require "coverband/adapters/base"
@@ -14,6 +13,7 @@ require "coverband/adapters/hash_redis_store"
14
13
  require "coverband/adapters/file_store"
15
14
  require "coverband/adapters/stdout_store"
16
15
  require "coverband/adapters/null_store"
16
+ require "coverband/adapters/memcached_store"
17
17
  require "coverband/utils/file_hasher"
18
18
  require "coverband/collectors/coverage"
19
19
  require "coverband/collectors/abstract_tracker"
@@ -26,6 +26,7 @@ require "coverband/reporters/console_report"
26
26
  require "coverband/integrations/background"
27
27
  require "coverband/integrations/background_middleware"
28
28
  require "coverband/integrations/rack_server_check"
29
+ require "coverband/configuration"
29
30
 
30
31
  Coverband::Adapters::RedisStore = Coverband::Adapters::HashRedisStore if ENV["COVERBAND_HASH_REDIS_STORE"]
31
32
 
@@ -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