coverband 4.2.0 → 4.2.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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +29 -10
  3. data/.travis.yml +16 -8
  4. data/CODE_OF_CONDUCT.md +76 -0
  5. data/Gemfile +3 -1
  6. data/Gemfile.rails4 +1 -0
  7. data/README.md +108 -59
  8. data/Rakefile +19 -3
  9. data/changes.md +85 -10
  10. data/coverband.gemspec +3 -5
  11. data/lib/coverband/adapters/base.rb +64 -45
  12. data/lib/coverband/adapters/file_store.rb +15 -9
  13. data/lib/coverband/adapters/hash_redis_store.rb +190 -0
  14. data/lib/coverband/adapters/redis_store.rb +35 -11
  15. data/lib/coverband/at_exit.rb +2 -11
  16. data/lib/coverband/collectors/coverage.rb +35 -41
  17. data/lib/coverband/collectors/delta.rb +34 -28
  18. data/lib/coverband/collectors/view_tracker.rb +157 -0
  19. data/lib/coverband/configuration.rb +115 -33
  20. data/lib/coverband/integrations/background.rb +12 -4
  21. data/lib/coverband/integrations/{middleware.rb → background_middleware.rb} +2 -6
  22. data/lib/coverband/integrations/bundler.rb +8 -0
  23. data/lib/coverband/integrations/report_middleware.rb +15 -0
  24. data/lib/coverband/integrations/resque.rb +3 -5
  25. data/lib/coverband/reporters/base.rb +40 -16
  26. data/lib/coverband/reporters/console_report.rb +1 -0
  27. data/lib/coverband/reporters/html_report.rb +31 -27
  28. data/lib/coverband/reporters/web.rb +63 -18
  29. data/lib/coverband/utils/absolute_file_converter.rb +47 -0
  30. data/lib/coverband/utils/file_hasher.rb +16 -0
  31. data/lib/coverband/utils/file_list.rb +16 -5
  32. data/lib/coverband/utils/html_formatter.rb +45 -8
  33. data/lib/coverband/utils/lines_classifier.rb +5 -0
  34. data/lib/coverband/utils/railtie.rb +28 -10
  35. data/lib/coverband/utils/relative_file_converter.rb +41 -0
  36. data/lib/coverband/utils/result.rb +6 -39
  37. data/lib/coverband/utils/results.rb +51 -0
  38. data/lib/coverband/utils/s3_report.rb +2 -3
  39. data/lib/coverband/utils/source_file.rb +34 -8
  40. data/lib/coverband/utils/tasks.rb +10 -10
  41. data/lib/coverband/version.rb +5 -1
  42. data/lib/coverband.rb +49 -27
  43. data/lua/install.sh +15 -0
  44. data/lua/lib/persist-coverage.lua +28 -0
  45. data/lua/test/bootstrap.lua +5 -0
  46. data/lua/test/harness.lua +19 -0
  47. data/lua/test/redis-call.lua +55 -0
  48. data/lua/test/test-persist-coverage.lua +132 -0
  49. data/public/application.css +14 -6
  50. data/public/application.js +27 -0
  51. data/test/benchmarks/benchmark.rake +167 -73
  52. data/test/benchmarks/init_rails.rake +10 -0
  53. data/test/coverband/adapters/base_test.rb +73 -42
  54. data/test/coverband/adapters/file_store_test.rb +48 -37
  55. data/test/coverband/adapters/hash_redis_store_test.rb +195 -0
  56. data/test/coverband/adapters/redis_store_test.rb +102 -59
  57. data/test/coverband/at_exit_test.rb +0 -2
  58. data/test/coverband/collectors/coverage_test.rb +71 -13
  59. data/test/coverband/collectors/delta_test.rb +36 -6
  60. data/test/coverband/collectors/view_tracker_test.rb +113 -0
  61. data/test/coverband/configuration_test.rb +47 -7
  62. data/test/coverband/coverband_test.rb +14 -2
  63. data/test/coverband/integrations/background_middleware_test.rb +44 -0
  64. data/test/coverband/integrations/background_test.rb +11 -3
  65. data/test/coverband/integrations/report_middleware_test.rb +44 -0
  66. data/test/coverband/integrations/resque_worker_test.rb +5 -6
  67. data/test/coverband/integrations/test_resque_job.rb +3 -1
  68. data/test/coverband/reporters/base_test.rb +5 -81
  69. data/test/coverband/reporters/console_test.rb +3 -10
  70. data/test/coverband/reporters/html_test.rb +71 -21
  71. data/test/coverband/reporters/web_test.rb +0 -10
  72. data/test/coverband/utils/absolute_file_converter_test.rb +56 -0
  73. data/test/coverband/utils/file_groups_test.rb +11 -5
  74. data/test/coverband/utils/file_hasher_test.rb +29 -0
  75. data/test/coverband/utils/file_list_test.rb +5 -5
  76. data/test/coverband/utils/html_formatter_test.rb +41 -0
  77. data/test/coverband/utils/relative_file_converter_test.rb +39 -0
  78. data/test/coverband/utils/result_test.rb +6 -47
  79. data/test/coverband/utils/results_test.rb +54 -0
  80. data/test/coverband/utils/s3_report_test.rb +2 -0
  81. data/test/coverband/utils/source_file_test.rb +54 -0
  82. data/test/dog.rb.erb +12 -0
  83. data/test/forked/rails_full_stack_test.rb +106 -0
  84. data/test/forked/rails_rake_full_stack_test.rb +58 -0
  85. data/test/integration/full_stack_test.rb +15 -16
  86. data/test/rails4_dummy/Rakefile +6 -0
  87. data/test/rails4_dummy/config/application.rb +8 -9
  88. data/test/rails4_dummy/config/coverband.rb +3 -11
  89. data/test/rails4_dummy/config/coverband_missing_redis.rb +3 -0
  90. data/test/rails5_dummy/Rakefile +6 -0
  91. data/test/rails5_dummy/config/application.rb +6 -10
  92. data/test/rails5_dummy/config/coverband.rb +7 -3
  93. data/test/rails5_dummy/config/coverband_missing_redis.rb +15 -0
  94. data/test/rails_test_helper.rb +22 -5
  95. data/test/test_helper.rb +52 -11
  96. data/test/unique_files.rb +17 -9
  97. data/views/data.erb +1 -0
  98. data/views/file_list.erb +13 -12
  99. data/views/gem_list.erb +10 -1
  100. data/views/layout.erb +6 -18
  101. data/views/nav.erb +36 -0
  102. data/views/source_file.erb +20 -4
  103. data/views/source_file_loader.erb +1 -1
  104. data/views/view_tracker.erb +52 -0
  105. metadata +71 -12
  106. data/lib/coverband/utils/file_path_helper.rb +0 -57
  107. data/test/coverband/integrations/middleware_test.rb +0 -96
  108. data/test/integration/rails_full_stack_test.rb +0 -95
