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.
- checksums.yaml +4 -4
- data/.rubocop.yml +29 -9
- data/.travis.yml +10 -8
- data/CODE_OF_CONDUCT.md +76 -0
- data/Gemfile +3 -1
- data/Gemfile.rails4 +1 -0
- data/README.md +72 -43
- data/Rakefile +14 -3
- data/changes.md +66 -11
- data/coverband.gemspec +2 -5
- data/lib/coverband/adapters/base.rb +64 -45
- data/lib/coverband/adapters/file_store.rb +15 -9
- data/lib/coverband/adapters/hash_redis_store.rb +182 -0
- data/lib/coverband/adapters/redis_store.rb +33 -11
- data/lib/coverband/at_exit.rb +2 -11
- data/lib/coverband/collectors/coverage.rb +34 -40
- data/lib/coverband/collectors/delta.rb +34 -28
- data/lib/coverband/collectors/view_tracker.rb +124 -0
- data/lib/coverband/configuration.rb +96 -32
- data/lib/coverband/integrations/background.rb +9 -4
- data/lib/coverband/integrations/{middleware.rb → background_middleware.rb} +2 -6
- data/lib/coverband/integrations/bundler.rb +8 -0
- data/lib/coverband/integrations/report_middleware.rb +15 -0
- data/lib/coverband/integrations/resque.rb +3 -5
- data/lib/coverband/reporters/base.rb +40 -16
- data/lib/coverband/reporters/console_report.rb +1 -0
- data/lib/coverband/reporters/html_report.rb +21 -27
- data/lib/coverband/reporters/web.rb +19 -21
- data/lib/coverband/utils/absolute_file_converter.rb +47 -0
- data/lib/coverband/utils/file_hasher.rb +16 -0
- data/lib/coverband/utils/file_list.rb +16 -5
- data/lib/coverband/utils/html_formatter.rb +37 -8
- data/lib/coverband/utils/lines_classifier.rb +5 -0
- data/lib/coverband/utils/railtie.rb +20 -9
- data/lib/coverband/utils/relative_file_converter.rb +41 -0
- data/lib/coverband/utils/result.rb +1 -37
- data/lib/coverband/utils/results.rb +51 -0
- data/lib/coverband/utils/s3_report.rb +2 -2
- data/lib/coverband/utils/source_file.rb +31 -8
- data/lib/coverband/utils/tasks.rb +10 -10
- data/lib/coverband/version.rb +5 -1
- data/lib/coverband.rb +39 -22
- data/public/application.css +6 -6
- data/public/application.js +27 -0
- data/test/benchmarks/benchmark.rake +167 -73
- data/test/benchmarks/init_rails.rake +10 -0
- data/test/coverband/adapters/base_test.rb +73 -42
- data/test/coverband/adapters/file_store_test.rb +48 -37
- data/test/coverband/adapters/hash_redis_store_test.rb +190 -0
- data/test/coverband/adapters/redis_store_test.rb +92 -59
- data/test/coverband/at_exit_test.rb +0 -2
- data/test/coverband/collectors/coverage_test.rb +62 -10
- data/test/coverband/collectors/delta_test.rb +36 -6
- data/test/coverband/collectors/view_tracker_test.rb +77 -0
- data/test/coverband/configuration_test.rb +47 -7
- data/test/coverband/coverband_test.rb +14 -2
- data/test/coverband/integrations/background_middleware_test.rb +44 -0
- data/test/coverband/integrations/background_test.rb +1 -3
- data/test/coverband/integrations/report_middleware_test.rb +44 -0
- data/test/coverband/integrations/resque_worker_test.rb +6 -6
- data/test/coverband/integrations/test_resque_job.rb +3 -1
- data/test/coverband/reporters/base_test.rb +2 -79
- data/test/coverband/reporters/console_test.rb +2 -6
- data/test/coverband/reporters/html_test.rb +58 -19
- data/test/coverband/reporters/web_test.rb +0 -10
- data/test/coverband/utils/absolute_file_converter_test.rb +56 -0
- data/test/coverband/utils/file_groups_test.rb +11 -5
- data/test/coverband/utils/file_hasher_test.rb +29 -0
- data/test/coverband/utils/file_list_test.rb +5 -5
- data/test/coverband/utils/html_formatter_test.rb +43 -0
- data/test/coverband/utils/relative_file_converter_test.rb +39 -0
- data/test/coverband/utils/result_test.rb +6 -47
- data/test/coverband/utils/results_test.rb +54 -0
- data/test/coverband/utils/s3_report_test.rb +2 -0
- data/test/coverband/utils/source_file_test.rb +50 -0
- data/test/dog.rb.erb +12 -0
- data/test/forked/rails_full_stack_test.rb +106 -0
- data/test/forked/rails_rake_full_stack_test.rb +48 -0
- data/test/integration/full_stack_test.rb +17 -16
- data/test/rails4_dummy/Rakefile +6 -0
- data/test/rails4_dummy/config/application.rb +8 -9
- data/test/rails4_dummy/config/coverband.rb +5 -3
- data/test/rails5_dummy/Rakefile +6 -0
- data/test/rails5_dummy/config/application.rb +6 -10
- data/test/rails5_dummy/config/coverband.rb +4 -2
- data/test/rails_test_helper.rb +22 -5
- data/test/test_helper.rb +45 -8
- data/test/unique_files.rb +17 -9
- data/views/file_list.erb +2 -2
- data/views/gem_list.erb +10 -1
- data/views/layout.erb +6 -18
- data/views/nav.erb +35 -0
- data/views/source_file.erb +13 -4
- data/views/source_file_loader.erb +1 -1
- data/views/view_tracker.erb +37 -0
- metadata +59 -25
- data/lib/coverband/utils/file_path_helper.rb +0 -57
- data/test/coverband/integrations/middleware_test.rb +0 -96
- 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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
def test_coverage_when_null
|
|
81
|
+
assert_nil @store.coverage['app_path/dog.rb']
|
|
82
|
+
end
|
|
71
83
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
@@ -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
|
|
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
|
|
27
|
+
coverband.report_coverage
|
|
28
28
|
coverage = Coverband.configuration.store.coverage
|
|
29
|
-
assert_equal(coverage[file][
|
|
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
|
|
35
|
+
coverband.report_coverage
|
|
36
36
|
coverage = Coverband.configuration.store.coverage
|
|
37
|
-
assert_equal(coverage[
|
|
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
|
-
|
|
62
|
-
logger.expects(:error).
|
|
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
|