coverband 4.0.1.alpha → 4.0.1.beta

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 (59) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.rubocop.yml +5 -15
  4. data/.travis.yml +1 -0
  5. data/LICENSE +1 -1
  6. data/LICENSE.txt +1 -1
  7. data/README.md +19 -2
  8. data/Rakefile +1 -1
  9. data/changes.md +3 -0
  10. data/coverband.gemspec +7 -4
  11. data/lib/coverband.rb +2 -3
  12. data/lib/coverband/configuration.rb +5 -1
  13. data/lib/coverband/integrations/background.rb +19 -10
  14. data/lib/coverband/reporters/html_report.rb +5 -1
  15. data/lib/coverband/reporters/web.rb +6 -59
  16. data/lib/coverband/utils/html_formatter.rb +18 -2
  17. data/lib/coverband/utils/result.rb +1 -0
  18. data/lib/coverband/utils/s3_report.rb +1 -1
  19. data/lib/coverband/utils/source_file.rb +1 -1
  20. data/lib/coverband/version.rb +1 -1
  21. data/public/application.css +37 -3
  22. data/public/application.js +50 -44
  23. data/test/fixtures/app/controllers/sample_controller.rb +10 -0
  24. data/test/fixtures/app/models/user.rb +10 -0
  25. data/test/fixtures/never.rb +2 -0
  26. data/test/fixtures/sample.rb +16 -0
  27. data/test/fixtures/skipped.rb +4 -0
  28. data/test/fixtures/skipped_and_executed.rb +8 -0
  29. data/test/fixtures/utf-8.rb +3 -0
  30. data/test/rails4_dummy/config/coverband.rb +1 -1
  31. data/test/rails4_dummy/config/routes.rb +1 -0
  32. data/test/rails5_dummy/config/coverband.rb +3 -2
  33. data/test/rails5_dummy/config/routes.rb +1 -0
  34. data/test/rails_test_helper.rb +6 -6
  35. data/test/test_helper.rb +50 -2
  36. data/test/unit/adapters_base_test.rb +2 -1
  37. data/test/unit/adapters_file_store_test.rb +2 -1
  38. data/test/unit/adapters_redis_store_test.rb +2 -1
  39. data/test/unit/background_test.rb +12 -7
  40. data/test/unit/collectors_coverage_test.rb +3 -2
  41. data/test/unit/configuration_test.rb +2 -1
  42. data/test/unit/coverband_test.rb +1 -1
  43. data/test/unit/full_stack_test.rb +1 -1
  44. data/test/unit/middleware_test.rb +2 -1
  45. data/test/unit/rack_server_checkout_test.rb +7 -8
  46. data/test/unit/rails_full_stack_test.rb +26 -10
  47. data/test/unit/reports_base_test.rb +1 -1
  48. data/test/unit/reports_console_test.rb +2 -1
  49. data/test/unit/reports_html_test.rb +2 -1
  50. data/test/unit/reports_web_test.rb +3 -2
  51. data/test/unit/utils/file_list_test.rb +54 -0
  52. data/test/unit/utils/lines_classifier_test.rb +109 -0
  53. data/test/unit/utils/result_test.rb +104 -0
  54. data/test/unit/{utils_s3_report_test.rb → utils/s3_report_test.rb} +4 -4
  55. data/test/unit/utils/source_file_line_test.rb +165 -0
  56. data/test/unit/utils/source_file_test.rb +149 -0
  57. data/views/layout.erb +10 -1
  58. metadata +65 -13
  59. data/Gemfile.rails4.lock +0 -164
@@ -2,8 +2,9 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class AdaptersBaseTest < Test::Unit::TestCase
5
+ class AdaptersBaseTest < Minitest::Test
6
6
  def setup
7
+ super
7
8
  @test_file_path = '/tmp/coverband_filestore_test_path.json'
8
9
  @store = Coverband::Adapters::FileStore.new(@test_file_path)
9
10
  mock_file_hash