@@ -7,12 +7,9 @@ class CollectorsCoverageTest < Minitest::Test
7
7
 
8
8
  def setup
9
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
10
+ @coverband = Coverband::Collectors::Coverage.instance
14
11
  # preload first coverage hit
15
- @coverband.report_coverage(true)
12
+ @coverband.report_coverage
16
13
  end
17
14
 
18
15
  def teardown
@@ -24,17 +21,31 @@ class CollectorsCoverageTest < Minitest::Test
24
21
 
25
22
  test 'Dog class coverage' do
26
23
  file = require_unique_file
27
- coverband.report_coverage(true)
24
+ coverband.report_coverage
28
25
  coverage = Coverband.configuration.store.coverage
29
- assert_equal(coverage[file]["data"], [nil, nil, 1, 1, 0, nil, nil])
26
+ assert_equal(coverage[file]['data'], [nil, nil, 1, 1, 0, nil, nil])
30
27
  end
31
28
 
32
29
  test 'Dog method and class coverage' do
33
30
  load File.expand_path('../../dog.rb', File.dirname(__FILE__))
34
31
  Dog.new.bark
35
- coverband.report_coverage(true)
32
+ coverband.report_coverage
36
33
  coverage = Coverband.configuration.store.coverage
37
- assert_equal(coverage["./test/dog.rb"]["data"], [nil, nil, 1, 1, 1, nil, nil])
34
+ assert_equal(coverage['./test/dog.rb']['data'], [nil, nil, 1, 1, 1, nil, nil])
35
+ end
36
+
37
+ test 'Dog eager load coverage' do
38
+ store = Coverband.configuration.store
39
+ assert_equal Coverband::RUNTIME_TYPE, store.type
40
+ file = coverband.eager_loading do
41
+ require_unique_file
42
+ end
43
+ coverage = Coverband.configuration.store.coverage[file]
44
+ assert_nil coverage, 'No runtime coverage'
45
+ coverband.eager_loading!
46
+ coverage = Coverband.configuration.store.coverage[file]
47
+ refute_nil coverage, 'Eager load coverage is present'
48
+ assert_equal(coverage['data'], [nil, nil, 1, 1, 0, nil, nil])
38
49
  end
