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