forked from rubocop/rubocop-minitest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
multiple_assertions.rb
82 lines (69 loc) · 2.28 KB
/
multiple_assertions.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# frozen_string_literal: true
module RuboCop
module Cop
module Minitest
# Checks if test cases contain too many assertion calls. If conditional code with assertions
# is used, the branch with maximum assertions is counted.
# The maximum allowed assertion calls is configurable.
#
# @example Max: 1
# # bad
# class FooTest < Minitest::Test
# def test_asserts_twice
# assert_equal(42, do_something)
# assert_empty(array)
# end
# end
#
# # good
# class FooTest < Minitest::Test
# def test_asserts_once
# assert_equal(42, do_something)
# end
#
# def test_another_asserts_once
# assert_empty(array)
# end
# end
#
class MultipleAssertions < Base
include ConfigurableMax
include MinitestExplorationHelpers
MSG = 'Test case has too many assertions [%<total>d/%<max>d].'
def on_class(class_node)
return unless test_class?(class_node)
test_cases(class_node).each do |node|
assertions_count = assertions_count(node.body)
next unless assertions_count > max_assertions
self.max = assertions_count
message = format(MSG, total: assertions_count, max: max_assertions)
add_offense(node, message: message)
end
end
private
def assertions_count(node)
return 0 unless node.is_a?(RuboCop::AST::Node)
assertions =
case node.type
when :if, :case, :case_match
assertions_count_in_branches(node.branches)
when :rescue
assertions_count(node.body) + assertions_count_in_branches(node.branches)
when :block, :numblock
assertions_count(node.body)
else
node.each_child_node.sum { |child| assertions_count(child) }
end
assertions += 1 if assertion_method?(node)
assertions
end
def assertions_count_in_branches(branches)
branches.map { |branch| assertions_count(branch) }.max
end
def max_assertions
Integer(cop_config.fetch('Max', 3))
end
end
end
end
end