39
50
 
40
51
  test 'gets coverage instance' do
@@ -46,8 +57,8 @@ class CollectorsCoverageTest < Minitest::Test
46
57
  end
47
58
 
48
59
  test 'report_coverage raises errors in tests' do
60
+ Coverband::Adapters::RedisStore.any_instance.stubs(:save_report).raises('Oh no')
49
61
  @coverband.reset_instance
50
- @coverband.expects(:ready_to_report?).raises('Oh no')
51
62
  assert_raises RuntimeError do
52
63
  @coverband.report_coverage
53
64
  end
@@ -55,11 +66,11 @@ class CollectorsCoverageTest < Minitest::Test
55
66
 
56
67
  test 'report_coverage raises errors in tests with verbose enabled' do
57
68
  Coverband.configuration.verbose = true
58
- logger = mock()
69
+ logger = mock
59
70
  Coverband.configuration.logger = logger
60
71
  @coverband.reset_instance
61
- @coverband.expects(:ready_to_report?).raises('Oh no')
62
- logger.expects(:error).times(3)
72
+ Coverband::Adapters::RedisStore.any_instance.stubs(:save_report).raises('Oh no')
73
+ logger.expects(:error).at_least(3)
63
74
  error = assert_raises RuntimeError do
64
75
  @coverband.report_coverage
65
76
  end
@@ -70,4 +81,51 @@ class CollectorsCoverageTest < Minitest::Test
70
81
  heroku_build_file = '/tmp/build_81feca8c72366e4edf020dc6f1937485/config/initializers/assets.rb'
71
82
  assert_equal false, @coverband.send(:track_file?, heroku_build_file)
72
83
  end
84
+
85
+ # verifies a fix where we were storing, merging, and tracking ignored files
86
+ # then just filtering them out of the final report
87
+ test 'ignores uses regex same as reporter does' do
88
+ regex_file = Coverband.configuration.current_root + '/config/initializers/fake.rb'
89
+ assert_equal true, @coverband.send(:track_file?, regex_file)
90
+ @coverband.instance_variable_set(:@ignore_patterns, ['config/initializers/*'])
91
+ assert_equal false, @coverband.send(:track_file?, regex_file)
92
+ end
93
+
94
+ test 'one shot line coverage disabled for ruby >= 2.6' do
95
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
96
+
97
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
98
+ ::Coverage.expects(:running?).returns(false)
99
+ ::Coverage.expects(:start).with(oneshot_lines: false)
100
+ Coverband::Collectors::Coverage.send(:new)
101
+ end
102
+
103
+ test 'one shot line coverage enabled for ruby >= 2.6' do
104
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
105
+
106
+ Coverband.configuration.expects(:use_oneshot_lines_coverage).returns(true)
107
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
108
+ ::Coverage.expects(:running?).returns(false)
109
+ ::Coverage.expects(:start).with(oneshot_lines: true)
110
+ Coverband::Collectors::Coverage.send(:new)
111
+ end
112
+
113
+ test 'one shot line coverage for ruby >= 2.6 when already running' do
114
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
115
+
116
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
117
+ ::Coverage.expects(:running?).returns(true)
118
+ ::Coverage.expects(:start).never
119
+ Coverband::Collectors::Coverage.send(:new)
120
+ end
121
+
122
+ test 'no one shot line coverage for ruby < 2.6' do
123
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
124
+
125
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(false)
126
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.5.0').returns(true)
127
+ ::Coverage.expects(:running?).returns(false)
128
+ ::Coverage.expects(:start).with
129
+ Coverband::Collectors::Coverage.send(:new)
130
+ end
73
131
  end
@@ -17,7 +17,7 @@ class CollectorsDeltaTest < Minitest::Test
17
17
 