@@ -2,8 +2,9 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class AdaptersFileStoreTest < Test::Unit::TestCase
5
+ class AdaptersFileStoreTest < Minitest::Test
6
6
  def setup
7
+ super
7
8
  @test_file_path = '/tmp/coverband_filestore_test_path.json'
8
9
  File.open(@test_file_path, 'w') { |f| f.write(test_data.to_json) }
9
10
  @store = Coverband::Adapters::FileStore.new(@test_file_path)
@@ -2,10 +2,11 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class RedisTest < Test::Unit::TestCase
5
+ class RedisTest < Minitest::Test
6
6
  BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
7
 
8
8
  def setup
9
+ super
9
10
  @redis = Redis.new
10
11
  @store = Coverband::Adapters::RedisStore.new(@redis)
11
12
  @store.clear!
@@ -2,23 +2,28 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class BackgroundTest < Test::Unit::TestCase
5
+ class BackgroundTest < Minitest::Test
6
6
  def setup
7
- Coverband::Collectors::Coverage.instance.reset_instance
7
+ super
8
8
  Coverband.configure do |config|
9
9
  config.store = Coverband::Adapters::RedisStore.new(Redis.new)
10
10
  config.background_reporting_enabled = true
11
+ config.background_reporting_sleep_seconds = 30
12
+ end
13
+ Coverband::Background.stop
14
+ end
15
+
16
+ class ThreadDouble
17
+ def exit
11
18
  end
12
- Coverband::Background.instance_variable_set(:@background_reporting_running, nil)
13
19
  end
14
20
 
15
21
  def test_start
16
- Thread.expects(:new).yields
22
+ Thread.expects(:new).yields.returns(ThreadDouble.new)
17
23
  Coverband::Background.expects(:loop).yields
18
-
19
24
  Coverband::Background.expects(:sleep).with(30)
20
- Coverband::Background.expects(:at_exit).yields
21
- Coverband::Collectors::Coverage.instance.expects(:report_coverage).twice
25
+ Coverband::Background.expects(:at_exit).returns(false)
26
+ Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
22
27
  2.times { Coverband::Background.start }
23
28
  end
24
29
  end
@@ -4,10 +4,11 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
  require File.expand_path('./dog', File.dirname(__FILE__))
5
5
 
6
6
  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
7
- class CollectorsCoverageTest < Test::Unit::TestCase
7
+ class CollectorsCoverageTest < Minitest::Test
8
8
  attr_accessor :coverband
9
9
 
10
10
  def setup
11
+ super
11
12
  Coverband.configure do |config|
12
13
  config.store = Coverband::Adapters::RedisStore.new(Redis.new)
13
14
  end
@@ -32,7 +33,7 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
32
33
  test 'report_coverage raises errors in tests' do
33
34
  @coverband.reset_instance
34
35
  @coverband.expects(:ready_to_report?).raises('Oh no')
35
- assert_raise RuntimeError do
36
+ assert_raises RuntimeError do
36
37
  @coverband.report_coverage
37
38
  end
38
39
  end
@@ -2,8 +2,9 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class BaseTest < Test::Unit::TestCase
5
+ class BaseTest < Minitest::Test
6
6
  def setup
7
+ super
7
8
  Coverband.configure do |config|
8
9
  config.root = Dir.pwd
9
10
  config.s3_bucket = nil
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class CoverbandTest < Test::Unit::TestCase
5
+ class CoverbandTest < Minitest::Test
6
6
 
7
7
  test 'Coverband#start kicks off background reporting if enabled and not in rack server' do
8
8
  Coverband.configuration.stubs(:background_reporting_enabled).returns(:true)
@@ -3,7 +3,7 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
  require 'rack'
5
5
 
6
- class FullStackTest < Test::Unit::TestCase
6
+ class FullStackTest < Minitest::Test
7
7
  BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
8
8
  TEST_RACK_APP = '../fake_app/basic_rack.rb'
9
9
 
@@ -3,10 +3,11 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
  require 'rack'
5
5
 
