coverband 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +6 -1
  3. data/.travis.yml +4 -2
  4. data/README.md +74 -51
  5. data/Rakefile +1 -1
  6. data/changes.md +45 -25
  7. data/coverband.gemspec +4 -0
  8. data/lib/coverband/adapters/base.rb +24 -1
  9. data/lib/coverband/adapters/redis_store.rb +29 -8
  10. data/lib/coverband/at_exit.rb +19 -2
  11. data/lib/coverband/collectors/coverage.rb +35 -73
  12. data/lib/coverband/collectors/delta.rb +67 -0
  13. data/lib/coverband/integrations/background.rb +4 -3
  14. data/lib/coverband/integrations/rack_server_check.rb +4 -1
  15. data/lib/coverband/integrations/resque.rb +4 -1
  16. data/lib/coverband/reporters/base.rb +21 -14
  17. data/lib/coverband/reporters/html_report.rb +40 -15
  18. data/lib/coverband/reporters/web.rb +29 -6
  19. data/lib/coverband/utils/html_formatter.rb +20 -4
  20. data/lib/coverband/utils/railtie.rb +8 -0
  21. data/lib/coverband/utils/result.rb +3 -2
  22. data/lib/coverband/utils/results.rb +63 -0
  23. data/lib/coverband/utils/source_file.rb +5 -0
  24. data/lib/coverband/version.rb +1 -1
  25. data/lib/coverband.rb +23 -3
  26. data/public/application.css +5 -0
  27. data/public/application.js +108 -1644
  28. data/public/dependencies.js +1581 -0
  29. data/public/favicon.png +0 -0
  30. data/test/benchmarks/benchmark.rake +31 -0
  31. data/test/benchmarks/coverage_fork.sh +37 -0
  32. data/test/{unit/adapters_base_test.rb → coverband/adapters/base_test.rb} +1 -1
  33. data/test/{unit/adapters_file_store_test.rb → coverband/adapters/file_store_test.rb} +1 -1
  34. data/test/{unit/adapters_redis_store_test.rb → coverband/adapters/redis_store_test.rb} +27 -10
  35. data/test/coverband/collectors/coverage_test.rb +73 -0
  36. data/test/coverband/collectors/delta_test.rb +52 -0
  37. data/test/{unit → coverband}/coverband_test.rb +7 -0
  38. data/test/coverband/integrations/background_test.rb +31 -0
  39. data/test/{unit → coverband/integrations}/middleware_test.rb +2 -1
  40. data/test/{unit/rack_server_checkout_test.rb → coverband/integrations/rack_server_check_test.rb} +1 -1
  41. data/test/{unit → coverband/integrations}/resque_worker_test.rb +9 -3
  42. data/test/{unit/reports_base_test.rb → coverband/reporters/base_test.rb} +5 -5
  43. data/test/{unit/reports_console_test.rb → coverband/reporters/console_test.rb} +2 -2
  44. data/test/{unit/reports_html_test.rb → coverband/reporters/html_test.rb} +7 -8
  45. data/test/{unit/reports_web_test.rb → coverband/reporters/web_test.rb} +2 -2
  46. data/test/{unit → integration}/full_stack_test.rb +10 -8
  47. data/test/{unit → integration}/rails_full_stack_test.rb +23 -4
  48. data/test/rails4_dummy/config/application.rb +1 -1
  49. data/test/rails4_dummy/config/coverband.rb +4 -1
  50. data/test/rails4_dummy/tmp/.keep +0 -0
  51. data/test/rails5_dummy/config/application.rb +1 -1
  52. data/test/rails5_dummy/config/coverband.rb +3 -1
  53. data/test/rails5_dummy/tmp/.keep +0 -0
  54. data/test/rails_test_helper.rb +13 -8
  55. data/test/test_helper.rb +9 -13
  56. data/test/unique_files.rb +23 -0
  57. data/views/file_list.erb +9 -0
  58. data/views/gem_list.erb +1 -1
  59. data/views/layout.erb +4 -3
  60. data/views/source_file.erb +16 -4
  61. data/views/source_file_loader.erb +7 -0
  62. metadata +100 -59
  63. data/test/unit/background_test.rb +0 -28
  64. data/test/unit/collectors_coverage_test.rb +0 -53
  65. data/test/unit/rails_gems_full_stack_test.rb +0 -36
  66. /data/test/{unit → coverband}/at_exit_test.rb +0 -0
  67. /data/test/{unit → coverband}/configuration_test.rb +0 -0
  68. /data/test/{unit → coverband/integrations}/test_resque_job.rb +0 -0
  69. /data/test/{unit → coverband}/utils/file_groups_test.rb +0 -0
  70. /data/test/{unit → coverband}/utils/file_list_test.rb +0 -0
  71. /data/test/{unit → coverband}/utils/gem_list_test.rb +0 -0
  72. /data/test/{unit → coverband}/utils/lines_classifier_test.rb +0 -0
  73. /data/test/{unit → coverband}/utils/result_test.rb +0 -0
  74. /data/test/{unit → coverband}/utils/s3_report_test.rb +0 -0
  75. /data/test/{unit → coverband}/utils/source_file_line_test.rb +0 -0
  76. /data/test/{unit → coverband}/utils/source_file_test.rb +0 -0
  77. /data/test/{unit/dog.rb → dog.rb} +0 -0