18
18
  test 'No previous results' do
19
19
  current_coverage = {
20
- 'car.rb' => [0,5,1]
20
+ 'car.rb' => [0, 5, 1]
21
21
  }
22
22
  results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
23
23
  assert_equal(current_coverage, results)
@@ -25,16 +25,16 @@ class CollectorsDeltaTest < Minitest::Test
25
25
 
26
26
  test 'Coverage has gone up' do
27
27
  current_coverage = {
28
- 'car.rb' => [nil,1,5,1]
28
+ 'car.rb' => [nil, 1, 5, 1]
29
29
  }
30
30
  results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
31
31
  assert_equal(current_coverage, results)
32
32
 
33
33
  current_coverage = {
34
- 'car.rb' => [nil,1,7,1]
34
+ 'car.rb' => [nil, 1, 7, 1]
35
35
  }
36
36
  results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
37
- assert_equal({'car.rb' => [nil, 0, 2, 0]}, results)
37
+ assert_equal({ 'car.rb' => [nil, 0, 2, 0] }, results)
38
38
  end
39
39
 
40
40
  test 'New file added to coverage' do
@@ -43,10 +43,40 @@ class CollectorsDeltaTest < Minitest::Test
43
43
  assert_equal(current_coverage, results)
44
44
 
45
45
  current_coverage = {
46
- 'dealership.rb' => [nil,1,1,nil]
46
+ 'dealership.rb' => [nil, 1, 1, nil]
47
47
  }
48
48
  results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
49
49
  assert_equal(current_coverage, results)
50
50
  end
51
- end
52
51
 
52
+ if Coverband.configuration.one_shot_coverage_implemented_in_ruby_version?
53
+ test 'oneshot coverage calls clear' do
54
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
55
+ current_coverage = {
56
+ 'car.rb' => [1, 5]
57
+ }
58
+
59
+ ::Coverage.expects(:result).with(clear: true, stop: false).returns(current_coverage)
60
+ results = Coverband::Collectors::Delta::RubyCoverage.results
61
+ end
62
+
63
+ test 'one shot lines results' do
64
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
65
+ current_coverage = {}
66
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
67
+ assert_equal(current_coverage, results)
68
+
69
+ current_coverage = {
70
+ 'dealership.rb' => {
71
+ :oneshot_lines => [2,3]
72
+ }
73
+ }
74
+ ::Coverage.expects(:line_stub).with('dealership.rb').returns([nil, 0, 0, nil])
75
+ results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
76
+ expected = {
77
+ 'dealership.rb' => [nil, 1, 1, nil]
78
+ }
79
+ assert_equal(expected, results)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ class ReporterTest < Minitest::Test
6
+ def tracker_key
7
+ 'render_tracker_2'
8
+ end
9
+
10
+ def setup
11
+ super
12
+ fake_store.raw_store.del(tracker_key)
13
+ end
14
+
15
+ test 'init correctly' do
16
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
17
+ tracker = Coverband::Collectors::ViewTracker.new(store: fake_store, roots: 'dir')
18
+ assert_equal 'dir', tracker.roots.first
19
+ assert !tracker.store.nil?
20
+ assert_equal [], tracker.target
21
+ assert_equal [], tracker.logged_views
22
+ end
23
+
24
+ test 'track partials' do
25
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
26
+ store = fake_store
27
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
28
+ store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
29
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
30
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
31
+ tracker.report_views_tracked
32
+ assert_equal [file_path], tracker.logged_views
33
+ end
34
+
35
+ test 'track partials that include the word vendor in the path' do
36
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
37
+ store = fake_store
38
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/vendor_relations/file"
39
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
40
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
41
+ tracker.report_views_tracked
42
+ assert_equal [file_path], tracker.used_views.keys
43
+ end
44
+
45
+ test 'ignore partials that include the folder vendor in the path' do
46
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
47
+ store = fake_store
48
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/vendor/file"
49
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
50
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
51
+ tracker.report_views_tracked
52
+ assert_equal Hash.new, tracker.used_views
53
+ end
54
+
55
+ test 'track layouts' do
56
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
57
+ store = fake_store
58
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/layout"
59
+ store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
60
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
61
+ tracker.track_views('name', 'start', 'finish', 'id', layout: file_path)
62
+ tracker.report_views_tracked
63
+ assert_equal [file_path], tracker.logged_views
64
+ end
65
+
66
+ test 'report used partials' do
67
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
68
+ store = fake_store
69
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
70
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
71
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
72
+ tracker.report_views_tracked
73
+ assert_equal [file_path], tracker.used_views.keys
74
+ end
75
+
76
+ test 'report unused partials' do
77
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
78
+ store = fake_store
79
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
80
+ target = [file_path, 'not_used']
81
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir', target: target)
82
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
83
+ tracker.report_views_tracked
84
+ assert_equal ['not_used'], tracker.unused_views
85
+ end
86
+
87
+ test 'reset store' do
88
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
89
+ store = fake_store
90
+ store.raw_store.expects(:del).with(tracker_key)
91
+ store.raw_store.expects(:del).with('render_tracker_time')
92
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
93
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: 'file')
94
+ tracker.reset_recordings
95
+ end
96
+
97
+ test 'clear_file' do
98
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
99
+ store = fake_store
100
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
101
+ store.raw_store.expects(:hdel).with(tracker_key, file_path)
102
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
103
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
104
+ tracker.clear_file!('file')
105
+ assert_equal [], tracker.logged_views
106
+ end
107
+
108
+ protected
109
+
110
+ def fake_store
111
+ @fake_store ||= Coverband::Adapters::RedisStore.new(Coverband::Test.redis, redis_namespace: 'coverband_test')
112
+ end
113
+ end
@@ -5,31 +5,53 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
5
5
  class BaseTest < Minitest::Test
