coverband 4.2.0 → 4.2.2

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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +29 -9
  3. data/.travis.yml +10 -8
  4. data/CODE_OF_CONDUCT.md +76 -0
  5. data/Gemfile +3 -1
  6. data/Gemfile.rails4 +1 -0
  7. data/README.md +72 -43
  8. data/Rakefile +14 -3
  9. data/changes.md +66 -11
  10. data/coverband.gemspec +2 -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 +182 -0
  14. data/lib/coverband/adapters/redis_store.rb +33 -11
  15. data/lib/coverband/at_exit.rb +2 -11
  16. data/lib/coverband/collectors/coverage.rb +34 -40
  17. data/lib/coverband/collectors/delta.rb +34 -28
  18. data/lib/coverband/collectors/view_tracker.rb +124 -0
  19. data/lib/coverband/configuration.rb +96 -32
  20. data/lib/coverband/integrations/background.rb +9 -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 +21 -27
  28. data/lib/coverband/reporters/web.rb +19 -21
  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 +37 -8
  33. data/lib/coverband/utils/lines_classifier.rb +5 -0
  34. data/lib/coverband/utils/railtie.rb +20 -9
  35. data/lib/coverband/utils/relative_file_converter.rb +41 -0
  36. data/lib/coverband/utils/result.rb +1 -37
  37. data/lib/coverband/utils/results.rb +51 -0
  38. data/lib/coverband/utils/s3_report.rb +2 -2
  39. data/lib/coverband/utils/source_file.rb +31 -8
  40. data/lib/coverband/utils/tasks.rb +10 -10
  41. data/lib/coverband/version.rb +5 -1
  42. data/lib/coverband.rb +39 -22
  43. data/public/application.css +6 -6
  44. data/public/application.js +27 -0
  45. data/test/benchmarks/benchmark.rake +167 -73
  46. data/test/benchmarks/init_rails.rake +10 -0
  47. data/test/coverband/adapters/base_test.rb +73 -42
  48. data/test/coverband/adapters/file_store_test.rb +48 -37
  49. data/test/coverband/adapters/hash_redis_store_test.rb +190 -0
  50. data/test/coverband/adapters/redis_store_test.rb +92 -59
  51. data/test/coverband/at_exit_test.rb +0 -2
  52. data/test/coverband/collectors/coverage_test.rb +62 -10
  53. data/test/coverband/collectors/delta_test.rb +36 -6
  54. data/test/coverband/collectors/view_tracker_test.rb +77 -0
  55. data/test/coverband/configuration_test.rb +47 -7
  56. data/test/coverband/coverband_test.rb +14 -2
  57. data/test/coverband/integrations/background_middleware_test.rb +44 -0
  58. data/test/coverband/integrations/background_test.rb +1 -3
  59. data/test/coverband/integrations/report_middleware_test.rb +44 -0
  60. data/test/coverband/integrations/resque_worker_test.rb +6 -6
  61. data/test/coverband/integrations/test_resque_job.rb +3 -1
  62. data/test/coverband/reporters/base_test.rb +2 -79
  63. data/test/coverband/reporters/console_test.rb +2 -6
  64. data/test/coverband/reporters/html_test.rb +58 -19
  65. data/test/coverband/reporters/web_test.rb +0 -10
  66. data/test/coverband/utils/absolute_file_converter_test.rb +56 -0
  67. data/test/coverband/utils/file_groups_test.rb +11 -5
  68. data/test/coverband/utils/file_hasher_test.rb +29 -0
  69. data/test/coverband/utils/file_list_test.rb +5 -5
  70. data/test/coverband/utils/html_formatter_test.rb +43 -0
  71. data/test/coverband/utils/relative_file_converter_test.rb +39 -0
  72. data/test/coverband/utils/result_test.rb +6 -47
  73. data/test/coverband/utils/results_test.rb +54 -0
  74. data/test/coverband/utils/s3_report_test.rb +2 -0
  75. data/test/coverband/utils/source_file_test.rb +50 -0
  76. data/test/dog.rb.erb +12 -0
  77. data/test/forked/rails_full_stack_test.rb +106 -0
  78. data/test/forked/rails_rake_full_stack_test.rb +48 -0
  79. data/test/integration/full_stack_test.rb +17 -16
  80. data/test/rails4_dummy/Rakefile +6 -0
  81. data/test/rails4_dummy/config/application.rb +8 -9
  82. data/test/rails4_dummy/config/coverband.rb +5 -3
  83. data/test/rails5_dummy/Rakefile +6 -0
  84. data/test/rails5_dummy/config/application.rb +6 -10
  85. data/test/rails5_dummy/config/coverband.rb +4 -2
  86. data/test/rails_test_helper.rb +22 -5
  87. data/test/test_helper.rb +45 -8
  88. data/test/unique_files.rb +17 -9
  89. data/views/file_list.erb +2 -2
  90. data/views/gem_list.erb +10 -1
  91. data/views/layout.erb +6 -18
  92. data/views/nav.erb +35 -0
  93. data/views/source_file.erb +13 -4
  94. data/views/source_file_loader.erb +1 -1
  95. data/views/view_tracker.erb +37 -0
  96. metadata +59 -25
  97. data/lib/coverband/utils/file_path_helper.rb +0 -57
  98. data/test/coverband/integrations/middleware_test.rb +0 -96
  99. data/test/integration/rails_full_stack_test.rb +0 -95
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ class HashRedisStoreTest < Minitest::Test
6
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::HashRedisStore::REDIS_STORAGE_FORMAT_VERSION
7
+
8
+ class MockRelativeFileConverter
9
+ def self.convert(file)
10
+ file.sub('app_path/', './')
11
+ end
12
+ end
13
+
14
+ def setup
15
+ super
16
+ @redis = Redis.new
17
+ # FIXME: remove dependency on configuration and instead pass this in as an argument
18
+ Coverband.configure do |config|
19
+ config.root_paths = ['app_path/']
20
+ end
21
+ @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', relative_file_converter: MockRelativeFileConverter)
22
+ @store.clear!
23
+ Coverband.configuration.store = @store
24
+ end
25
+
26
+ def mock_time(time = Time.now)
27
+ Time.stubs(:now).returns(time)
28
+ time
29
+ end
30
+
31
+ def test_no_coverage
32
+ @store.save_report({})
33
+ assert_equal({}, @store.coverage)
34
+ end
35
+
36
+ class UnsupportedRedis
37
+ def info
38
+ { 'redis_version' => '2.5.0' }
39
+ end
40
+ end
41
+
42
+ def test_unsupported_redis
43
+ assert_raises RuntimeError do
44
+ Coverband::Adapters::HashRedisStore.new(UnsupportedRedis.new)
45
+ end
46
+ end
47
+
48
+ def test_coverage_for_file
49
+ yesterday = DateTime.now.prev_day.to_time
50
+ today = Time.now
51
+ mock_time(yesterday)
52
+ mock_file_hash
53
+ @store.save_report(
54
+ 'app_path/dog.rb' => [0, 1, 2]
55
+ )
56
+ assert_equal(
57
+ {
58
+ 'first_updated_at' => yesterday.to_i,
59
+ 'last_updated_at' => yesterday.to_i,
60
+ 'data' => [0, 1, 2]
61
+ },
62
+ @store.coverage['./dog.rb']
63
+ )
64
+ mock_time(today)
65
+ @store.save_report(
66
+ 'app_path/dog.rb' => [1, 1, 0]
67
+ )
68
+ assert_equal(
69
+ {
70
+ 'first_updated_at' => yesterday.to_i,
71
+ 'last_updated_at' => today.to_i,
72
+ 'data' => [1, 2, 2]
73
+ },
74
+ @store.coverage['./dog.rb']
75
+ )
76
+ end
77
+
78
+ def test_ttl_set
79
+ mock_file_hash(hash: 'abcd')
80
+ @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', ttl: 3600, relative_file_converter: MockRelativeFileConverter)
81
+ @store.save_report(
82
+ 'app_path/dog.rb' => [0, 1, 2]
83
+ )
84
+ assert_operator(@redis.ttl("#{REDIS_STORAGE_FORMAT_VERSION}.coverband_test.runtime../dog.rb.abcd"), :>, 0)
85
+ end
86
+
87
+ def test_no_ttl_set
88
+ mock_file_hash(hash: 'abcd')
89
+ @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', ttl: nil, relative_file_converter: MockRelativeFileConverter)
90
+ @store.save_report(
91
+ 'app_path/dog.rb' => [0, 1, 2]
92
+ )
93
+ assert_equal(-1, @redis.ttl("#{REDIS_STORAGE_FORMAT_VERSION}.coverband_test.runtime../dog.rb.abcd"))
94
+ end
95
+
96
+ def test_coverage_for_multiple_files
97
+ current_time = mock_time
98
+ mock_file_hash
99
+ data = {
100
+ 'app_path/dog.rb' => [0, nil, 1, 2],
101
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5],
102
+ 'app_path/ferrit.rb' => [1, 5, nil, 2, nil]
103
+ }
104
+ @store.save_report(data)
105
+ coverage = @store.coverage
106
+ assert_equal(
107
+ {
108
+ 'first_updated_at' => current_time.to_i,
109
+ 'last_updated_at' => current_time.to_i,
110
+ 'data' => [0, nil, 1, 2]
111
+ }, @store.coverage['./dog.rb']
112
+ )
113
+ assert_equal [1, 2, 0, 1, 5], @store.coverage['./cat.rb']['data']
114
+ assert_equal [1, 5, nil, 2, nil], @store.coverage['./ferrit.rb']['data']
115
+ end
116
+
117
+ def test_file_hash_change
118
+ mock_file_hash(hash: 'abc')
119
+ @store.save_report('app_path/dog.rb' => [0, nil, 1, 2])
120
+ coverage = @store.coverage
121
+ assert_equal [0, nil, 1, 2], @store.coverage['./dog.rb']['data']
122
+ @store.instance_eval { @file_hash_cache = {} }
123
+ mock_file_hash(hash: '123')
124
+ $debug = true
125
+ assert_nil @store.coverage['./dog.rb']
126
+ end
127
+
128
+ def test_type
129
+ mock_file_hash
130
+ @store.type = :eager_loading
131
+ data = {
132
+ 'app_path/dog.rb' => [0, nil, 1, 2]
133
+ }
134
+ @store.save_report(data)
135
+ assert_equal 1, @store.coverage.length
136
+ assert_equal [0, nil, 1, 2], @store.coverage['./dog.rb']['data']
137
+ @store.type = Coverband::RUNTIME_TYPE
138
+ data = {
139
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5]
140
+ }
141
+ @store.save_report(data)
142
+ assert_equal 1, @store.coverage.length
143
+ assert_equal [1, 2, 0, 1, 5], @store.coverage['./cat.rb']['data']
144
+ end
145
+
146
+ def test_coverage_type
147
+ mock_file_hash
148
+ @store.type = :eager_loading
149
+ data = {
150
+ 'app_path/dog.rb' => [0, nil, 1, 2]
151
+ }
152
+ @store.save_report(data)
153
+ @store.type = Coverband::RUNTIME_TYPE
154
+ assert_equal [0, nil, 1, 2], @store.coverage(:eager_loading)['./dog.rb']['data']
155
+ end
156
+
157
+ def test_clear
158
+ mock_file_hash
159
+ @store.type = Coverband::EAGER_TYPE
160
+ data = {
161
+ 'app_path/dog.rb' => [0, nil, 1, 2]
162
+ }
163
+ @store.save_report(data)
164
+ assert_equal 1, @store.coverage.length
165
+ @store.type = Coverband::RUNTIME_TYPE
166
+ data = {
167
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5]
168
+ }
169
+ @store.save_report(data)
170
+ assert_equal 1, @store.coverage.length
171
+ @redis.set('random', 'data')
172
+ @store.clear!
173
+ @store.type = Coverband::RUNTIME_TYPE
174
+ assert @store.coverage.empty?
175
+ @store.type = :eager_loading
176
+ assert @store.coverage.empty?
177
+ assert_equal 'data', @redis.get('random')
178
+ end
179
+
180
+ def test_clear_file
181
+ mock_file_hash
182
+ @store.type = :eager_loading
183
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
184
+ @store.type = Coverband::RUNTIME_TYPE
185
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
186
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['./dog.rb']['data']
187
+ @store.clear_file!('app_path/dog.rb')
188
+ assert_nil @store.get_coverage_report[:merged]['./dog.rb']
189
+ end
190
+ end
@@ -2,77 +2,110 @@
2
2
 
