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
@@ -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
@@ -0,0 +1,195 @@
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 = Coverband::Test.redis
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
+ Coverband.configuration.store = @store
23
+ end
24
+
25
+ def mock_time(time = Time.now)
26
+ Time.stubs(:now).returns(time)
27
+ time
28
+ end
29
+
30
+ def test_no_coverage
31
+ @store.save_report({})
32
+ assert_equal({}, @store.coverage)
33
+ end
34
+
35
+ class UnsupportedRedis
36
+ def info
37
+ { 'redis_version' => '2.5.0' }
38
+ end
39
+ end
40
+
41
+ def test_unsupported_redis
42
+ assert_raises RuntimeError do
43
+ Coverband::Adapters::HashRedisStore.new(UnsupportedRedis.new)
44
+ end
45
+ end
46
+
47
+ def test_coverage_for_file
48
+ yesterday = DateTime.now.prev_day.to_time
49
+ today = Time.now
50
+ mock_time(yesterday)
51
+ mock_file_hash
52
+ @store.save_report(
53
+ 'app_path/dog.rb' => [0, 1, 2]
54
+ )
55
+ assert_equal(
56
+ {
57
+ 'first_updated_at' => yesterday.to_i,
58
+ 'last_updated_at' => yesterday.to_i,
59
+ 'file_hash' => 'abcd',
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
+ 'file_hash' => 'abcd',
73
+ 'data' => [1, 2, 2]
74
+ },
75
+ @store.coverage['./dog.rb']
76
+ )
77
+ end
78
+
79
+ def test_ttl_set
80
+ mock_file_hash(hash: 'abcd')
81
+ @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', ttl: 3600, relative_file_converter: MockRelativeFileConverter)
82
+ @store.save_report(
83
+ 'app_path/dog.rb' => [0, 1, 2]
84
+ )
85
+ assert_operator(@redis.ttl("#{REDIS_STORAGE_FORMAT_VERSION}.coverband_test.runtime../dog.rb.abcd"), :>, 0)
86
+ end
87
+
88
+ def test_no_ttl_set
89
+ mock_file_hash(hash: 'abcd')
90
+ @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', ttl: nil, relative_file_converter: MockRelativeFileConverter)
91
+ @store.save_report(
92
+ 'app_path/dog.rb' => [0, 1, 2]
93
+ )
94
+ assert_equal(-1, @redis.ttl("#{REDIS_STORAGE_FORMAT_VERSION}.coverband_test.runtime../dog.rb.abcd"))
95
+ end
96
+
97
+ def test_coverage_for_multiple_files
98
+ current_time = mock_time
99
+ mock_file_hash
100
+ data = {
101
+ 'app_path/dog.rb' => [0, nil, 1, 2],
102
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5],
103
+ 'app_path/ferrit.rb' => [1, 5, nil, 2, nil]
104
+ }
105
+ @store.save_report(data)
106
+ coverage = @store.coverage
107
+ assert_equal(
108
+ {
109
+ 'first_updated_at' => current_time.to_i,
110
+ 'last_updated_at' => current_time.to_i,
111
+ 'file_hash' => 'abcd',
112
+ 'data' => [0, nil, 1, 2]
113
+ }, @store.coverage['./dog.rb']
114
+ )
115
+ assert_equal [1, 2, 0, 1, 5], @store.coverage['./cat.rb']['data']
116
+ assert_equal [1, 5, nil, 2, nil], @store.coverage['./ferrit.rb']['data']
117
+ end
118
+
119
+ def test_file_hash_change
120
+ mock_file_hash(hash: 'abc')
121
+ @store.save_report('app_path/dog.rb' => [0, nil, 1, 2])
122
+ coverage = @store.coverage
123
+ assert_equal [0, nil, 1, 2], @store.coverage['./dog.rb']['data']
124
+ @store.instance_eval { @file_hash_cache = {} }
125
+ mock_file_hash(hash: '123')
126
+ assert_nil @store.coverage['./dog.rb']
127
+ end
128
+
129
+ def test_type
130
+ mock_file_hash
131
+ @store.type = :eager_loading
132
+ data = {
133
+ 'app_path/dog.rb' => [0, nil, 1, 2]
134
+ }
135
+ @store.save_report(data)
136
+ assert_equal 1, @store.coverage.length
137
+ assert_equal [0, nil, 1, 2], @store.coverage['./dog.rb']['data']
138
+ # eager_loading doesn't set last_updated_at
139
+ assert_nil @store.coverage['./dog.rb']['last_updated_at']
140
+ @store.type = Coverband::RUNTIME_TYPE
141
+ data = {
142
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5]
143
+ }
144
+ current_time = Time.now.to_i
145
+ @store.save_report(data)
146
+ assert_equal 1, @store.coverage.length
147
+ assert_equal [1, 2, 0, 1, 5], @store.coverage['./cat.rb']['data']
148
+ assert current_time <= @store.coverage['./cat.rb']['last_updated_at']
149
+ end
150
+
151
+ def test_coverage_type
152
+ mock_file_hash
153
+ @store.type = :eager_loading
154
+ data = {
155
+ 'app_path/dog.rb' => [0, nil, 1, 2]
156
+ }
157
+ @store.save_report(data)
158
+ @store.type = Coverband::RUNTIME_TYPE
159
+ assert_equal [0, nil, 1, 2], @store.coverage(:eager_loading)['./dog.rb']['data']
160
+ end
161
+
162
+ def test_clear
163
+ mock_file_hash
164
+ @store.type = Coverband::EAGER_TYPE
165
+ data = {
166
+ 'app_path/dog.rb' => [0, nil, 1, 2]
167
+ }
168
+ @store.save_report(data)
169
+ assert_equal 1, @store.coverage.length
170
+ @store.type = Coverband::RUNTIME_TYPE
171
+ data = {
172
+ 'app_path/cat.rb' => [1, 2, 0, 1, 5]
173
+ }
174
+ @store.save_report(data)
175
+ assert_equal 1, @store.coverage.length
176
+ @redis.set('random', 'data')
177
+ @store.clear!
178
+ @store.type = Coverband::RUNTIME_TYPE
179
+ assert @store.coverage.empty?
180
+ @store.type = :eager_loading
181
+ assert @store.coverage.empty?
182
+ assert_equal 'data', @redis.get('random')
183
+ end
184
+
185
+ def test_clear_file
186
+ mock_file_hash
187
+ @store.type = :eager_loading
188
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
189
+ @store.type = Coverband::RUNTIME_TYPE
190
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
191
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['./dog.rb']['data']
192
+ @store.clear_file!('app_path/dog.rb')
193
+ assert_nil @store.get_coverage_report[:merged]['./dog.rb']
194
+ end
195
+ end
@@ -2,77 +2,120 @@
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
+ @store = Coverband.configuration.store
12
+ @redis = @store.instance_variable_get(:@redis)
13
+ end
13
14
 
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']
15
+ def test_coverage
16
+ mock_file_hash
17
+ expected = basic_coverage
18
+ @store.save_report(expected)
19
+ assert_equal expected.keys, @store.coverage.keys
20
+ @store.coverage.each_pair do |key, data|
21
+ assert_equal expected[key], data['data']
22
+ end
21
23
  end