6
6
  def setup
7
7
  super
8
+ Coverband.configuration.reset
8
9
  Coverband.configure do |config|
9
10
  config.root = Dir.pwd
10
11
  config.s3_bucket = nil
11
12
  config.root_paths = ['/app_path/']
12
- config.ignore = ['vendor']
13
- config.reporting_frequency = 100.0
13
+ config.ignore = ['config/envionments']
14
14
  config.reporter = 'std_out'
15
- config.store = Coverband::Adapters::RedisStore.new(Redis.new)
15
+ config.store = Coverband::Adapters::RedisStore.new(Coverband::Test.redis, redis_namespace: 'coverband_test')
16
16
  end
17
17
  end
18
18
 
19
- test 'defaults' do
19
+ test 'ignore works with equal' do
20
20
  coverband = Coverband::Collectors::Coverage.instance.reset_instance
21
- assert_equal ['vendor', 'internal:prelude', 'schema.rb'], coverband.instance_variable_get('@ignore_patterns')
21
+ expected = ['vendor/', '.erb$', '.slim$', '/tmp', 'internal:prelude', 'schema.rb', 'config/envionments']
22
+ assert_equal expected, Coverband.configuration.ignore
23
+ end
24
+
25
+ test 'ignore works with plus equal' do
26
+ Coverband.configure do |config|
27
+ config.ignore += ['config/initializers']
28
+ end
29
+ coverband = Coverband::Collectors::Coverage.instance.reset_instance
30
+ expected = ['vendor/',
31
+ '.erb$',
32
+ '.slim$',
33
+ '/tmp',
34
+ 'internal:prelude',
35
+ 'schema.rb',
36
+ 'config/envionments',
37
+ 'config/initializers']
38
+ assert_equal expected, Coverband.configuration.ignore
39
+ end
40
+
41
+ test 'ignore' do
42
+ Coverband::Collectors::Coverage.instance.reset_instance
43
+ assert !Coverband.configuration.gem_paths.first.nil?
22
44
  end
23
45
 
24
46
  test 'gem_paths' do
25
47
  Coverband::Collectors::Coverage.instance.reset_instance
26
- assert Coverband.configuration.gem_paths.first != nil
48
+ assert !Coverband.configuration.gem_paths.first.nil?
27
49
  end
28
50
 
29
51
  test 'groups' do
30
52
  Coverband::Collectors::Coverage.instance.reset_instance
31
53
  Coverband.configuration.track_gems = true
32
- assert_equal %w(App Gems), Coverband.configuration.groups.keys
54
+ assert_equal %w[App Gems], Coverband.configuration.groups.keys
33
55
  end
34
56
 
35
57
  test 'all_root_paths' do
@@ -64,4 +86,22 @@ class BaseTest < Minitest::Test
64
86
  end