6
- class MiddlewareTest < Test::Unit::TestCase
6
+ class MiddlewareTest < Minitest::Test
7
7
  BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
8
8
 
9
9
  def setup
10
+ super
10
11
  Coverband.configure do |config|
11
12
  config.store = Coverband::Adapters::RedisStore.new(Redis.new)
12
13
  config.background_reporting_enabled = false
@@ -2,23 +2,22 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class RackServerCheckTest < Test::Unit::TestCase
6
-
5
+ class RackServerCheckTest < Minitest::Test
7
6
  test 'returns true when running in rack server' do
8
- caller_locations = ['blah/lib/rack/server.rb'].map{ |path| OpenStruct.new(path: path, label: 'foo') }
7
+ caller_locations = ['blah/lib/rack/server.rb'].map { |path| OpenStruct.new(path: path, label: 'foo') }
9
8
  Kernel.expects(:caller_locations).returns(caller_locations)
10
- assert_true(Coverband::RackServerCheck.running?)
9
+ assert(Coverband::RackServerCheck.running?)
11
10
  end
12
11
 
13
12
  test 'returns false when not running in rack server' do
14
- caller_locations = ['blah/lib/sidekiq/worker.rb'].map{ |path| OpenStruct.new(path: path, label: 'foo') }
13
+ caller_locations = ['blah/lib/sidekiq/worker.rb'].map { |path| OpenStruct.new(path: path, label: 'foo') }
15
14
  Kernel.expects(:caller_locations).returns(caller_locations)
16
- assert_false(Coverband::RackServerCheck.running?)
15
+ refute(Coverband::RackServerCheck.running?)
17
16
  end
18
17
 
19
18
  test 'returns true if running within a rails server' do
20
- caller_locations = [OpenStruct.new(path: '/lib/rails/commands/commands_tasks.rb', label: 'server')]
19
+ caller_locations = [OpenStruct.new(path: '/lib/rails/commands/commands_tasks.rb', label: 'server')]
21
20
  Kernel.expects(:caller_locations).returns(caller_locations)
22
- assert_true(Coverband::RackServerCheck.running?)
21
+ assert(Coverband::RackServerCheck.running?)
23
22
  end
24
23
  end
@@ -2,16 +2,32 @@
2
2
 
3
3
  require File.expand_path('../rails_test_helper', File.dirname(__FILE__))
4
4
 
5
- class RailsFullStackTest < ActionDispatch::IntegrationTest
5
+ class RailsFullStackTest < Minitest::Test
6
+ include Capybara::DSL
7
+ include Capybara::Minitest::Assertions
8
+
6
9
  def setup
7
- Coverband.configuration.store.clear!
10
+ super
11
+ #The normal relative directory lookup of coverband won't work for our dummy rails project
12
+ Coverband.configure("./test/rails#{Rails::VERSION::MAJOR}_dummy/config/coverband.rb")
13
+ Coverband.start
14
+ end
15
+
16
+ def teardown
17
+ super
18
+ Capybara.reset_sessions!
19
+ Capybara.use_default_driver
8
20
  end
9
21
 
10
22
  test 'this is how we do it' do
11
- get '/dummy/show'
12
- assert_response :success
13
- assert_equal 'I am no dummy', response.body
14
- assert_equal [1, 1, 1, nil, nil], Coverband.configuration.store.coverage["#{Rails.root}/app/controllers/dummy_controller.rb"]
23
+ visit '/dummy/show'
24
+ assert_content('I am no dummy')
25
+ sleep 0.2
26
+ visit '/coverage'
27
+ click_link "view coverage report"
28
+ within page.find('a', text: /dummy_controller.rb/).find(:xpath, "../..") do
29
+ assert_selector('td', text: '100.0 %')
30
+ end
15
31
  end
16
32
 
17
33
  ###
@@ -29,8 +45,8 @@ class RailsFullStackTest < ActionDispatch::IntegrationTest
29
45
 
30
46
  # warmup
31
47
  3.times do