Binary file
@@ -219,12 +219,43 @@ namespace :benchmarks do
219
219
  $stdout = previous_out
220
220
  end
221
221
 
222
+ def measure_configure_memory
223
+ require 'memory_profiler'
224
+ # warmup
225
+ 3.times { Coverband.configure }
226
+
227
+ previous_out = $stdout
228
+ capture = StringIO.new
229
+ $stdout = capture
230
+
231
+ MemoryProfiler.report do
232
+ 10.times do
233
+ Coverband.configure do |config|
234
+ redis_url = ENV['CACHE_REDIS_URL'] || ENV['REDIS_URL']
235
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new(url: redis_url), redis_namespace: 'coverband_data')
236
+ end
237
+ end
238
+ end.pretty_print
239
+ data = $stdout.string
240
+ $stdout = previous_out
241
+ puts data
242
+ raise 'leaking memory!!!' unless data.match('Total retained: 0 bytes')
243
+ ensure
244
+ $stdout = previous_out
245
+ end
246
+
222
247
  desc 'runs memory reporting on Redis store'
223
248
  task memory_reporting: [:setup] do
224
249
  puts 'runs memory benchmarking to ensure we dont leak'
225
250
  measure_memory
226
251
  end
227
252
 
253
+ desc 'runs memory reporting on configure'
254
+ task memory_configure_reporting: [:setup] do
255
+ puts 'runs memory benchmarking on configure to ensure we dont leak'
256
+ measure_configure_memory
257
+ end
258
+
228
259
  desc 'runs memory leak check via Rails tests'
229
260
  task memory_rails: [:setup] do
230
261
  puts 'runs memory rails test to ensure we dont leak'
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This is a small script to illustrate how previous results get wiped out by forking
4
+ # this has implications of forking processes like Resque...
5
+ # this in the end would cause coverage.array_diff
6
+ # with previous results to add NEGATIVE code hits to the stored Coverage
7
+ # which in turn causes all sorts of crazy issues.
8
+ #
9
+ # ruby test/benchmarks/coverage_fork.rb
10
+ # in parent before fork
11
+ # {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 1, 1, 2, nil, nil]}
12
+ # in child after fork
13
+ # {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 0, 0, 0, nil, nil]}
14
+ # now triggering hits
15
+ # {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 0, 0, 3, nil, nil]}
16
+ #
17
+ # I believe this might be related to CoW and GC... not sure
18
+ # http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby-2-0
19
+ #
20
+ # NOTE: That the child now has 0 hits where previously method definitions had 1
21
+ # this causes all sorts of bad things to happen.
22
+ require 'coverage'
23
+ Coverage.start
24
+ load './test/dog.rb'
25
+ Dog.new.bark
26
+ Dog.new.bark
27
+ puts 'in parent before fork'
28
+ puts Coverage.peek_result
29
+ fork do
30
+ puts 'in child after fork'
31
+ puts Coverage.peek_result
32
+ puts 'now triggering hits'
33
+ Dog.new.bark
34
+ Dog.new.bark
35
+ Dog.new.bark
36
+ puts Coverage.peek_result
37
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class AdaptersBaseTest < Minitest::Test
6
6
  def setup
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class AdaptersFileStoreTest < Minitest::Test
6
6
  def setup
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class RedisTest < Minitest::Test
6
6
  REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