3
3
  require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
- class RedisTest < Minitest::Test
6
- REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
5
+ unless ENV['COVERBAND_HASH_REDIS_STORE']
6
+ class RedisTest < Minitest::Test
7
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
7
8
 
8
- def setup
9
- super
10
- @redis = Redis.new
11
- @store = Coverband::Adapters::RedisStore.new(@redis)
12
- end
9
+ def setup
10
+ super
11
+ Coverband.configuration.redis_namespace = 'coverband_test'
12
+ @redis = Redis.new
13
+ @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
14
+ Coverband.configuration.store = @store
15
+ @store.clear!
16
+ end
13
17
 
14
- def test_coverage
15
- mock_file_hash
16
- expected = basic_coverage
17
- @store.save_report(expected)
18
- assert_equal expected.keys, @store.coverage.keys
19
- @store.coverage.each_pair do |key, data|
20
- assert_equal expected[key], data['data']
18
+ def test_coverage
19
+ mock_file_hash
20
+ expected = basic_coverage
21
+ @store.save_report(expected)
22
+ assert_equal expected.keys, @store.coverage.keys
23
+ @store.coverage.each_pair do |key, data|
24
+ assert_equal expected[key], data['data']
25
+ end
21
26
  end
22
- end
23
27
 
24
- def test_coverage_increments
25
- mock_file_hash
26
- expected = basic_coverage.dup
27
- @store.save_report(basic_coverage.dup)
28
- assert_equal expected.keys, @store.coverage.keys
29
- @store.coverage.each_pair do |key, data|
30
- assert_equal expected[key], data['data']
28
+ def test_coverage_increments
29
+ mock_file_hash
30
+ expected = basic_coverage.dup
31
+ @store.save_report(basic_coverage.dup)
32
+ assert_equal expected.keys, @store.coverage.keys
33
+ @store.coverage.each_pair do |key, data|
34
+ assert_equal expected[key], data['data']
35
+ end
36
+ @store.save_report(basic_coverage.dup)
37
+ assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
31
38
  end
