coverband 4.0.1.alpha → 4.0.1.beta

Sign up to get free protection for your applications and to get access to all the features.
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