coverband 1.3.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +39 -6
  4. data/changes.md +23 -0
  5. data/coverband.gemspec +2 -1
  6. data/lib/coverband.rb +12 -11
  7. data/lib/coverband/adapters/file_store.rb +59 -0
  8. data/lib/coverband/adapters/memory_cache_store.rb +46 -0
  9. data/lib/coverband/adapters/redis_store.rb +101 -0
  10. data/lib/coverband/base.rb +4 -7
  11. data/lib/coverband/baseline.rb +35 -0
  12. data/lib/coverband/configuration.rb +20 -5
  13. data/lib/coverband/reporters/base.rb +150 -0
  14. data/lib/coverband/reporters/console_report.rb +17 -0
  15. data/lib/coverband/reporters/simple_cov_report.rb +46 -0
  16. data/lib/coverband/s3_report_writer.rb +6 -1
  17. data/lib/coverband/tasks.rb +26 -16
  18. data/lib/coverband/version.rb +1 -1
  19. data/test/benchmarks/benchmark.rake +57 -7
  20. data/test/test_helper.rb +20 -0
  21. data/test/unit/adapters_file_store_test.rb +41 -0
  22. data/test/unit/{memory_cache_store_test.rb → adapters_memory_cache_store_test.rb} +12 -12
  23. data/test/unit/adapters_redis_store_test.rb +164 -0
  24. data/test/unit/base_test.rb +8 -7
  25. data/test/unit/baseline_test.rb +50 -0
  26. data/test/unit/middleware_test.rb +8 -8
  27. data/test/unit/reports_base_test.rb +140 -0
  28. data/test/unit/reports_console_test.rb +37 -0
  29. data/test/unit/reports_simple_cov_test.rb +68 -0
  30. data/test/unit/s3_report_writer_test.rb +1 -0
  31. metadata +37 -24
  32. data/lib/coverband/memory_cache_store.rb +0 -42
  33. data/lib/coverband/redis_store.rb +0 -57
  34. data/lib/coverband/reporter.rb +0 -223
  35. data/test/unit/redis_store_test.rb +0 -107
  36. data/test/unit/reporter_test.rb +0 -207
@@ -28,6 +28,26 @@ def test(name, &block)
28
28
  end
29
29
  end
30
30
 
31
+ def fake_redis
32
+ @redis ||= begin
33
+ redis = OpenStruct.new()
34
+ def redis.smembers(key)
35
+ end
36
+ redis
37
+ end
38
+ end
39
+
40
+ def fake_coverband_members
41
+ ["/Users/danmayer/projects/hearno/script/tester.rb",
42
+ "/Users/danmayer/projects/hearno/app/controllers/application_controller.rb",
43
+ "/Users/danmayer/projects/hearno/app/models/account.rb"
44
+ ]
45
+ end
46
+
47
+ def fake_coverage_report
48
+ {"/Users/danmayer/projects/hearno/script/tester.rb"=>[1, nil, 1, 1, nil, nil, nil]}
49
+ end
50
+
31
51
  require 'coverband'
32
52
 
33
53
  unless File.exist?('./tmp/coverband_baseline.json')
@@ -0,0 +1,41 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class AdaptersFileStoreTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @test_file_path = "/tmp/coverband_filestore_test_path.json"
7
+ File.open(@test_file_path, 'w') { |f| f.write(test_data.to_json) }
8
+ @store = Coverband::Adapters::FileStore.new(@test_file_path)
9
+ end
10
+
11
+ def test_covered_lines_for_file
12
+ assert_equal @store.covered_lines_for_file('dog.rb')["1"], 1
13
+ assert_equal @store.covered_lines_for_file('dog.rb')["2"], 2
14
+ end
15
+
16
+ def test_covered_lines_when_null
17
+ assert_equal @store.covered_lines_for_file('none.rb'), []
18
+ end
19
+
20
+ def test_covered_files
21
+ assert_equal @store.covered_files(), ['dog.rb']
22
+ end
23
+
24
+ def test_clear
25
+ @store.clear!
26
+ assert_equal false, File.exist?(@test_file_path)
27
+ end
28
+
29
+ def test_save_report
30
+ @store.save_report({"cat.rb" => {1 => 1}})
31
+ assert_equal @store.covered_lines_for_file('cat.rb')["1"], 1
32
+ end
33
+
34
+ private
35
+
36
+ def test_data
37
+ {
38
+ "dog.rb" => { 1 => 1, 2 => 2 },
39
+ }
40
+ end
41
+ end
@@ -4,9 +4,9 @@ module Coverband
4
4
  class MemoryCacheStoreTest < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