@@ -9,7 +9,6 @@ class RedisTest < Minitest::Test
9
9
  super
10
10
  @redis = Redis.new
11
11
  @store = Coverband::Adapters::RedisStore.new(@redis)
12
- @store.clear!
13
12
  end
14
13
 
15
14
  def test_coverage
@@ -34,6 +33,31 @@ class RedisTest < Minitest::Test
34
33
  assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
35
34
  end
36
35
 
36
+ def test_store_coverage_by_type
37
+ mock_file_hash
38
+ expected = basic_coverage
39
+ @store.type = :eager_loading
40
+ @store.save_report(expected)
41
+ assert_equal expected.keys, @store.coverage.keys
42
+ @store.coverage.each_pair do |key, data|
43
+ assert_equal expected[key], data['data']
44
+ end
45
+
46
+ @store.type = nil
47
+ assert_equal [], @store.coverage.keys
48
+ end
49
+
50
+ def test_merged_coverage_with_types
51
+ mock_file_hash
52
+ assert_nil @store.type
53
+ @store.type = :eager_loading
54
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
55
+ @store.type = nil
56
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
57
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
58
+ assert_nil @store.type
59
+ end
60
+
37
61
  def test_covered_lines_for_file
38
62
  mock_file_hash
39
63
  expected = basic_coverage
@@ -46,16 +70,9 @@ class RedisTest < Minitest::Test
46
70
  end
47
71
 
48
72
  def test_clear
49
- @redis.expects(:del).with(REDIS_STORAGE_FORMAT_VERSION).once
73
+ @redis.expects(:del).twice
50
74
  @store.clear!
51
75
  end
52
76
 
53
- private
54
77
 