32
- get '/dummy/show'
33
- assert_response :success
48
+ visit '/dummy/show'
49
+ assert_content('I am no dummy')
34
50
  Coverband::Collectors::Coverage.instance.report_coverage(true)
35
51
  end
36
52
 
@@ -40,8 +56,8 @@ class RailsFullStackTest < ActionDispatch::IntegrationTest
40
56
 
41
57
  MemoryProfiler.report do
42
58
  15.times do
43
- get '/dummy/show'
44
- assert_response :success
59
+ visit '/dummy/show'
60
+ assert_content('I am no dummy')
45
61
  Coverband::Collectors::Coverage.instance.report_coverage(true)
46
62
  # this is expected to retain memory across requests
47
63
  # clear it to remove the false positive from test
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class ReportsBaseTest < Test::Unit::TestCase
5
+ class ReportsBaseTest < Minitest::Test
6
6
  test 'filename_from_key fix filename from a key with a swappable path' do
7
7
  Coverband.configure do |config|
8
8
  config.reporter = 'std_out'
@@ -2,10 +2,11 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class HTMLReportTest < Test::Unit::TestCase
5
+ class HTMLReportTest < Minitest::Test
6
6
  BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
7
 
8
8
  def setup
9
+ super
9
10
  @redis = Redis.new
10
11
  @store = Coverband::Adapters::RedisStore.new(@redis)
11
12
  @store.clear!
@@ -2,10 +2,11 @@
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
- class ReportHTMLTest < Test::Unit::TestCase
5
+ class ReportHTMLTest < Minitest::Test
6
6
  BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
7
 
8
8
  def setup
9
+ super
9
10
  @redis = Redis.new
10
11
  @store = Coverband::Adapters::RedisStore.new(@redis)
11
12
  @store.clear!
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
- require 'aws-sdk'
4
+ require 'aws-sdk-s3'
5
5
  require File.expand_path('../../lib/coverband/reporters/web', File.dirname(__FILE__))
6
6
  require 'rack/test'
7
7
 
@@ -9,7 +9,7 @@ ENV['RACK_ENV'] = 'test'
9
9
 
10
10
  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.0')
11
11
  module Coverband
12
- class WebTest < Test::Unit::TestCase
12
+ class WebTest < Minitest::Test
13
13
  include Rack::Test::Methods
14
14
 
15
15
  def app
@@ -17,6 +17,7 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.0')
17
17
  end
18
18
 
19
19
  def teardown
20
+ super
20
21
  Coverband.configuration.s3_bucket = nil
21
22
  end