22
- end
23
24
 
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']
25
+ def test_coverage_increments
26
+ mock_file_hash
27
+ expected = basic_coverage.dup
28
+ @store.save_report(basic_coverage.dup)
29
+ assert_equal expected.keys, @store.coverage.keys
30
+ @store.coverage.each_pair do |key, data|
31
+ assert_equal expected[key], data['data']
32
+ end
33
+ current_time = Time.now.to_i
34
+ @store.save_report(basic_coverage.dup)
35
+ assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
36
+ assert current_time <= @store.coverage['app_path/dog.rb']['last_updated_at']
31
37
  end
32
- @store.save_report(basic_coverage.dup)
33
- assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
34
- end
35
38
 
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']
39
+ def test_file_hash_change
40
+ mock_file_hash(hash: 'abc')
41
+ @store.save_report('app_path/dog.rb' => [0, nil, 1, 2])
42
+ assert_equal [0, nil, 1, 2], @store.coverage['app_path/dog.rb']['data']
43
+ mock_file_hash(hash: '123')
44
+ assert_nil @store.coverage['app_path/dog.rb']
44
45
  end
45
46
 
46
- @store.type = nil
47
- assert_equal [], @store.coverage.keys
48
- end
47
+ def test_store_coverage_by_type
48
+ mock_file_hash
49
+ expected = basic_coverage
50
+ @store.type = :eager_loading
51
+ @store.save_report(expected)
52
+ assert_equal expected.keys, @store.coverage.keys
53
+ @store.coverage.each_pair do |key, data|
54
+ assert_equal expected[key], data['data']
55
+ end
56
+ @store.type = Coverband::RUNTIME_TYPE
57
+ assert_equal [], @store.coverage.keys
58
+ end
49
59
 
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
+ def test_merged_coverage_with_types
61
+ mock_file_hash
62
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
63
+ @store.type = :eager_loading
64
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
65
+ # eager_loading doesn't set last_updated_at
66
+ assert_nil @store.coverage['app_path/dog.rb']['last_updated_at']
67
+ @store.type = Coverband::RUNTIME_TYPE
68
+ current_time = Time.now.to_i
69
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
70
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
71
+ assert current_time <= @store.coverage['app_path/dog.rb']['last_updated_at']
72
+ assert_equal Coverband::RUNTIME_TYPE, @store.type
73
+ end
60
74
 
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
75
+ def test_coverage_for_file
76
+ mock_file_hash
77
+ expected = basic_coverage
78
+ @store.save_report(expected)
79
+ assert_equal example_line, @store.coverage['app_path/dog.rb']['data']
80
+ end
67
81
 