55
- def test_data
56
- {
57
- '/Users/danmayer/projects/cover_band_server/app.rb' => { 54 => 1, 55 => 2 },
58
- '/Users/danmayer/projects/cover_band_server/server.rb' => { 5 => 1 }
59
- }
60
- end
61
78
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ class CollectorsCoverageTest < Minitest::Test
6
+ attr_accessor :coverband
7
+
8
+ def setup
9
+ super
10
+ Coverband.configure do |config|
11
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new)
12
+ end
13
+ @coverband = Coverband::Collectors::Coverage.instance.reset_instance
14
+ # preload first coverage hit
15
+ @coverband.report_coverage(true)
16
+ end
17
+
18
+ def teardown
19
+ Thread.current[:coverband_instance] = nil
20
+ Coverband.configure do |config|
21
+ end
22
+ @coverband = Coverband::Collectors::Coverage.instance.reset_instance
23
+ end
24
+
25
+ test 'Dog class coverage' do
26
+ file = require_unique_file
27
+ coverband.report_coverage(true)
28
+ coverage = Coverband.configuration.store.coverage
29
+ assert_equal(coverage[file]["data"], [nil, nil, 1, 1, 0, nil, nil])
30
+ end
31
+
32
+ test 'Dog method and class coverage' do
33
+ load File.expand_path('../../dog.rb', File.dirname(__FILE__))
34
+ Dog.new.bark
35
+ coverband.report_coverage(true)
36
+ coverage = Coverband.configuration.store.coverage
37
+ assert_equal(coverage["./test/dog.rb"]["data"], [nil, nil, 1, 1, 1, nil, nil])
38
+ end
39
+
40
+ test 'gets coverage instance' do
41
+ assert_equal Coverband::Collectors::Coverage, coverband.class
42
+ end
43
+
44
+ test 'defaults to a redis store' do
45
+ assert_equal Coverband::Adapters::RedisStore, coverband.instance_variable_get('@store').class
46
+ end
47
+
48
+ test 'report_coverage raises errors in tests' do
49
+ @coverband.reset_instance
50
+ @coverband.expects(:ready_to_report?).raises('Oh no')
51
+ assert_raises RuntimeError do
52
+ @coverband.report_coverage
53
+ end
54
+ end
55
+
56
+ test 'report_coverage raises errors in tests with verbose enabled' do
57
+ Coverband.configuration.verbose = true
58
+ logger = mock()
59
+ Coverband.configuration.logger = logger
60
+ @coverband.reset_instance
61
+ @coverband.expects(:ready_to_report?).raises('Oh no')
62
+ logger.expects(:error).times(3)
63
+ error = assert_raises RuntimeError do
64
+ @coverband.report_coverage
65
+ end
66
+ assert_match /Oh no/, error.message
67
+ end
68
+
69
+ test 'default tmp ignores' do
70
+ heroku_build_file = '/tmp/build_81feca8c72366e4edf020dc6f1937485/config/initializers/assets.rb'
71
+ assert_equal false, @coverband.send(:track_file?, heroku_build_file)
72
+ end
73
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+ require './lib/coverband/collectors/delta'
5
+
6
+ class CollectorsDeltaTest < Minitest::Test
7
+ class MockSystemCoverage < Struct.new(:results)
8
+ end
9
+
10
+ def mock_coverage(coverage)
11
+ MockSystemCoverage.new(coverage)
12
+ end
13
+
14
+ def setup
15
+ Coverband::Collectors::Delta.reset
16
+ end
17
+
18
+ test 'No previous results' do
19
+ current_coverage = {
20
+ 'car.rb' => [0,5,1]
21
+ }
22
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
23
+ assert_equal(current_coverage, results)
24
+ end
25
+
26
+ test 'Coverage has gone up' do
27
+ current_coverage = {
28
+ 'car.rb' => [nil,1,5,1]
29
+ }
30
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
31
+ assert_equal(current_coverage, results)
32
+
33
+ current_coverage = {
34
+ 'car.rb' => [nil,1,7,1]
35
+ }
36
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
37
+ assert_equal({'car.rb' => [nil, 0, 2, 0]}, results)
38
+ end
39
+
40
+ test 'New file added to coverage' do
41
+ current_coverage = {}
42
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
43
+ assert_equal(current_coverage, results)
44
+
45
+ current_coverage = {
46
+ 'dealership.rb' => [nil,1,1,nil]
47
+ }
48
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
49
+ assert_equal(current_coverage, results)
50
+ end
51
+ end
52
+
@@ -23,4 +23,11 @@ class CoverbandTest < Minitest::Test
23
23
  Coverband::Background.expects(:start).never
24
24
  ::Coverband.start
25
25
  end
26
+
27
+ test 'Eager load coverage' do
28
+ Coverband.eager_loading_coverage!
29
+ assert_equal :eager_loading, Coverband.configuration.store.type
30
+ Coverband.runtime_coverage!
31
+ assert_nil Coverband.configuration.store.type
32
+ end
26
33
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ class BackgroundTest < Minitest::Test
6
+ class ThreadDouble < Struct.new(:alive)
7
+ def exit
8
+ end
9
+
10
+ def alive?
11
+ alive
12
+ end
13
+ end
14
+
15
+ def test_start
16
+ Thread.expects(:new).yields.returns(ThreadDouble.new(true))
17
+ Coverband::Background.expects(:loop).yields
18
+ Coverband::Background.expects(:sleep).with(30)
19
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
20
+ 2.times { Coverband::Background.start }
21
+ end
22
+
23
+ def test_start_dead_thread
24
+ Thread.expects(:new).yields.returns(ThreadDouble.new(false)).twice
25
+ Coverband::Background.expects(:loop).yields.twice
26
+ Coverband::Background.expects(:sleep).with(30).twice
27
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage).twice
28
+ 2.times { Coverband::Background.start }
29
+ end
30
+
31
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
  require 'rack'
5
5
 
6
6
  class MiddlewareTest < Minitest::Test