- MemoryCacheStore.reset!
7
+ Adapters::MemoryCacheStore.reset!
8
8
  @store = mock('store')
9
- @memory_store = MemoryCacheStore.new(@store)
9
+ @memory_store = Adapters::MemoryCacheStore.new(@store)
10
10
  end
11
11
 
12
12
  def data
@@ -17,17 +17,17 @@ module Coverband
17
17
  end
18
18
 
19
19
  test 'it passes data into store' do
20
- @store.expects(:store_report).with data
20
+ @store.expects(:save_report).with data
21
21
  @store.expects(:covered_lines_for_file).with('file1').returns []
22
22
  @store.expects(:covered_lines_for_file).with('file2').returns []
23
- @memory_store.store_report data
23
+ @memory_store.save_report data
24
24
  end
25
25
 
26
26
  test 'it passes data into store only once' do
27
- @store.expects(:store_report).once.with data
27
+ @store.expects(:save_report).once.with data
28
28
  @store.expects(:covered_lines_for_file).with('file1').returns []
29
29
  @store.expects(:covered_lines_for_file).with('file2').returns []
30
- 2.times { @memory_store.store_report data }
30
+ 2.times { @memory_store.save_report data }
31
31
  end
32
32
 
33
33
  test 'it only passes files and lines we have not hit yet' do
@@ -37,19 +37,19 @@ module Coverband
37
37
  }
38
38
  @store.expects(:covered_lines_for_file).with('file1').returns []
39
39
  @store.expects(:covered_lines_for_file).with('file2').returns []
