coverband 4.2.0 → 4.2.1

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +29 -9
  3. data/.travis.yml +10 -1
  4. data/Gemfile +3 -1
  5. data/Gemfile.rails4 +1 -0
  6. data/README.md +40 -15
  7. data/Rakefile +14 -3
  8. data/changes.md +47 -12
  9. data/coverband.gemspec +3 -1
  10. data/lib/coverband/adapters/base.rb +60 -36
  11. data/lib/coverband/adapters/file_store.rb +8 -8
  12. data/lib/coverband/adapters/redis_store.rb +18 -10
  13. data/lib/coverband/at_exit.rb +2 -11
  14. data/lib/coverband/collectors/coverage.rb +32 -36
  15. data/lib/coverband/collectors/delta.rb +34 -28
  16. data/lib/coverband/configuration.rb +76 -32
  17. data/lib/coverband/integrations/background.rb +8 -4
  18. data/lib/coverband/integrations/{middleware.rb → background_middleware.rb} +2 -6
  19. data/lib/coverband/integrations/bundler.rb +8 -0
  20. data/lib/coverband/integrations/report_middleware.rb +15 -0
  21. data/lib/coverband/integrations/resque.rb +3 -5
  22. data/lib/coverband/reporters/base.rb +39 -14
  23. data/lib/coverband/reporters/html_report.rb +21 -27
  24. data/lib/coverband/reporters/web.rb +13 -21
  25. data/lib/coverband/utils/file_list.rb +16 -5
  26. data/lib/coverband/utils/file_path_helper.rb +14 -3
  27. data/lib/coverband/utils/html_formatter.rb +25 -8
  28. data/lib/coverband/utils/lines_classifier.rb +5 -0
  29. data/lib/coverband/utils/railtie.rb +11 -12
  30. data/lib/coverband/utils/result.rb +1 -37
  31. data/lib/coverband/utils/results.rb +51 -0
  32. data/lib/coverband/utils/source_file.rb +31 -6
  33. data/lib/coverband/utils/tasks.rb +9 -10
  34. data/lib/coverband/version.rb +1 -1
  35. data/lib/coverband.rb +32 -21
  36. data/public/application.js +27 -0
  37. data/test/benchmarks/benchmark.rake +144 -26
  38. data/test/coverband/adapters/base_test.rb +73 -42
  39. data/test/coverband/adapters/file_store_test.rb +48 -37
  40. data/test/coverband/adapters/redis_store_test.rb +41 -10
  41. data/test/coverband/at_exit_test.rb +0 -2
  42. data/test/coverband/collectors/coverage_test.rb +57 -9
  43. data/test/coverband/collectors/delta_test.rb +36 -6
  44. data/test/coverband/configuration_test.rb +47 -7
  45. data/test/coverband/coverband_test.rb +14 -2
  46. data/test/coverband/integrations/background_middleware_test.rb +44 -0
  47. data/test/coverband/integrations/background_test.rb +1 -3
  48. data/test/coverband/integrations/report_middleware_test.rb +44 -0
  49. data/test/coverband/integrations/resque_worker_test.rb +4 -3
  50. data/test/coverband/integrations/test_resque_job.rb +3 -1
  51. data/test/coverband/reporters/base_test.rb +4 -4
  52. data/test/coverband/reporters/console_test.rb +1 -2
  53. data/test/coverband/reporters/html_test.rb +58 -19
  54. data/test/coverband/reporters/web_test.rb +0 -10
  55. data/test/coverband/utils/file_groups_test.rb +11 -5
  56. data/test/coverband/utils/file_list_test.rb +5 -5
  57. data/test/coverband/utils/html_formatter_test.rb +43 -0
  58. data/test/coverband/utils/result_test.rb +6 -47
  59. data/test/coverband/utils/results_test.rb +54 -0
  60. data/test/coverband/utils/s3_report_test.rb +2 -0
  61. data/test/coverband/utils/source_file_test.rb +50 -0
  62. data/test/dog.rb.erb +12 -0
  63. data/test/forked/rails_full_stack_test.rb +106 -0
  64. data/test/forked/rails_rake_full_stack_test.rb +40 -0
  65. data/test/integration/full_stack_test.rb +17 -15
  66. data/test/rails4_dummy/Rakefile +6 -0
  67. data/test/rails4_dummy/config/application.rb +8 -9
  68. data/test/rails4_dummy/config/coverband.rb +5 -3
  69. data/test/rails5_dummy/Rakefile +6 -0
  70. data/test/rails5_dummy/config/application.rb +6 -10
  71. data/test/rails5_dummy/config/coverband.rb +4 -2
  72. data/test/rails_test_helper.rb +22 -5
  73. data/test/test_helper.rb +42 -4
  74. data/test/unique_files.rb +17 -9
  75. data/views/file_list.erb +2 -2
  76. data/views/gem_list.erb +10 -1
  77. data/views/layout.erb +10 -3
  78. data/views/source_file.erb +13 -4
  79. data/views/source_file_loader.erb +1 -1
  80. metadata +52 -9
  81. data/test/coverband/integrations/middleware_test.rb +0 -96
  82. data/test/integration/rails_full_stack_test.rb +0 -95