22
23
 
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ ####
6
+ # Thanks for all the help SimpleCov https://github.com/colszowka/simplecov-html
7
+ # initial version of test pulled into Coverband from Simplecov 12/19/2018
8
+ ####
9
+ describe Coverband::Utils::Result do
10
+ subject do
11
+ original_result = {
12
+ source_fixture('sample.rb') => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
13
+ source_fixture('app/models/user.rb') => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
14
+ source_fixture('app/controllers/sample_controller.rb') => [nil, 2, 2, 0, nil, nil, 0, nil, nil, nil]
15
+ }
16
+ Coverband::Utils::Result.new(original_result).files
17
+ end
18
+
19
+ it 'has 11 covered lines' do
20
+ assert_equal 11, subject.covered_lines
21
+ end
22
+
23
+ it 'has 3 missed lines' do
24
+ assert_equal 3, subject.missed_lines
25
+ end
26
+
27
+ it 'has 17 never lines' do
28
+ assert_equal 17, subject.never_lines
29
+ end
30
+
31
+ it 'has 14 lines of code' do
32
+ assert_equal 14, subject.lines_of_code
33
+ end
34
+
35
+ it 'has 5 skipped lines' do
36
+ assert_equal 5, subject.skipped_lines
37
+ end
38
+
39
+ it 'has the correct covered percent' do
40
+ assert_equal 78.57142857142857, subject.covered_percent
41
+ end
42
+
43
+ it 'has the correct covered percentages' do
44
+ assert_equal [50.0, 80.0, 100.0], subject.covered_percentages
45
+ end
46
+
47
+ it 'has the correct least covered file' do
48
+ assert subject.least_covered_file.match(/sample_controller.rb/)
49
+ end
50
+
51
+ it 'has the correct covered strength' do
52
+ assert_equal 0.9285714285714286, subject.covered_strength
53
+ end
54
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
+
5
+ ####
6
+ # Thanks for all the help SimpleCov https://github.com/colszowka/simplecov-html
7
+ # initial version of test pulled into Coverband from Simplecov 12/17/2018
8
+ ####
9
+ describe Coverband::Utils::LinesClassifier do
10
+ describe '#classify' do
11
+ def subject
12
+ Coverband::Utils::LinesClassifier.new
13
+ end
14
+
15
+ describe 'relevant lines' do
16
+ it 'determines code as relevant' do
17
+ classified_lines = subject.classify [
18
+ 'module Foo',
19
+ ' class Baz',
20
+ ' def Bar',
21
+ " puts 'hi'",
22
+ ' end',
23
+ ' end',
24
+ 'end'
25
+ ]
26
+
27
+ assert_equal 7, classified_lines.length
28
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::RELEVANT })
29
+ end
30
+
31
+ it 'determines invalid UTF-8 byte sequences as relevant' do
32
+ classified_lines = subject.classify [
33
+ "bytes = \"\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n\""
34
+ ]
35
+
36
+ assert_equal 1, classified_lines.length
37
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::RELEVANT })
38
+ end
39
+ end
40
+
41
+ describe 'not-relevant lines' do
42
+ it 'determines whitespace is not-relevant' do
43
+ classified_lines = subject.classify [
44
+ '',
45
+ ' ',
46
+ "\t\t"
47
+ ]
48
+
49
+ assert_equal 3, classified_lines.length
50
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::NOT_RELEVANT })
51
+ end
52
+
53
+ describe 'comments' do
54
+ it 'determines comments are not-relevant' do
55
+ classified_lines = subject.classify [
56
+ '#Comment',
57
+ ' # Leading space comment',
58
+ "\t# Leading tab comment"
59
+ ]
60
+
61
+ assert_equal 3, classified_lines.length
62
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::NOT_RELEVANT })
63
+ end
64
+
65
+ it "doesn't mistake interpolation as a comment" do
66
+ classified_lines = subject.classify [
67
+ 'puts "#{var}"'
68
+ ]
69
+
70
+ assert_equal 1, classified_lines.length
71
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::RELEVANT })
72
+ end
73
+ end
74
+
75
+ describe ':nocov: blocks' do
76
+ it 'determines :nocov: blocks are not-relevant' do
77
+ classified_lines = subject.classify [
78
+ '# :nocov:',
79
+ 'def hi',
80
+ 'end',
81
+ '# :nocov:'
82
+ ]
83
+
84
+ assert_equal 4, classified_lines.length
85
+ assert(classified_lines.all? { |line| line == Coverband::Utils::LinesClassifier::NOT_RELEVANT })
86
+ end
87
+
88
+ it 'determines all lines after a non-closing :nocov: as not-relevant' do
89
+ classified_lines = subject.classify [
90
+ '# :nocov:',
91
+ "puts 'Not relevant'",
92
+ '# :nocov:',
93
+ "puts 'Relevant again'",
94
+ "puts 'Still relevant'",
95
+ '# :nocov:',
96
+ "puts 'Not relevant till the end'",
97
+ "puts 'Ditto'"
98
+ ]
99
+
100
+ assert_equal 8, classified_lines.length
101
+
102
+ assert(classified_lines[0..2].all? { |line| line == Coverband::Utils::LinesClassifier::NOT_RELEVANT })
103
+ assert(classified_lines[3..4].all? { |line| line == Coverband::Utils::LinesClassifier::RELEVANT })
104
+ assert(classified_lines[5..7].all? { |line| line == Coverband::Utils::LinesClassifier::NOT_RELEVANT })
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end