32
- @store.save_report(basic_coverage.dup)
33
- assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
34
- end
35
39
 
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']
40
+ def test_store_coverage_by_type
41
+ mock_file_hash
42
+ expected = basic_coverage
43
+ @store.type = :eager_loading
44
+ @store.save_report(expected)
45
+ assert_equal expected.keys, @store.coverage.keys
46
+ @store.coverage.each_pair do |key, data|
47
+ assert_equal expected[key], data['data']
48
+ end
49
+
50
+ @store.type = Coverband::RUNTIME_TYPE
51
+ assert_equal [], @store.coverage.keys
44
52
  end
45
53
 
46
- @store.type = nil
47
- assert_equal [], @store.coverage.keys
48
- end
54
+ def test_merged_coverage_with_types
55
+ mock_file_hash
56
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
57
+ @store.type = :eager_loading
58
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
59
+ @store.type = Coverband::RUNTIME_TYPE
60
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
61
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
62
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
63
+ end
49
64
 
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
65
+ def test_coverage_for_file
66
+ mock_file_hash
67
+ expected = basic_coverage
68
+ @store.save_report(expected)
69
+ assert_equal example_line, @store.coverage['app_path/dog.rb']['data']
70
+ end
60
71
 
61
- def test_covered_lines_for_file
62
- mock_file_hash
63
- expected = basic_coverage
64
- @store.save_report(expected)
65
- assert_equal example_line, @store.covered_lines_for_file('app_path/dog.rb')
66
- end
72
+ def test_coverage_with_simulate_oneshot_lines_coverage
73
+ Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
74
+ mock_file_hash
75
+ expected = basic_coverage
76
+ @store.save_report(expected)
77
+ assert_equal example_line, @store.get_coverage_report[:runtime]['app_path/dog.rb']['data']
78
+ end
67
79
 
