coverband 1.3.1 → 1.5.0

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 (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