65
87
  end
66
88
  end
89
+
90
+ test 'use_oneshot_lines_coverage' do
91
+ refute Coverband.configuration.use_oneshot_lines_coverage
92
+
93
+ Coverband.configuration.stubs(:one_shot_coverage_implemented_in_ruby_version?).returns(true)
94
+ Coverband.configuration.use_oneshot_lines_coverage = true
95
+ assert Coverband.configuration.use_oneshot_lines_coverage
96
+
97
+ Coverband.configuration.use_oneshot_lines_coverage = false
98
+ refute Coverband.configuration.use_oneshot_lines_coverage
99
+
100
+ Coverband.configuration.stubs(:one_shot_coverage_implemented_in_ruby_version?).returns(false)
101
+ exception = assert_raises Exception do
102
+ Coverband.configuration.use_oneshot_lines_coverage = true
103
+ end
104
+ assert_equal 'One shot line coverage is only available in ruby >= 2.6', exception.message
105
+ refute Coverband.configuration.use_oneshot_lines_coverage
106
+ end
67
107
  end
@@ -3,7 +3,6 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class CoverbandTest < Minitest::Test
6
-
7
6
  test 'Coverband#start kicks off background reporting if enabled and not in rack server' do
8
7
  Coverband.configuration.stubs(:background_reporting_enabled).returns(:true)
9
8
  Coverband::RackServerCheck.expects(:running?).returns(false)
@@ -24,10 +23,23 @@ class CoverbandTest < Minitest::Test
24
23
  ::Coverband.start
25
24
  end
26
25
 
26
+ test 'Coverband#configured? works' do
27
+ Coverband.configure
28
+ assert Coverband.configured?
29
+ end
30
+
31
+ test 'Eager load coverage block' do
32
+ Coverband.eager_loading_coverage {
33
+ #some code
34
+ 1 + 1
35
+ }
36
+ assert_equal :runtime, Coverband.configuration.store.type
37
+ end
38
+
27
39
  test 'Eager load coverage' do
28
40
  Coverband.eager_loading_coverage!
29
41
  assert_equal :eager_loading, Coverband.configuration.store.type
30
42
  Coverband.runtime_coverage!
31
- assert_nil Coverband.configuration.store.type
43
+ assert_equal :runtime, Coverband.configuration.store.type
32
44
  end
33
45
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+ require 'rack'
5
+
6
+ class BackgroundMiddlewareTest < Minitest::Test
7
+ def setup
8
+ super
9
+ Coverband.configure do |config|
10
+ config.background_reporting_enabled = false
11
+ end
12
+ end
13
+
14
+ test 'call app' do
15
+ request = Rack::MockRequest.env_for('/anything.json')
16
+ Coverband::Collectors::Coverage.instance.reset_instance
17
+ middleware = Coverband::BackgroundMiddleware.new(fake_app)
18
+ results = middleware.call(request)
19
+ assert_equal '/anything.json', results.last
20
+ end
21
+
22
+ test 'pass all rack lint checks' do
23
+ Coverband::Collectors::Coverage.instance.reset_instance
24
+ app = Rack::Lint.new(Coverband::BackgroundMiddleware.new(fake_app))
25
+ env = Rack::MockRequest.env_for('/hello')
26
+ app.call(env)
27
+ end
28
+
29
+ test 'starts background reporter when configured' do
30
+ request = Rack::MockRequest.env_for('/anything.json')
31
+ Coverband.configuration.stubs(:background_reporting_enabled).returns(true)
32
+ Coverband::Background.expects(:start)
33
+ middleware = Coverband::BackgroundMiddleware.new(fake_app)
34
+ middleware.call(request)
35
+ end
36
+
37
+ private
38
+
39
+ def fake_app
40
+ @fake_app ||= lambda do |env|
41
+ [200, { 'Content-Type' => 'text/plain' }, env['PATH_INFO']]
42
+ end
43
+ end
44
+ end
@@ -4,8 +4,7 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class BackgroundTest < Minitest::Test
6
6
  class ThreadDouble < Struct.new(:alive)
7
- def exit
8
- end
7
+ def exit; end
9
8
 
10
9
  def alive?
11
10
  alive
@@ -20,6 +19,16 @@ class BackgroundTest < Minitest::Test
20
19
  2.times { Coverband::Background.start }