68
- def test_covered_lines_when_null
69
- assert_equal [], @store.covered_lines_for_file('app_path/dog.rb')
70
- end
80
+ def test_coverage_when_null
81
+ assert_nil @store.coverage['app_path/dog.rb']
82
+ end
71
83
 
72
- def test_clear
73
- @redis.expects(:del).twice
74
- @store.clear!
75
- end
84
+ def test_clear
85
+ @redis.expects(:del).times(3)
86
+ @store.clear!
87
+ end
76
88
 
89
+ def test_clear_file
90
+ mock_file_hash
91
+ @store.type = :eager_loading
92
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
93
+ @store.type = Coverband::RUNTIME_TYPE
94
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
95
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
96
+ @store.clear_file!('app_path/dog.rb')
97
+ assert_nil @store.get_coverage_report[:merged]['app_path/dog.rb']
98
+ end
99
+
100
+ def test_size
101
+ mock_file_hash
102
+ @store.type = :eager_loading
103
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
104
+ assert @store.size > 1
105
+ end
77
106
 
107
+ def test_base_key
108
+ assert @store.send(:base_key).end_with?(Coverband::RUNTIME_TYPE.to_s)
109
+ end
110
+ end
78
111
  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,11 +69,11 @@ 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')
62
- logger.expects(:error).times(3)
75
+ Coverband::Adapters::RedisStore.any_instance.stubs(:save_report).raises('Oh no')
76
+ logger.expects(:error).at_least(3)
63
77
  error = assert_raises RuntimeError do