68
- def test_covered_lines_when_null
69
- assert_equal [], @store.covered_lines_for_file('app_path/dog.rb')
70
- end
82
+ def test_coverage_with_simulate_oneshot_lines_coverage
83
+ Coverband.configuration.stubs(:simulate_oneshot_lines_coverage).returns(true)
84
+ mock_file_hash
85
+ expected = basic_coverage
86
+ @store.save_report(expected)
87
+ assert_equal example_line, @store.get_coverage_report[:runtime]['app_path/dog.rb']['data']
88
+ end
71
89
 
72
- def test_clear
73
- @redis.expects(:del).twice
74
- @store.clear!
75
- end
90
+ def test_coverage_when_null
91
+ assert_nil @store.coverage['app_path/dog.rb']
92
+ end
93
+
94
+ def test_clear
95
+ @redis.expects(:del).times(3)
96
+ @store.clear!
97
+ end
76
98
 
99
+ def test_clear_file
100
+ mock_file_hash
101
+ @store.type = :eager_loading
102
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
103
+ @store.type = Coverband::RUNTIME_TYPE
104
+ @store.save_report('app_path/dog.rb' => [1, 0, 1])
105
+ assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
106
+ @store.clear_file!('app_path/dog.rb')
107
+ assert_nil @store.get_coverage_report[:merged]['app_path/dog.rb']
108
+ end
109
+
110
+ def test_size
111
+ mock_file_hash
112
+ @store.type = :eager_loading
113
+ @store.save_report('app_path/dog.rb' => [0, 1, 1])
114
+ assert @store.size > 1
115
+ end
77
116
 
117
+ def test_base_key
118
+ assert @store.send(:base_key).end_with?(Coverband::RUNTIME_TYPE.to_s)
119
+ end
120
+ end
78
121
  end
@@ -9,5 +9,3 @@ class AtExitTest < Minitest::Test
9
9
  2.times { Coverband::AtExit.register }
10
10
  end
11
11
  end
12
-
13
-