21
20
  end
22
21
 
22
+ def test_start_with_wiggle
23
+ Thread.expects(:new).yields.returns(ThreadDouble.new(true))
24
+ Coverband::Background.expects(:loop).yields
25
+ Coverband::Background.expects(:sleep).with(35)
26
+ Coverband::Background.expects(:rand).with(10).returns(5)
27
+ Coverband.configuration.reporting_wiggle = 10
28
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
29
+ 2.times { Coverband::Background.start }
30
+ end
31
+
23
32
  def test_start_dead_thread
24
33
  Thread.expects(:new).yields.returns(ThreadDouble.new(false)).twice
25
34
  Coverband::Background.expects(:loop).yields.twice
@@ -27,5 +36,4 @@ class BackgroundTest < Minitest::Test
27
36
  Coverband::Collectors::Coverage.instance.expects(:report_coverage).twice
28
37
  2.times { Coverband::Background.start }
29
38
  end
30
-
31
39
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+ require 'coverband/integrations/report_middleware'
5
+
6
+ class ReportMiddlewareTest < Minitest::Test
7
+ def setup
8
+ super
9
+ Coverband.configure do |config|
10
+ config.background_reporting_enabled = false
11
+ end
12
+ end
13
+
14
+ test 'reports coverage' do
15
+ request = Rack::MockRequest.env_for('/anything.json')
16
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage)
17
+ middleware = Coverband::ReportMiddleware.new(fake_app)
18
+ middleware.call(request)
19
+ end
20
+
21
+ test 'reports coverage when an error is raised' do
22
+ request = Rack::MockRequest.env_for('/anything.json')
23
+ Coverband::Collectors::Coverage.instance.reset_instance
24
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
25
+ middleware = Coverband::ReportMiddleware.new(fake_app_raise_error)
26
+ begin
27
+ middleware.call(request)
28
+ rescue StandardError
29
+ nil
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def fake_app
36
+ @fake_app ||= lambda do |env|
37
+ [200, { 'Content-Type' => 'text/plain' }, env['PATH_INFO']]
38
+ end
39
+ end
40
+
41
+ def fake_app_raise_error
42
+ @fake_app_raise_error ||= -> { raise 'hell' }
43
+ end
44
+ end
@@ -5,7 +5,7 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
5
5
  class ResqueWorkerTest < Minitest::Test
6
6
  def enqueue_and_run_job
7
7
  Resque.enqueue(TestResqueJob)
8
- queue = ENV['QUEUE'] ='resque_coverband'
8
+ queue = ENV['QUEUE'] = 'resque_coverband'
9
9
  worker = Resque::Worker.new
10
10
  worker.startup
11
11
  worker.work_one_job
@@ -15,15 +15,14 @@ class ResqueWorkerTest < Minitest::Test
15
15
  super
16
16
  Coverband.configure do |config|
17
17
  config.background_reporting_enabled = false
18
- config.root_paths = ["#{File.expand_path('../', File.dirname(__FILE__))}/"]
19
18
  end
20
19
  Coverband.start
21
- redis = Coverband.configuration.store.send(:redis)
20
+ redis = Coverband.configuration.store.instance_eval { @redis }
22
21
  Resque.redis = redis
23
22
  end
24
23
 
25
24
  test 'resque job coverage' do
26
- relative_job_file = './integrations/test_resque_job.rb'
25
+ relative_job_file = './test/coverband/integrations/test_resque_job.rb'
27
26
  resque_job_file = File.expand_path('./test_resque_job.rb', File.dirname(__FILE__))
28
27
  require resque_job_file
29
28
 
@@ -36,7 +35,7 @@ class ResqueWorkerTest < Minitest::Test
36
35
  Coverband.runtime_coverage!
37
36
  report = Coverband.configuration.store.get_coverage_report
38
37
 
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]
38
+ assert_equal 0, report[Coverband::EAGER_TYPE][relative_job_file]['data'][6]
39
+ assert_equal 1, report[Coverband::RUNTIME_TYPE][relative_job_file]['data'][6]
41
40
  end
42
41
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class TestResqueJob
2
4
  @queue = :resque_coverband
3
5
 
4
6
  def self.perform
5
- "resque job perform"
7
+ 'resque job perform'
6
8
  end
7
9
  end