@@ -3,49 +3,80 @@
3
3
  require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class AdaptersBaseTest < Minitest::Test
6
- def setup
7
- super
8
- @test_file_path = '/tmp/coverband_filestore_test_path.json'
9
- @store = Coverband::Adapters::FileStore.new(@test_file_path)
10
- mock_file_hash
6
+
7
+ def test_abstract_methods
8
+ abstract_methods = %w(clear! clear_file! migrate! size save_coverage coverage)
9
+ abstract_methods.each do |method|
10
+ assert_raises RuntimeError do
11
+ Coverband::Adapters::Base.new.send(method.to_sym)
12
+ end
13
+ end
14
+ end
15
+
16
+ def test_size_in_mib
17
+ base = Coverband::Adapters::Base.new
18
+ def base.size
19
+ 3.0
20
+ end
21
+ assert_equal "0.00", base.size_in_mib
11
22
  end
12
23
 
13
- def test_covered_merge
14
- old_time = 1541958097
15
- current_time = Time.now.to_i
16
- old_data = {
17
- 'first_updated_at' => old_time,
18
- 'last_updated_at' => current_time,
19
- 'file_hash' => 'abcd',
20
- 'data' => [5, 7, nil]
21
- }
22
- old_report = { '/projects/coverband_demo/config/coverband.rb' => old_data,
23
- '/projects/coverband_demo/config/initializers/assets.rb' => old_data,
24
- '/projects/coverband_demo/config/initializers/cookies_serializer.rb' => old_data }
25
- new_report = { '/projects/coverband_demo/config/coverband.rb' => [5, 7, nil],
26
- '/projects/coverband_demo/config/initializers/filter_logging.rb' => [5, 7, nil],
27
- '/projects/coverband_demo/config/initializers/wrap_parameters.rb' => [5, 7, nil],
28
- '/projects/coverband_demo/app/controllers/application_controller.rb' => [5, 7, nil] }
29
- expected_merge = {
30
- 'first_updated_at' => old_time,
31
- 'last_updated_at' => current_time,
32
- 'file_hash' => 'abcd',
33
- 'data' => [10, 14, nil]
34
- }
35
- new_data = {
36
- 'first_updated_at' => current_time,
37
- 'last_updated_at' => current_time,
38
- 'file_hash' => 'abcd',
39
- 'data' => [5, 7, nil]
40
- }
41
- expected_result = {
42
- '/projects/coverband_demo/app/controllers/application_controller.rb' => new_data,
43
- '/projects/coverband_demo/config/coverband.rb' => expected_merge,
44
- '/projects/coverband_demo/config/initializers/assets.rb' => old_data,
45
- '/projects/coverband_demo/config/initializers/cookies_serializer.rb' => old_data,
46
- '/projects/coverband_demo/config/initializers/filter_logging.rb' => new_data,
47
- '/projects/coverband_demo/config/initializers/wrap_parameters.rb' => new_data
48
- }
49
- assert_equal expected_result, @store.send(:merge_reports, new_report, old_report)
24
+ def test_array_add
25
+ original = [5, 7, nil, nil]
26
+ latest = [3, 4, nil, 1]
27
+ assert_equal [8, 11, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
28
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(true)
29
+ assert_equal [1, 1, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
30
+ Coverband.configuration.stubs(:use_oneshot_lines_coverage).returns(false)
31
+ Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
32
+ assert_equal [1, 1, nil, nil], Coverband::Adapters::Base.new.send(:array_add, latest, original)
33
+ end
34
+
35
+ describe 'Coverband::Adapters::Base using file' do
36
+ def setup
37
+ super
38
+ @test_file_path = '/tmp/coverband_filestore_test_path.json'
39
+ @store = Coverband::Adapters::FileStore.new(@test_file_path)
40
+ mock_file_hash
41
+ end
42
+
43
+ def test_covered_merge
44
+ old_time = 1541958097
45
+ current_time = Time.now.to_i
46
+ old_data = {
47
+ 'first_updated_at' => old_time,
48
+ 'last_updated_at' => current_time,
49
+ 'file_hash' => 'abcd',
50
+ 'data' => [5, 7, nil]
51
+ }
52
+ old_report = { '/projects/coverband_demo/config/coverband.rb' => old_data,
53
+ '/projects/coverband_demo/config/initializers/assets.rb' => old_data,
54
+ '/projects/coverband_demo/config/initializers/cookies_serializer.rb' => old_data }
55
+ new_report = { '/projects/coverband_demo/config/coverband.rb' => [5, 7, nil],
56
+ '/projects/coverband_demo/config/initializers/filter_logging.rb' => [5, 7, nil],
57
+ '/projects/coverband_demo/config/initializers/wrap_parameters.rb' => [5, 7, nil],
58
+ '/projects/coverband_demo/app/controllers/application_controller.rb' => [5, 7, nil] }
59
+ expected_merge = {
60
+ 'first_updated_at' => old_time,
61
+ 'last_updated_at' => current_time,
62
+ 'file_hash' => 'abcd',
63
+ 'data' => [10, 14, nil]
64
+ }
65
+ new_data = {
66
+ 'first_updated_at' => current_time,
67
+ 'last_updated_at' => current_time,
68
+ 'file_hash' => 'abcd',
69
+ 'data' => [5, 7, nil]
70
+ }
71
+ expected_result = {
72
+ '/projects/coverband_demo/app/controllers/application_controller.rb' => new_data,
73
+ '/projects/coverband_demo/config/coverband.rb' => expected_merge,
74
+ '/projects/coverband_demo/config/initializers/assets.rb' => old_data,
75
+ '/projects/coverband_demo/config/initializers/cookies_serializer.rb' => old_data,
76
+ '/projects/coverband_demo/config/initializers/filter_logging.rb' => new_data,
77
+ '/projects/coverband_demo/config/initializers/wrap_parameters.rb' => new_data
78
+ }
79
+ assert_equal expected_result, @store.send(:merge_reports, new_report, old_report)
80
+ end
50
81
  end
51
82
  end
@@ -3,45 +3,56 @@
3
3
  require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class AdaptersFileStoreTest < Minitest::Test
6
- def setup
7
- super
8
- @test_file_path = '/tmp/coverband_filestore_test_path.json'
9
- File.open(@test_file_path, 'w') { |f| f.write(test_data.to_json) }
10
- @store = Coverband::Adapters::FileStore.new(@test_file_path)
11
- end
12
-
13
- def test_covered_lines_for_file
14
- assert_equal @store.covered_lines_for_file('dog.rb')[0], 1
15
- assert_equal @store.covered_lines_for_file('dog.rb')[1], 2
16
- end
17
-
18
- def test_covered_lines_when_null
19
- assert_equal @store.covered_lines_for_file('none.rb'), []
20
- end
21
6
 
22
- def test_covered_files
23
- assert_equal @store.covered_files, ['dog.rb']
7
+ def test_covered_lines_when_no_file
8
+ @store = Coverband::Adapters::FileStore.new('')
9
+ expected = {}
10
+ assert_equal expected, @store.coverage
24
11
  end
25
12
 
26
- def test_clear
27
- @store.clear!
28
- assert_equal false, File.exist?(@test_file_path)
29
- end
30
-
31
- def test_save_report
32
- mock_file_hash
33
- @store.send(:save_report, 'cat.rb' => [0, 1])
34
- assert_equal @store.covered_lines_for_file('cat.rb')[1], 1
35
- end
36
-
37
- private
38
-
39
- def test_data
40
- {
41
- 'dog.rb' => { 'data' => [1, 2, nil],
42
- 'file_hash' => 'abcd',
43
- 'first_updated_at' => 1541968729,
44
- 'last_updated_at' => 1541968729 }
45
- }
13
+ describe 'Coverband::Adapters::FileStore with file' do
14
+ def setup
15
+ super
16
+ @test_file_path = '/tmp/coverband_filestore_test_path.json'
17
+ File.open(@test_file_path, 'w') { |f| f.write(test_data.to_json) }
18
+ @store = Coverband::Adapters::FileStore.new(@test_file_path)
19
+ end
20
+
21
+ def test_size
22
+ assert @store.size > 1
23
+ end
24
+
25
+ def test_coverage
26
+ assert_equal @store.coverage['dog.rb']['data'][0], 1
27
+ assert_equal @store.coverage['dog.rb']['data'][1], 2
28
+ end
29
+
30
+ def test_covered_lines_when_null
31
+ assert_nil @store.coverage['none.rb']
32
+ end
33
+
34
+ def test_covered_files
35
+ assert_equal @store.covered_files, ['dog.rb']
36
+ end
37
+
38
+ def test_clear
39
+ @store.clear!
40
+ assert_equal false, File.exist?(@test_file_path)
41
+ end
42
+
43
+ def test_save_report
44
+ mock_file_hash
45
+ @store.send(:save_report, 'cat.rb' => [0, 1])
46
+ assert_equal @store.coverage['cat.rb']['data'][1], 1
47
+ end
48
+
49
+ def test_data
50
+ {
51
+ 'dog.rb' => { 'data' => [1, 2, nil],
52
+ 'file_hash' => 'abcd',
53
+ 'first_updated_at' => 1541968729,
54
+ 'last_updated_at' => 1541968729 }
55
+ }
56
+ end
46
57
  end
47
58
  end
@@ -7,8 +7,11 @@ class RedisTest < Minitest::Test
7
7
 
8
8
  def setup
9
9
  super
10
+ Coverband.configuration.redis_namespace = 'coverband_test'
10
11
  @redis = Redis.new
11
- @store = Coverband::Adapters::RedisStore.new(@redis)
12
+ @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
13
+ Coverband.configuration.store = @store
14
+ @store.clear!
12
15
  end
13
16
 
14
17
  def test_coverage
@@ -43,36 +46,64 @@ class RedisTest < Minitest::Test
43
46
  assert_equal expected[key], data['data']
44
47
  end
45
48
 
46
- @store.type = nil
49
+ @store.type = Coverband::RUNTIME_TYPE
47
50
  assert_equal [], @store.coverage.keys
48
51
  end
49
52
 
50
53
  def test_merged_coverage_with_types
51
54
  mock_file_hash
52
- assert_nil @store.type
55
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
53
56
  @store.type = :eager_loading
54
57
  @store.save_report('app_path/dog.rb' => [0, 1, 1])
55
- @store.type = nil
58
+ @store.type = Coverband::RUNTIME_TYPE
56
59
  @store.save_report('app_path/dog.rb' => [1, 0, 1])
57
60
  assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
58
- assert_nil @store.type
61
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
59
62
  end
60
63
 
61
- def test_covered_lines_for_file
64
+ def test_coverage_for_file
62
65
  mock_file_hash
63
66
  expected = basic_coverage
64
67
  @store.save_report(expected)
65
- assert_equal example_line, @store.covered_lines_for_file('app_path/dog.rb')
68
+ assert_equal example_line, @store.coverage['app_path/dog.rb']['data']
66
69
  end
67
70
 
68
- def test_covered_lines_when_null
69
- assert_equal [], @store.covered_lines_for_file('app_path/dog.rb')
71
+ def test_coverage_with_simulate_oneshot_lines_coverage
72
+ Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
73
+ mock_file_hash
74
+ expected = basic_coverage
75
+ @store.save_report(expected)
76
+ assert_equal example_line, @store.get_coverage_report[:runtime]['app_path/dog.rb']['data']
77
+ end
78
+
79
+ def test_coverage_when_null
80
+ assert_nil @store.coverage['app_path/dog.rb']
70
81
  end
71
82
 
72
83
  def test_clear
73
- @redis.expects(:del).twice
84
+ @redis.expects(:del).times(3)
74
85
  @store.clear!
75
86
  end
76
87
 
88
+ def test_clear_file
89
+ mock_file_hash
90
+ @store.type = :eager_loading
91
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
92
+ @store.type = Coverband::RUNTIME_TYPE
93
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
94
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
95
+ @store.clear_file!('app_path/dog.rb')
96
+ assert_nil @store.get_coverage_report[:merged]['app_path/dog.rb']
97
+ end
98
+
99
+ def test_size
100
+ mock_file_hash
101
+ @store.type = :eager_loading
102
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
103
+ assert @store.size > 1
104
+ end
77
105
 
106
+ def test_base_key
107
+ assert @store.send(:base_key).end_with?(Coverband::RUNTIME_TYPE.to_s)
108
+ end
78
109
  end
@@ -9,5 +9,3 @@ class AtExitTest < Minitest::Test
9
9
  2.times { Coverband::AtExit.register }
10
10
  end
11
11
  end
12
-
13
-
@@ -8,11 +8,11 @@ class CollectorsCoverageTest < Minitest::Test
8
8
  def setup
9
9
  super
10
10
  Coverband.configure do |config|
11
- config.store = Coverband::Adapters::RedisStore.new(Redis.new)
11
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
12
12
  end
13
13
  @coverband = Coverband::Collectors::Coverage.instance.reset_instance
14
14
  # preload first coverage hit
15
- @coverband.report_coverage(true)
15
+ @coverband.report_coverage
16
16
  end
17
17
 
18
18
  def teardown
@@ -24,17 +24,31 @@ class CollectorsCoverageTest < Minitest::Test
24
24
 
25
25
  test 'Dog class coverage' do
26
26
  file = require_unique_file
27
- coverband.report_coverage(true)
27
+ coverband.report_coverage
28
28
  coverage = Coverband.configuration.store.coverage
29
- assert_equal(coverage[file]["data"], [nil, nil, 1, 1, 0, nil, nil])
29
+ assert_equal(coverage[file]['data'], [nil, nil, 1, 1, 0, nil, nil])
30
30
  end
31
31
 
32
32
  test 'Dog method and class coverage' do
33
33
  load File.expand_path('../../dog.rb', File.dirname(__FILE__))
34
34
  Dog.new.bark
35
- coverband.report_coverage(true)
35
+ coverband.report_coverage
36
36
  coverage = Coverband.configuration.store.coverage
37
- assert_equal(coverage["./test/dog.rb"]["data"], [nil, nil, 1, 1, 1, nil, nil])
37
+ assert_equal(coverage['./test/dog.rb']['data'], [nil, nil, 1, 1, 1, nil, nil])
38
+ end
39
+
40
+ test 'Dog eager load coverage' do
41
+ store = Coverband.configuration.store
42
+ assert_equal Coverband::RUNTIME_TYPE, store.type
43
+ file = coverband.eager_loading do
44
+ require_unique_file
45
+ end
46
+ coverage = Coverband.configuration.store.coverage[file]
47
+ assert_nil coverage, 'No runtime coverage'
48
+ coverband.eager_loading!
49
+ coverage = Coverband.configuration.store.coverage[file]
50
+ refute_nil coverage, 'Eager load coverage is present'
51
+ assert_equal(coverage['data'], [nil, nil, 1, 1, 0, nil, nil])
38
52
  end
39
53
 
40
54
  test 'gets coverage instance' do
@@ -46,8 +60,8 @@ class CollectorsCoverageTest < Minitest::Test
46
60
  end
47
61
 
48
62
  test 'report_coverage raises errors in tests' do
63
+ Coverband::Adapters::RedisStore.any_instance.stubs(:save_report).raises('Oh no')
49
64
  @coverband.reset_instance
50
- @coverband.expects(:ready_to_report?).raises('Oh no')
51
65
  assert_raises RuntimeError do
52
66
  @coverband.report_coverage
53
67
  end
@@ -55,10 +69,10 @@ class CollectorsCoverageTest < Minitest::Test
55
69
 
56
70
  test 'report_coverage raises errors in tests with verbose enabled' do
57
71
  Coverband.configuration.verbose = true
58
- logger = mock()
72
+ logger = mock
59
73
  Coverband.configuration.logger = logger
60
74
  @coverband.reset_instance
61
- @coverband.expects(:ready_to_report?).raises('Oh no')
75
+ Coverband::Adapters::RedisStore.any_instance.stubs(:save_report).raises('Oh no')
62
76
  logger.expects(:error).times(3)
63
77
  error = assert_raises RuntimeError do
64
78
  @coverband.report_coverage
@@ -70,4 +84,38 @@ class CollectorsCoverageTest < Minitest::Test
70
84
  heroku_build_file = '/tmp/build_81feca8c72366e4edf020dc6f1937485/config/initializers/assets.rb'
71
85
  assert_equal false, @coverband.send(:track_file?, heroku_build_file)
72
86
  end
87
+
88
+ test 'one shot line coverage disabled for ruby >= 2.6' do
89
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
90
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
91
+ ::Coverage.expects(:running?).returns(false)
92
+ ::Coverage.expects(:start).with(oneshot_lines: false)
93
+ Coverband::Collectors::Coverage.send(:new)
94
+ end
95
+
96
+ test 'one shot line coverage enabled for ruby >= 2.6' do
97
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
98
+ Coverband.configuration.expects(:use_oneshot_lines_coverage).returns(true)
99
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
100
+ ::Coverage.expects(:running?).returns(false)
101
+ ::Coverage.expects(:start).with(oneshot_lines: true)
102
+ Coverband::Collectors::Coverage.send(:new)
103
+ end
104
+
105
+ test 'one shot line coverage for ruby >= 2.6 when already running' do
106
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
107
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
108
+ ::Coverage.expects(:running?).returns(true)
109
+ ::Coverage.expects(:start).never
110
+ Coverband::Collectors::Coverage.send(:new)
111
+ end
112
+
113
+ test 'no one shot line coverage for ruby < 2.6' do
114
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
115
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(false)
116
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.5.0').returns(true)
117
+ ::Coverage.expects(:running?).returns(false)
118
+ ::Coverage.expects(:start).with()
119
+ Coverband::Collectors::Coverage.send(:new)
120
+ end
73
121
  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
@@ -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(Redis.new, 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