@@ -62,6 +62,7 @@ class MiddlewareTest < Minitest::Test
62
62
  request = Rack::MockRequest.env_for('/anything.json')
63
63
  Coverband::Collectors::Coverage.instance.reset_instance
64
64
  collector = Coverband::Collectors::Coverage.instance
65
+ collector.report_coverage(true)
65
66
  collector.instance_variable_set('@reporting_frequency', 100.0)
66
67
  middleware = Coverband::Middleware.new(fake_app)
67
68
  store = Coverband::Collectors::Coverage.instance.instance_variable_get('@store')
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class RackServerCheckTest < Minitest::Test
6
6
  test 'returns true when running in rack server' do
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class ResqueWorkerTest < Minitest::Test
6
6
  def enqueue_and_run_job
@@ -23,7 +23,7 @@ class ResqueWorkerTest < Minitest::Test
23
23
  end
24
24
 
25
25
  test 'resque job coverage' do
26
- relative_job_file = './unit/test_resque_job.rb'
26
+ relative_job_file = './integrations/test_resque_job.rb'
27
27
  resque_job_file = File.expand_path('./test_resque_job.rb', File.dirname(__FILE__))
28
28
  require resque_job_file
29
29
 
@@ -31,6 +31,12 @@ class ResqueWorkerTest < Minitest::Test
31
31
 
32
32
  assert !Coverband::Background.running?
33
33
 
34
- assert_equal 1, Coverband.configuration.store.coverage[relative_job_file]['data'][4]
34
+ # TODO: There is a test only type issue where the test is looking at eager data
35
+ # it merged eager and eager for merged and runtime is eager
36
+ Coverband.runtime_coverage!
37
+ report = Coverband.configuration.store.get_coverage_report
38
+
39
+ assert_equal 0, report[Coverband::EAGER_TYPE][relative_job_file]['data'][4]
40
+ assert_equal 1, report[Coverband::RUNTIME_TYPE][relative_job_file]['data'][4]
35
41
  end
36
42
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class ReportsBaseTest < Minitest::Test
6
6
  test 'relative_path_to_full fix filename from a key with a swappable path' do
@@ -110,10 +110,10 @@ class ReportsBaseTest < Minitest::Test
110
110
  roots = ['/app/', '/full/remote_app/path/']
111
111
 
112
112
  lines_hit = [1, 3, 6]
113
- store.stubs(:coverage).returns(key => lines_hit)
113
+ store.stubs(:merged_coverage).returns(key => lines_hit)
114
114
  expected = { key => [1, 3, 6] }
115
115
 
116
- assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)
116
+ assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[:merged]
117
117
  end
118
118
 
119
119
  ###
@@ -153,7 +153,7 @@ class ReportsBaseTest < Minitest::Test
153
153
  roots = ['/base/[0-9]*/', '/base/78/app/']
154
154
 
155
155
  lines_hit = [1, 3, 6]
156
- store.stubs(:coverage).returns(coverage)
156
+ store.stubs(:merged_coverage).returns(coverage)
157
157
  File.expects(:exist?).at_least_once
158
158
  .with('/base/[0-9]*/app/controllers/dashboard_controller.rb')
159
159
  .returns(false)
@@ -163,6 +163,6 @@ class ReportsBaseTest < Minitest::Test
163
163
  "last_updated_at"=>1549618094,
164
164
  "file_hash"=>"14dc84e940e26cbfb9ac79b43862e762",
165
165
  "data"=>[38, 38, 38, nil, 38, 38, nil, nil, 38, nil, 38, 80, 80, nil, 80, 80, 80, 80, 80, 80, 80, nil, nil, 38, nil, 38, 80, 55, 0, 0, 0, 0, nil, nil, nil, nil, 0, 0, nil, nil, 38, 80, 80, 80, nil, nil, nil, nil, nil, 38, 80, nil, nil, 38, 80, nil, nil]}
166
- assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[key]
166
+ assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[:merged][key]
167
167
  end
168
168
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class HTMLReportTest < Minitest::Test
6
6
  REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
