rubocop-minitest 0.26.1 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +10 -2
- data/lib/rubocop/cop/minitest/assert_truthy.rb +8 -1
- data/lib/rubocop/cop/minitest/multiple_assertions.rb +0 -6
- data/lib/rubocop/cop/minitest/no_assertions.rb +0 -7
- data/lib/rubocop/cop/minitest/non_public_test_method.rb +55 -0
- data/lib/rubocop/cop/minitest/refute_false.rb +10 -0
- data/lib/rubocop/cop/minitest/test_method_name.rb +1 -12
- data/lib/rubocop/cop/minitest/useless_assertion.rb +1 -1
- data/lib/rubocop/cop/minitest_cops.rb +1 -0
- data/lib/rubocop/cop/mixin/minitest_exploration_helpers.rb +18 -3
- data/lib/rubocop/minitest/assert_offense.rb +2 -1
- data/lib/rubocop/minitest/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e4abf180bb13a43bdb76c4c4e376c9d156dc4e48f3bce9b4171a2432bceda9b
|
4
|
+
data.tar.gz: '083ae2d51b7dafed513e7372eab667f9deea384676e0748af92d49c629ca9efe'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 562f5efee32059aa022c9a742745a89a752ad7d74f136f17b54f84a21f9d6a0030e905c8a00ab09782274f1c1544134bc6d8d6cb0d03e7e2de70b65dcb9309a3
|
7
|
+
data.tar.gz: 32d58f40bb69b87ed83ff3c342e255de7afaba760330f345d09b987ce352161577a9ee8f16677a2172cc59b48006efecb6272e71e90318281143fffe3155654b
|
data/config/default.yml
CHANGED
@@ -111,9 +111,9 @@ Minitest/AssertTruthy:
|
|
111
111
|
Description: 'This cop enforces the test to use `assert(actual)` instead of using `assert_equal(true, actual)`.'
|
112
112
|
StyleGuide: 'https://minitest.rubystyle.guide#assert-truthy'
|
113
113
|
Enabled: true
|
114
|
-
|
114
|
+
Safe: false
|
115
115
|
VersionAdded: '0.2'
|
116
|
-
VersionChanged: '0.
|
116
|
+
VersionChanged: '0.27'
|
117
117
|
|
118
118
|
Minitest/AssertWithExpectedArgument:
|
119
119
|
Description: 'This cop tries to detect when a user accidentally used `assert` when they meant to use `assert_equal`.'
|
@@ -175,6 +175,12 @@ Minitest/NoAssertions:
|
|
175
175
|
Enabled: false
|
176
176
|
VersionAdded: '0.12'
|
177
177
|
|
178
|
+
Minitest/NonPublicTestMethod:
|
179
|
+
Description: 'Detects non `public` (marked as `private` or `protected`) test methods.'
|
180
|
+
Enabled: pending
|
181
|
+
Severity: warning
|
182
|
+
VersionAdded: '0.27'
|
183
|
+
|
178
184
|
Minitest/RefuteEmpty:
|
179
185
|
Description: 'This cop enforces to use `refute_empty` instead of using `refute(object.empty?)`.'
|
180
186
|
StyleGuide: 'https://minitest.rubystyle.guide#refute-empty'
|
@@ -191,7 +197,9 @@ Minitest/RefuteFalse:
|
|
191
197
|
Description: 'Check if your test uses `refute(actual)` instead of `assert_equal(false, actual)`.'
|
192
198
|
StyleGuide: 'https://minitest.rubystyle.guide#refute-false'
|
193
199
|
Enabled: true
|
200
|
+
Safe: false
|
194
201
|
VersionAdded: '0.3'
|
202
|
+
VersionChanged: '0.27'
|
195
203
|
|
196
204
|
Minitest/RefuteInDelta:
|
197
205
|
Description: 'This cop enforces the test to use `refute_in_delta` instead of using `refute_equal` to compare floats.'
|
@@ -6,7 +6,14 @@ module RuboCop
|
|
6
6
|
# Enforces the test to use `assert(actual)` instead of using `assert_equal(true, actual)`.
|
7
7
|
#
|
8
8
|
# @safety
|
9
|
-
# This cop
|
9
|
+
# This cop is unsafe because true might be expected instead of truthy.
|
10
|
+
# False positives cannot be prevented when this is a variable or method return value.
|
11
|
+
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# assert_equal(true, 'truthy') # failure
|
15
|
+
# assert('truthy') # success
|
16
|
+
# ----
|
10
17
|
#
|
11
18
|
# @example
|
12
19
|
# # bad
|
@@ -35,13 +35,6 @@ module RuboCop
|
|
35
35
|
add_offense(node.block_type? ? node.loc.expression : node.loc.name)
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def assertions_count(node)
|
42
|
-
base = assertion_method?(node) ? 1 : 0
|
43
|
-
base + node.each_child_node.sum { |c| assertions_count(c) }
|
44
|
-
end
|
45
38
|
end
|
46
39
|
end
|
47
40
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Minitest
|
6
|
+
# Detects non `public` (marked as `private` or `protected`) test methods.
|
7
|
+
# Minitest runs only test methods which are `public`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# class FooTest
|
12
|
+
# private # or protected
|
13
|
+
# def test_does_something
|
14
|
+
# assert_equal 42, do_something
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# class FooTest
|
20
|
+
# def test_does_something
|
21
|
+
# assert_equal 42, do_something
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# # good (not a test case name)
|
26
|
+
# class FooTest
|
27
|
+
# private # or protected
|
28
|
+
# def does_something
|
29
|
+
# assert_equal 42, do_something
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # good (no assertions)
|
34
|
+
# class FooTest
|
35
|
+
# private # or protected
|
36
|
+
# def test_does_something
|
37
|
+
# do_something
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
class NonPublicTestMethod < Base
|
42
|
+
include MinitestExplorationHelpers
|
43
|
+
include DefNode
|
44
|
+
|
45
|
+
MSG = 'Non `public` test method detected. Make it `public` for it to run.'
|
46
|
+
|
47
|
+
def on_class(node)
|
48
|
+
test_cases(node, visibility_check: false).each do |test_case|
|
49
|
+
add_offense(test_case) if non_public?(test_case) && assertions(test_case).any?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -5,6 +5,16 @@ module RuboCop
|
|
5
5
|
module Minitest
|
6
6
|
# Enforces the use of `refute(object)` over `assert_equal(false, object)`.
|
7
7
|
#
|
8
|
+
# @safety
|
9
|
+
# This cop is unsafe because it cannot detect failure when second argument is `nil`.
|
10
|
+
# False positives cannot be prevented when this is a variable or method return value.
|
11
|
+
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# assert_equal(false, nil) # failure
|
15
|
+
# refute(nil) # success
|
16
|
+
# ----
|
17
|
+
#
|
8
18
|
# @example
|
9
19
|
# # bad
|
10
20
|
# assert_equal(false, actual)
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
def on_class(class_node)
|
38
38
|
return unless test_class?(class_node)
|
39
39
|
|
40
|
-
|
40
|
+
class_def_nodes(class_node).each do |node|
|
41
41
|
next unless offense?(node)
|
42
42
|
|
43
43
|
test_method_name = node.loc.name
|
@@ -50,17 +50,6 @@ module RuboCop
|
|
50
50
|
|
51
51
|
private
|
52
52
|
|
53
|
-
def class_elements(class_node)
|
54
|
-
class_def = class_node.body
|
55
|
-
return [] unless class_def
|
56
|
-
|
57
|
-
if class_def.def_type?
|
58
|
-
[class_def]
|
59
|
-
else
|
60
|
-
class_def.each_child_node(:def).to_a
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
53
|
def offense?(node)
|
65
54
|
return false if assertions(node).none?
|
66
55
|
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
|
47
47
|
case node.method_name
|
48
48
|
when *SINGLE_ASSERTION_ARGUMENT_METHODS
|
49
|
-
actual.nil? && expected&.literal?
|
49
|
+
actual.nil? && expected&.literal? && !expected.xstr_type?
|
50
50
|
when *TWO_ASSERTION_ARGUMENTS_METHODS
|
51
51
|
return false unless expected || actual
|
52
52
|
return false if expected.source != actual.source
|
@@ -33,6 +33,7 @@ require_relative 'minitest/global_expectations'
|
|
33
33
|
require_relative 'minitest/literal_as_actual_argument'
|
34
34
|
require_relative 'minitest/multiple_assertions'
|
35
35
|
require_relative 'minitest/no_assertions'
|
36
|
+
require_relative 'minitest/non_public_test_method'
|
36
37
|
require_relative 'minitest/refute_empty'
|
37
38
|
require_relative 'minitest/refute_false'
|
38
39
|
require_relative 'minitest/refute_equal'
|
@@ -7,6 +7,7 @@ module RuboCop
|
|
7
7
|
# Helper methods for different explorations against test files and test cases.
|
8
8
|
# @api private
|
9
9
|
module MinitestExplorationHelpers
|
10
|
+
include DefNode
|
10
11
|
extend NodePattern::Macros
|
11
12
|
|
12
13
|
ASSERTION_PREFIXES = %w[assert refute].freeze
|
@@ -27,14 +28,16 @@ module RuboCop
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def test_case?(node)
|
30
|
-
return false unless node&.def_type? &&
|
31
|
+
return false unless node&.def_type? && test_method?(node)
|
31
32
|
|
32
33
|
class_ancestor = node.each_ancestor(:class).first
|
33
34
|
test_class?(class_ancestor)
|
34
35
|
end
|
35
36
|
|
36
|
-
def test_cases(class_node)
|
37
|
-
test_cases = class_def_nodes(class_node).select
|
37
|
+
def test_cases(class_node, visibility_check: true)
|
38
|
+
test_cases = class_def_nodes(class_node).select do |def_node|
|
39
|
+
test_method?(def_node, visibility_check: visibility_check)
|
40
|
+
end
|
38
41
|
|
39
42
|
# Support Active Support's `test 'example' { ... }` method.
|
40
43
|
# https://api.rubyonrails.org/classes/ActiveSupport/Testing/Declarative.html
|
@@ -43,6 +46,12 @@ module RuboCop
|
|
43
46
|
test_cases + test_blocks
|
44
47
|
end
|
45
48
|
|
49
|
+
def test_method?(def_node, visibility_check: true)
|
50
|
+
return false if visibility_check && non_public?(def_node)
|
51
|
+
|
52
|
+
test_case_name?(def_node.method_name) && !def_node.arguments?
|
53
|
+
end
|
54
|
+
|
46
55
|
def lifecycle_hooks(class_node)
|
47
56
|
class_def_nodes(class_node)
|
48
57
|
.select { |def_node| lifecycle_hook_method?(def_node) }
|
@@ -77,6 +86,12 @@ module RuboCop
|
|
77
86
|
send_nodes.select { |send_node| assertion_method?(send_node) }
|
78
87
|
end
|
79
88
|
|
89
|
+
def assertions_count(node)
|
90
|
+
node.each_descendant(:send).count do |send_node|
|
91
|
+
assertion_method?(send_node)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
80
95
|
def assertion_method?(node)
|
81
96
|
return false if !node.send_type? && !node.block_type?
|
82
97
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
#
|
11
11
|
# This mixin makes it easier to specify strict offense assertions
|
12
12
|
# in a declarative and visual fashion. Just type out the code that
|
13
|
-
# should generate
|
13
|
+
# should generate an offense, annotate code by writing '^'s
|
14
14
|
# underneath each character that should be highlighted, and follow
|
15
15
|
# the carets with a string (separated by a space) that is the
|
16
16
|
# message of the offense. You can include multiple offenses in
|
@@ -77,6 +77,7 @@ module RuboCop
|
|
77
77
|
|
78
78
|
def setup
|
79
79
|
cop_name = self.class.to_s.delete_suffix('Test')
|
80
|
+
return unless RuboCop::Cop::Minitest.const_defined?(cop_name)
|
80
81
|
|
81
82
|
@cop = RuboCop::Cop::Minitest.const_get(cop_name).new
|
82
83
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-minitest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.27.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-01-
|
13
|
+
date: 2023-01-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- lib/rubocop/cop/minitest/literal_as_actual_argument.rb
|
86
86
|
- lib/rubocop/cop/minitest/multiple_assertions.rb
|
87
87
|
- lib/rubocop/cop/minitest/no_assertions.rb
|
88
|
+
- lib/rubocop/cop/minitest/non_public_test_method.rb
|
88
89
|
- lib/rubocop/cop/minitest/refute_empty.rb
|
89
90
|
- lib/rubocop/cop/minitest/refute_equal.rb
|
90
91
|
- lib/rubocop/cop/minitest/refute_false.rb
|
@@ -124,7 +125,7 @@ metadata:
|
|
124
125
|
homepage_uri: https://docs.rubocop.org/rubocop-minitest/
|
125
126
|
changelog_uri: https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md
|
126
127
|
source_code_uri: https://github.com/rubocop/rubocop-minitest
|
127
|
-
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.
|
128
|
+
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.27
|
128
129
|
bug_tracker_uri: https://github.com/rubocop/rubocop-minitest/issues
|
129
130
|
rubygems_mfa_required: 'true'
|
130
131
|
post_install_message:
|
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
143
|
- !ruby/object:Gem::Version
|
143
144
|
version: '0'
|
144
145
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
146
|
+
rubygems_version: 3.4.1
|
146
147
|
signing_key:
|
147
148
|
specification_version: 4
|
148
149
|
summary: Automatic Minitest code style checking tool.
|