40
- @store.expects(:store_report).once.with data
41
- @store.expects(:store_report).once.with(
40
+ @store.expects(:save_report).once.with data
41
+ @store.expects(:save_report).once.with(
42
42
  'file1' => { 10 => 1 }
43
43
  )
44
- @memory_store.store_report data
45
- @memory_store.store_report second_data
44
+ @memory_store.save_report data
45
+ @memory_store.save_report second_data
46
46
  end
47
47
 
48
48
  test 'it initializes cache with what is in store' do
49
49
  @store.expects(:covered_lines_for_file).with('file1').returns [3,5]
50
50
  @store.expects(:covered_lines_for_file).with('file2').returns [2]
51
- @store.expects(:store_report).with('file2' => { 1 => 1 })
52
- @memory_store.store_report data
51
+ @store.expects(:save_report).with('file2' => { 1 => 1 })
52
+ @memory_store.save_report data
53
53
  end
54
54
 
55
55
  end
@@ -0,0 +1,164 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class RedisTest < Test::Unit::TestCase
4
+ BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
5
+
6
+ def setup
7
+ @redis = Redis.new
8
+ @redis.flushdb
9
+ @store = Coverband::Adapters::RedisStore.new(@redis, array: true)
10
+ end
11
+
12
+ def test_coverage
13
+ @redis.sadd(BASE_KEY, 'dog.rb')
14
+ @redis.sadd("#{BASE_KEY}.dog.rb", 1)
15
+ @redis.sadd("#{BASE_KEY}.dog.rb", 2)
16
+ expected = {'dog.rb' => [1,2]}
17
+ assert_equal expected, @store.coverage
18
+ end
19
+
20
+ def test_covered_lines_for_file
21
+ @redis.sadd("#{BASE_KEY}.dog.rb", 1)
22
+ @redis.sadd("#{BASE_KEY}.dog.rb", 2)
23
+ assert_equal [1, 2], @store.covered_lines_for_file('dog.rb').sort
24
+ end
25
+
26
+ def test_covered_lines_for_file__hash
27
+ @redis.mapped_hmset("#{BASE_KEY}.dog.rb", {"1" => 1, "2" => 2})
28
+ @store = Coverband::Adapters::RedisStore.new(@redis, array: false)
29
+ expected = [["1", "1"], ["2", "2"]]
30
+ assert_equal expected, @store.covered_lines_for_file('dog.rb').sort
31
+ end
32
+
33
+ def test_covered_lines_when_null
34
+ assert_equal @store.covered_lines_for_file('dog.rb'), []
35
+ end
36
+
37
+ def test_clear
38
+ @redis.expects(:smembers).with(BASE_KEY).once.returns([])
39
+ @redis.expects(:del).with(BASE_KEY).once
40
+ @store.clear!
41
+ end
42
+
43
+ private
44
+
45
+ def test_data
46
+ {
47
+ "/Users/danmayer/projects/cover_band_server/app.rb" => { 54 => 1, 55 => 2 },
48
+ "/Users/danmayer/projects/cover_band_server/server.rb" => { 5 => 1 }
49
+ }
50
+ end
51
+ end
52
+
53
+ class RedisStoreTestV3Array < RedisTest
54
+
55
+ def setup
56
+ @redis = Redis.current.tap { |redis|
57
+ redis.stubs(:sadd).with(anything, anything)
58
+ redis.stubs(:info).returns({'redis_version' => 3.0})
59
+ }
60
+
61
+ @store = Coverband::Adapters::RedisStore.new(@redis, array: true)
62
+ end
63
+
64
+ test "it stores the files into coverband" do
65
+ @redis.expects(:sadd).with(BASE_KEY, [
66
+ '/Users/danmayer/projects/cover_band_server/app.rb',
67
+ '/Users/danmayer/projects/cover_band_server/server.rb'
68
+ ])
69
+
70
+ @store.save_report(test_data)
71
+ end
72
+
73
+ test "it stores the file lines of the file app.rb" do
74
+ @redis.expects(:sadd).with(
75
+ "#{BASE_KEY}./Users/danmayer/projects/cover_band_server/app.rb",
76
+ [54, 55]
77
+ )
78
+
79
+ @store.save_report(test_data)
80
+ end
81
+
82
+ test "it stores the file lines of the file server.rb" do
83
+ @redis.expects(:sadd).with(
84
+ "#{BASE_KEY}./Users/danmayer/projects/cover_band_server/server.rb",
85
+ [5]
86
+ )
87
+
88
+ @store.save_report(test_data)
89
+ end
90
+
91
+ end
92
+
93
+ class RedisStoreTestV3Hash < RedisTest
94
+
95
+ def setup
96
+ @redis = Redis.current.tap { |redis|
97
+ redis.stubs(:sadd).with(anything, anything)
98
+ redis.stubs(:info).returns({'redis_version' => 3.0})
99
+ }
100
+
101
+ @store = Coverband::Adapters::RedisStore.new(@redis)
102
+ end
103
+
104
+ test "it stores the files into coverband" do
105
+ @redis.expects(:sadd).with(BASE_KEY, [
106
+ '/Users/danmayer/projects/cover_band_server/app.rb',
107
+ '/Users/danmayer/projects/cover_band_server/server.rb'
108
+ ])
109
+
110
+ @store.save_report(test_data)
111
+ end
112
+
113
+ test "it stores the file lines of the file app.rb" do
114
+ @redis.expects(:mapped_hmset).with(
115
+ "#{BASE_KEY}./Users/danmayer/projects/cover_band_server/app.rb",
116
+ {'54' => 1, '55' => 2}
117
+ )
118
+ @redis.expects(:mapped_hmset).with(
119
+ "#{BASE_KEY}./Users/danmayer/projects/cover_band_server/server.rb",
120
+ {'5' => 1}
121
+ )
122
+
123
+ @store.save_report(test_data)
124
+ end
125
+
126
+ end
127
+
128
+ class RedisStoreTestV223 < RedisTest
129
+
130
+ def setup
131
+ @redis = Redis.current.tap { |redis|
132
+ redis.stubs(:sadd).with(anything, anything)
133
+ redis.stubs(:info).returns({'redis_version' => "2.2.3"})
134
+ }
135
+
136
+ @store = Coverband::Adapters::RedisStore.new(@redis, array: true)
137
+ end
138
+
139
+ test "it store the files with separate calls into coverband" do
140
+ @redis.expects(:sadd).with(BASE_KEY, '/Users/danmayer/projects/cover_band_server/app.rb')
141
+ @redis.expects(:sadd).with(BASE_KEY, '/Users/danmayer/projects/cover_band_server/server.rb')
142
+
143
+ @store.save_report(test_data)
144
+ end
145
+ end
146
+
147
+ class RedisStoreTestV222 < RedisTest
148
+
149
+ def setup
150
+ @redis = Redis.current.tap { |redis|
151
+ redis.stubs(:sadd).with(anything, anything)
152
+ redis.stubs(:info).returns({'redis_version' => "2.2.2"})
153
+ }
154
+
155
+ @store = Coverband::Adapters::RedisStore.new(@redis, array: true)
156
+ end
157
+
158
+ test "it store the files with separate calls into coverband" do
159
+ @redis.expects(:sadd).with(BASE_KEY, '/Users/danmayer/projects/cover_band_server/app.rb')
160
+ @redis.expects(:sadd).with(BASE_KEY, '/Users/danmayer/projects/cover_band_server/server.rb')
161
+
162
+ @store.save_report(test_data)
163
+ end
164
+ end
@@ -5,13 +5,13 @@ class BaseTest < Test::Unit::TestCase
5
5
 
6
6
  test 'defaults to a redis store' do
7
7
  coverband = Coverband::Base.instance.reset_instance
8
- assert_equal Coverband::RedisStore, coverband.instance_variable_get('@reporter').class
8
+ assert_equal Coverband::Adapters::RedisStore, coverband.instance_variable_get('@store').class
9
9
  end
10
10
 
11
11
  test 'configure memory caching' do
12
12
  Coverband.configuration.memory_caching = true
13
13
  coverband = Coverband::Base.instance.reset_instance
14
- assert_equal Coverband::MemoryCacheStore, coverband.instance_variable_get('@reporter').class
14
+ assert_equal Coverband::Adapters::MemoryCacheStore, coverband.instance_variable_get('@store').class
15
15
  Coverband.configuration.memory_caching = false
16
16
  end
17
17
 
@@ -45,7 +45,7 @@ class BaseTest < Test::Unit::TestCase
45
45
  coverband.instance_variable_set("@sample_percentage", 100.0)
46
46
  coverband.instance_variable_set("@verbose", true)
47
47
  coverband.instance_variable_set("@logger", logger)
48
- coverband.instance_variable_set("@reporter", nil)
48
+ coverband.instance_variable_set("@store", nil)
49
49
  assert_equal false, coverband.instance_variable_get("@enabled")
50
50
  logger.expects(:info).at_least_once
51
51
  coverband.sample { 1 + 1 }
@@ -58,7 +58,7 @@ class BaseTest < Test::Unit::TestCase
58
58
  coverband.instance_variable_set("@sample_percentage", 100.0)
59
59
  coverband.instance_variable_set("@verbose", true)
60
60
  coverband.instance_variable_set("@logger", logger)
61
- coverband.instance_variable_set("@reporter", nil)
61
+ coverband.instance_variable_set("@store", nil)
62
62
  assert_equal false, coverband.instance_variable_get("@enabled")
63
63
  logger.expects(:info).at_least_once
64
64
  coverband.start
@@ -72,9 +72,10 @@ class BaseTest < Test::Unit::TestCase
72
72
  coverband = Coverband::Base.instance.reset_instance
73
73
  coverband.instance_variable_set("@sample_percentage", 100.0)
74
74
  coverband.instance_variable_set("@verbose", true)
75
- store = Coverband::RedisStore.new(Redis.new)
76
- coverband.instance_variable_set("@reporter", store)
77
- store.expects(:store_report).once.with(has_entries(dog_file => { 3 => 5 }) )
75
+ Coverband.configuration.logger.stubs('info')
76
+ store = Coverband::Adapters::RedisStore.new(Redis.new)
77
+ coverband.instance_variable_set("@store", store)
78
+ store.expects(:save_report).once.with(has_entries(dog_file => { 3 => 5 }) )
78
79
  assert_equal false, coverband.instance_variable_get("@enabled")
79
80
  coverband.start
80
81
  5.times { Dog.new.bark }
@@ -0,0 +1,50 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class ReporterTest < Test::Unit::TestCase
4
+
5
+ test "record baseline" do
6
+ Coverband.configure do |config|
7
+ config.redis = nil
8
+ config.store = nil
9
+ config.root = '/full/remote_app/path'
10
+ config.coverage_file = '/tmp/fake_file.json'
11
+ end
12
+ Coverage.expects(:start).returns(true).at_least_once
13
+ Coverage.expects(:result).returns({'fake' => [0,1]}).at_least_once
14
+ File.expects(:open).once
15
+
16
+ File.expects(:exist?).at_least_once.returns(true)
17
+ expected = {"filename.rb" => [0,nil,1]}
18
+ fake_file_data = expected.to_json
19
+ File.expects(:read).at_least_once.returns(fake_file_data)
20
+
21
+ Coverband::Baseline.record{
22
+ #nothing
23
+ }
24
+ end
25
+
26
+ test "parse baseline" do
27
+ Coverband.configure do |config|
28
+ config.redis = nil
29
+ config.store = nil
30
+ config.root = '/full/remote_app/path'
31
+ config.coverage_file = '/tmp/fake_file.json'
32
+ end
33
+ File.expects(:exist?).at_least_once.returns(true)
34
+ expected = {"filename.rb" => [0,nil,1]}
35
+ fake_file_data = expected.to_json
36
+ File.expects(:read).at_least_once.returns(fake_file_data)
37
+ results = Coverband::Baseline.parse_baseline
38
+ assert_equal(results, {"filename.rb" => [0,nil,1]})
39
+ end
40
+
41
+ # todo test redis and file stores baseline
42
+
43
+ test "convert_coverage_format" do
44
+ results = {"fake_file.rb" => [1,nil,0,2]}
45
+ expected = {"fake_file.rb"=>{1=>1, 3=>0, 4=>2}}
46
+ assert_equal(expected, Coverband::Baseline.convert_coverage_format(results))
47
+ end
48
+
49
+
50
+ end
@@ -3,6 +3,8 @@ require File.expand_path('../fake_app/basic_rack', File.dirname(__FILE__))
3
3
  require 'rack'
4
4
 
5
5
  class MiddlewareTest < Test::Unit::TestCase
6
+ BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
+
6
8
  test "call app" do
7
9
  request = Rack::MockRequest.env_for("/anything.json")
8
10
  Coverband::Base.instance.reset_instance
@@ -76,7 +78,6 @@ class MiddlewareTest < Test::Unit::TestCase
76
78
  middleware.call(request) rescue nil
77
79
  end
78
80
 
79
-
80
81
  test 'always report coverage when sampling' do
81
82
  request = Rack::MockRequest.env_for("/anything.json")
82
83
  Coverband::Base.instance.reset_instance
@@ -84,15 +85,15 @@ class MiddlewareTest < Test::Unit::TestCase
84
85
  assert_equal false, Coverband::Base.instance.instance_variable_get("@enabled")
85
86
  Coverband::Base.instance.instance_variable_set("@sample_percentage", 100.0)
86
87
  fake_redis = Redis.new
87
- Coverband::Base.instance.instance_variable_set("@reporter", Coverband::RedisStore.new(fake_redis))
88
+ Coverband::Base.instance.instance_variable_set("@store", Coverband::Adapters::RedisStore.new(fake_redis))
88
89
  fake_redis.stubs(:info).returns({'redis_version' => 3.0})
89
90
  fake_redis.expects(:sadd).at_least_once
90
- fake_redis.expects(:sadd).at_least_once.with("coverband.#{basic_rack_ruby_file}", [5])
91
+ fake_redis.expects(:mapped_hmset).at_least_once
92
+ fake_redis.expects(:mapped_hmset).at_least_once.with("#{BASE_KEY}.#{basic_rack_ruby_file}", {'5' => 1})
91
93
  results = middleware.call(request)
92
94
  assert_equal true, Coverband::Base.instance.instance_variable_get("@enabled")
93
95
  end
94
96
 
95
-
96
97
  test 'report only on calls when configured' do
97
98
  request = Rack::MockRequest.env_for("/anything.json")
98
99
  Coverband.configuration.trace_point_events = [:call]
@@ -101,16 +102,15 @@ class MiddlewareTest < Test::Unit::TestCase
101
102
  assert_equal false, Coverband::Base.instance.instance_variable_get("@enabled")
102
103
  Coverband::Base.instance.instance_variable_set("@sample_percentage", 100.0)
103
104
  fake_redis = Redis.new
104
- Coverband::Base.instance.instance_variable_set("@reporter", Coverband::RedisStore.new(fake_redis))
105
+ Coverband::Base.instance.instance_variable_set("@store", Coverband::Adapters::RedisStore.new(fake_redis))
105
106
  fake_redis.stubs(:info).returns({'redis_version' => 3.0})
106
107
  fake_redis.expects(:sadd).at_least_once
107
- fake_redis.expects(:sadd).at_least_once.with("coverband.#{basic_rack_ruby_file}", [4])
108
+ fake_redis.expects(:mapped_hmset).at_least_once
109
+ fake_redis.expects(:mapped_hmset).at_least_once.with("#{BASE_KEY}.#{basic_rack_ruby_file}", {'4'=>1})
108
110
  results = middleware.call(request)
109
111
  assert_equal true, Coverband::Base.instance.instance_variable_get("@enabled")
110
112
  end
111
113
 
112
-
113
-
114
114
  private
115
115
 
116
116
  def fake_app
@@ -0,0 +1,140 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class ReportsBaseTest < Test::Unit::TestCase
4
+
5
+ test "filename_from_key fix filename from a key with a swappable path" do
6
+ Coverband.configure do |config|
7
+ config.reporter = 'std_out'
8
+ config.root = '/full/remote_app/path'
9
+ end
10
+
11
+ key = "/app/is/a/path.rb"
12
+ #the code takes config.root expands and adds a '/' for the final path in roots
13
+ roots = ["/app/", '/full/remote_app/path/']
14
+
15
+ assert_equal "/full/remote_app/path/is/a/path.rb", Coverband::Reporters::Base.filename_from_key(key, roots)
16
+ end
17
+
18
+ test "filename_from_key fix filename a changing deploy path with double quotes" do
19
+ Coverband.configure do |config|
20
+ config.reporter = 'std_out'
21
+ config.root = '/full/remote_app/path'
22
+ end
23
+
24
+ key = "/box/apps/app_name/releases/20140725203539/app/models/user.rb"
25
+ # the code takes config.root expands and adds a '/' for the final path in roots
26
+ # note to get regex to work for changing deploy directories it must be double escaped in double quotes or use single qoutes
27
+ roots = ["/box/apps/app_name/releases/\\d+/", '/full/remote_app/path/']
28
+
29
+ assert_equal "/full/remote_app/path/app/models/user.rb", Coverband::Reporters::Base.filename_from_key(key, roots)
30
+ end
31
+
32
+ test "filename_from_key fix filename a changing deploy path with single quotes" do
33
+ Coverband.configure do |config|
34
+ config.reporter = 'std_out'
35
+ config.root = '/full/remote_app/path'
36
+ end
37
+
38
+ key = "/box/apps/app_name/releases/20140725203539/app/models/user.rb"
39
+ # the code takes config.root expands and adds a '/' for the final path in roots
40
+ # note to get regex to work for changing deploy directories it must be double escaped in double quotes or use single qoutes
41
+ roots = ['/box/apps/app_name/releases/\d+/', '/full/remote_app/path/']
42
+
43
+ assert_equal "/full/remote_app/path/app/models/user.rb", Coverband::Reporters::Base.filename_from_key(key, roots)
44
+ end
45
+
46
+ test "filename_from_key leave filename from a key with a local path" do
47
+ Coverband.configure do |config|
48
+ config.reporter = 'std_out'
49
+ config.root = '/full/remote_app/path'
50
+ end
51
+
52
+ key = "/full/remote_app/path/is/a/path.rb"
53
+ #the code takes config.root expands and adds a '/' for the final path in roots
54
+ roots = ["/app/", '/full/remote_app/path/']
55
+
56
+ assert_equal "/full/remote_app/path/is/a/path.rb", Coverband::Reporters::Base.filename_from_key(key, roots)
57
+ end
58
+
59
+ test "line_hash gets correct hash entry for a line key" do
60
+ @fake_redis = fake_redis
61
+ store = Coverband::Adapters::RedisStore.new(@fake_redis, array: true)
62
+
63
+ Coverband.configure do |config|
64
+ config.redis = @fake_redis
65
+ config.reporter = 'std_out'
66
+ config.root = '/full/remote_app/path'
67
+ end
68
+
69
+ key = "/full/remote_app/path/is/a/path.rb"
70
+ #the code takes config.root expands and adds a '/'
71
+ roots = ["/app/", '/full/remote_app/path/']
72
+
73
+ lines_hit = ['1','3','6']
74
+ @fake_redis.stubs(:smembers).returns(lines_hit)
75
+ #expects to show hit counts on 1,3,6
76
+ expected = {"/full/remote_app/path/is/a/path.rb" => [1,nil,1,nil,nil,1]}
77
+ File.stubs(:exists?).returns(true)
78
+ File.stubs(:foreach).returns(['line 1','line2','line3','line4','line5','line6'])
79
+
80
+ assert_equal expected, Coverband::Reporters::Base.line_hash(store, key, roots)
81
+ end
82
+
83
+ test "line_hash adjusts relative paths" do
84
+ @fake_redis = fake_redis
85
+ store = Coverband::Adapters::RedisStore.new(@fake_redis, array: true)
86
+
87
+ Coverband.configure do |config|
88
+ config.redis = @fake_redis
89
+ config.reporter = 'std_out'
90
+ config.root = '/full/remote_app/path'
91
+ end
92
+
93
+ key = "./is/a/path.rb"
94
+ #the code takes config.root expands and adds a '/'
95
+ roots = ["/app/", '/full/remote_app/path/']
96
+
97
+ lines_hit = ['1','3','6']
98
+ @fake_redis.stubs(:smembers).returns(lines_hit)
99
+ #expects to show hit counts on 1,3,6
100
+ expected = {"/full/remote_app/path/is/a/path.rb" => [1,nil,1,nil,nil,1]}
101
+ File.stubs(:exists?).returns(true)
102
+ File.stubs(:foreach).returns(['line 1','line2','line3','line4','line5','line6'])
103
+
104
+ assert_equal expected, Coverband::Reporters::Base.line_hash(store, key, roots)
105
+ end
106
+
107
+ test "#merge_arrays basic merge preserves order and counts" do
108
+ first = [0,0,1,0,1]
109
+ second = [nil,0,1,0,0]
110
+ expects = [0,0,2,0,1]
111
+
112
+ assert_equal expects, Coverband::Reporters::Base.merge_arrays(first, second)
113
+ end
114
+
115
+ test "#merge_arrays basic merge preserves order and counts different lengths" do
116
+ first = [0,0,1,0,1]
117
+ second = [nil,0,1,0,0,0,0,1]
118
+ expects = [0,0,2,0,1,0,0,1]
119
+
120
+ assert_equal expects, Coverband::Reporters::Base.merge_arrays(first, second)
121
+ end
122
+
123
+ test "#merge_existing_coverage basic merge preserves order and counts different lengths" do
124
+ first = {"file.rb" => [0,1,2,nil,nil,nil]}
125
+ second = {"file.rb" => [0,1,2,nil,0,1,2]}
126
+ expects = {"file.rb" => [0,2,4,nil,0,1,2]}
127
+
128
+ assert_equal expects, Coverband::Reporters::Base.merge_existing_coverage(first, second)
129
+ end
130
+
131
+ test "#merge_existing_coverage mismatched" do
132
+ first = {"file.rb" => [0,1,2,nil,nil,nil]}
133
+ second = {"diff.rb" => [0,1,2,nil,0,1,2]}
134
+ expects = {"file.rb" => [0,1,2,nil,nil,nil],
135
+ "diff.rb" => [0,1,2,nil,0,1,2]}
136
+
137
+ assert_equal expects, Coverband::Reporters::Base.merge_existing_coverage(first, second)
138
+ end
139
+
140
+ end