@@ -26,7 +26,7 @@ class HTMLReportTest < Minitest::Test
26
26
  .returns('app_path')
27
27
  @store.send(:save_report, basic_coverage)
28
28
 
29
- report = Coverband::Reporters::ConsoleReport.report(@store)
29
+ report = Coverband::Reporters::ConsoleReport.report(@store)[:merged]
30
30
  expected = { './dog.rb' => [0, 1, 2] }
31
31
  assert_equal(expected.keys, report.keys)
32
32
  end
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class ReportHTMLTest < Minitest::Test
6
- REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
7
-
8
6
  def setup
9
7
  super
10
8
  @redis = Redis.new
@@ -22,9 +20,9 @@ class ReportHTMLTest < Minitest::Test
22
20
  mock_file_hash
23
21
  @store.send(:save_report, basic_coverage)
24
22
 
25
- html = Coverband::Reporters::HTMLReport.report(@store,
23
+ html = Coverband::Reporters::HTMLReport.new(@store,
26
24
  html: true,
27
- open_report: false)
25
+ open_report: false).report
28
26
  assert_match 'Generated by', html
29
27
  end
30
28
 
@@ -38,9 +36,10 @@ class ReportHTMLTest < Minitest::Test
38
36
  mock_file_hash
39
37
  @store.send(:save_report, basic_coverage)
40
38
 
39
+ reporter = Coverband::Reporters::HTMLReport.new(@store,
40
+ html: false,
41
+ open_report: false)
41
42
  Coverband::Utils::HTMLFormatter.any_instance.expects(:format!).once
42
- Coverband::Reporters::HTMLReport.report(@store,
43
- html: false,
44
- open_report: false)
43
+ reporter.report
45
44
  end
46
45
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', File.dirname(__FILE__))
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
  require 'aws-sdk-s3'
5
- require File.expand_path('../../lib/coverband/reporters/web', File.dirname(__FILE__))
5
+ require File.expand_path('../../../lib/coverband/reporters/web', File.dirname(__FILE__))
6
6
  require 'rack/test'
7
7
 
8
8
  ENV['RACK_ENV'] = 'test'
@@ -17,11 +17,15 @@ class FullStackTest < Minitest::Test
17
17
  config.s3_bucket = nil
18
18
  config.background_reporting_enabled = false
19
19
  config.root_paths = ["#{File.expand_path('../', File.dirname(__FILE__))}/"]
20
+ config.track_gems = true
20
21
  end
21
22
  Coverband.configuration.store.clear!
22
23
  Coverband.start
24
+ Coverband::Collectors::Coverage.instance.runtime!
23
25
  @rack_file = File.expand_path(TEST_RACK_APP, File.dirname(__FILE__))
24
- load @rack_file
26
+ require @rack_file
27
+ # preload first coverage hit
28
+ Coverband::Collectors::Coverage.instance.report_coverage(true)
25
29
  end
26
30
 
27
31
  test 'call app' do
@@ -29,20 +33,18 @@ class FullStackTest < Minitest::Test
29
33
  middleware = Coverband::Middleware.new(fake_app_with_lines)
30
34
  results = middleware.call(request)
31
35
  assert_equal 'Hello Rack!', results.last
32
- sleep(0.1)
33
- expected = [nil, nil, 1, nil, 1, 1, 1, nil, nil]
36
+ sleep(0.2)
37
+ expected = [nil, nil, 0, nil, 0, 0, 1, nil, nil]
34
38
  assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
35
39
 
36
40
  # additional calls increase count by 1
37
41
  middleware.call(request)
38
- sleep(0.1)
39
- expected = [nil, nil, 1, nil, 1, 1, 2, nil, nil]
42
+ sleep(0.2)
43
+ expected = [nil, nil, 0, nil, 0, 0, 2, nil, nil]
40
44
  assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
41
45
  end
42
46
 
43
47
  test 'call app with gem tracking' do
44
- Coverband.configuration.track_gems = true
45
- Coverband::Collectors::Coverage.instance.reset_instance
46
48
  require 'rainbow'
47
49
  Rainbow('this text is red').red