64
78
  @coverband.report_coverage
65
79
  end
@@ -70,4 +84,42 @@ 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
+
91
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
92
+ ::Coverage.expects(:running?).returns(false)
93
+ ::Coverage.expects(:start).with(oneshot_lines: false)
94
+ Coverband::Collectors::Coverage.send(:new)
95
+ end
96
+
97
+ test 'one shot line coverage enabled for ruby >= 2.6' do
98
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
99
+
100
+ Coverband.configuration.expects(:use_oneshot_lines_coverage).returns(true)
101
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
102
+ ::Coverage.expects(:running?).returns(false)
103
+ ::Coverage.expects(:start).with(oneshot_lines: true)
104
+ Coverband::Collectors::Coverage.send(:new)
105
+ end
106
+
107
+ test 'one shot line coverage for ruby >= 2.6 when already running' do
108
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
109
+
110
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(true)
111
+ ::Coverage.expects(:running?).returns(true)
112
+ ::Coverage.expects(:start).never
113
+ Coverband::Collectors::Coverage.send(:new)
114
+ end
115
+
116
+ test 'no one shot line coverage for ruby < 2.6' do
117
+ return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
118
+
119
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.6.0').returns(false)
120
+ Coverband::Collectors::Coverage.expects(:ruby_version_greater_than_or_equal_to?).with('2.5.0').returns(true)
121
+ ::Coverage.expects(:running?).returns(false)
122
+ ::Coverage.expects(:start).with
123
+ Coverband::Collectors::Coverage.send(:new)
124
+ end
73
125
  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,77 @@
1
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
+
3
+ class ReporterTest < Minitest::Test
4
+
5
+ def setup
6
+ super
7
+ fake_store.raw_store.del('render_tracker')
8
+ end
9
+
10
+ test "init correctly" do
11
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
12
+ tracker = Coverband::Collectors::ViewTracker.new(:store => "store", :roots => 'dir')
13
+ assert_equal 'dir', tracker.roots.first
14
+ assert_equal 'store', tracker.store
15
+ assert_equal [], tracker.target
16
+ assert_equal [], tracker.logged_views
17
+ end
18
+
19
+ test "track partials" do
20
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
21
+ store = fake_store
22
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
23
+ store.raw_store.expects(:sadd).with('render_tracker', file_path)
24
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
25
+ tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
26
+ tracker.report_views_tracked
27
+ assert_equal [file_path], tracker.logged_views
28
+ end
29
+
30
+ test "track layouts" do
31
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
32
+ store = fake_store
33
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/layout"
34
+ store.raw_store.expects(:sadd).with('render_tracker', file_path)
35
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
36
+ tracker.track_views('name', 'start', 'finish', 'id', {:layout => file_path})
37
+ tracker.report_views_tracked
38
+ assert_equal [file_path], tracker.logged_views
39
+ end
40
+
41
+ test "report used partials" do
42
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
43
+ store = fake_store
44
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
45
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
46
+ tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
47
+ tracker.report_views_tracked
48
+ assert_equal [file_path], tracker.used_views
49
+ end
50
+
51
+ test "report unused partials" do
52
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
53
+ store = fake_store
54
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
55
+ target = [file_path, 'not_used']
56
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir', target: target)
57
+ tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
58
+ tracker.report_views_tracked
59
+ assert_equal ['not_used'], tracker.unused_views
60
+ end
61
+
62
+ test "reset store" do
63
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
64
+ store = fake_store
65
+ store.raw_store.expects(:del).with('render_tracker')
66
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
67
+ tracker.track_views('name', 'start', 'finish', 'id', {:identifier => 'file'})
68
+ tracker.reset_recordings
69
+ end
70
+
71
+ protected
72
+
73
+ def fake_store
74
+ @fake_store ||= Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
75
+ end
76
+
77
+ end