rubocop-minitest 0.26.1 → 0.27.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.
- 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.
|