48
50
  request = Rack::MockRequest.env_for('/anything.json')
@@ -50,7 +52,7 @@ class FullStackTest < Minitest::Test
50
52
  results = middleware.call(request)
51
53
  assert_equal 'Hello Rack!', results.last
52
54
  sleep(0.1)
53
- assert Coverband.configuration.store.coverage.keys.any? { |key| key.end_with?('rainbow/null_presenter.rb') }
55
+ assert Coverband.configuration.store.coverage.keys.any? { |key| key.end_with?('rainbow/global.rb') }
54
56
  end
55
57
 
56
58
  private
@@ -8,10 +8,11 @@ class RailsFullStackTest < Minitest::Test
8
8
 
9
9
  def setup
10
10
  super
11
- # The normal relative directory lookup of coverband won't work for our dummy rails project
12
- Coverband.configure("./test/rails#{Rails::VERSION::MAJOR}_dummy/config/coverband.rb")
13
- Coverband.configuration.background_reporting_enabled = false
14
- Coverband.start
11
+ rails_setup
12
+ # preload first coverage hit
13
+ Coverband::Collectors::Coverage.instance.report_coverage(true)
14
+ require 'rainbow'
15
+ Rainbow('this text is red').red
15
16
  end
16
17
 
17
18
  def teardown
@@ -20,6 +21,9 @@ class RailsFullStackTest < Minitest::Test
20
21
  Capybara.use_default_driver
21
22
  end
22
23
 
24
+ # We have to combine everything in one test
25
+ # because we can only initialize rails once per test
26
+ # run. Possibly fork test runs to avoid this problem in future?
23
27
  test 'this is how we do it' do
24
28
  visit '/dummy/show'
25
29
  Coverband.report_coverage(true)
@@ -28,6 +32,21 @@ class RailsFullStackTest < Minitest::Test
28
32
  within page.find('a', text: /dummy_controller.rb/).find(:xpath, '../..') do
29
33
  assert_selector('td', text: '100.0 %')
30
34
  end
35
+
36
+ #Test gems are reporting coverage
37
+ assert_content('Gems')
38
+ assert page.html.match('rainbow/wrapper.rb')
39
+
40
+ #Test eager load data stored separately
41
+ dummy_controller = "./test/rails#{Rails::VERSION::MAJOR}_dummy/app/controllers/dummy_controller.rb"
42
+ store.type = :eager_loading
43
+ eager_expected = [1, 1, 0, nil, nil]
44
+ results = store.coverage[dummy_controller]['data']
45
+ assert_equal(eager_expected, results)
46
+
47
+ store.type = nil
48
+ runtime_expected = [0, 0, 1, nil, nil]
49
+ results = store.coverage[dummy_controller]['data']
31
50
  end
32
51
 
33
52
  ###
@@ -10,6 +10,6 @@ module Rails4Dummy
10
10
  config.before_initialize do
11
11
  Coverband.start
12
12
  end
13
- config.eager_load = false
13
+ config.eager_load = true
14
14
  end
15
15
  end
@@ -4,5 +4,8 @@ Coverband.configure do |config|
4
4
  config.ignore = %w[vendor .erb$ .slim$]
5
5
  config.root_paths = []
6
6
  config.logger = Rails.logger
7
- config.background_reporting_sleep_seconds = 0.1
7
+ config.verbose = true
8
+ config.background_reporting_enabled = false
9
+ config.track_gems = true
10
+ config.gem_details = true
8
11
  end
File without changes
@@ -10,7 +10,7 @@ module Dummy
10
10
  config.before_initialize do
11
11
  Coverband.start
12
12
  end
13
- config.eager_load = false
13
+ config.eager_load = true
14
14
  end
15
15
  end
16
16
 
@@ -5,5 +5,7 @@ Coverband.configure do |config|
5
5
  config.root_paths = []
6
6
  config.logger = Rails.logger
7
7
  config.verbose = true
8
- config.background_reporting_sleep_seconds = 0.1
8
+ config.background_reporting_enabled = false
9
+ config.track_gems = true
10
+ config.gem_details = true
9
11
  end
File without changes