rubocop-minitest 0.11.1 → 0.12.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/.circleci/config.yml +0 -3
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +10 -0
- data/config/default.yml +5 -0
- data/docs/antora.yml +1 -1
- data/docs/modules/ROOT/pages/cops.adoc +1 -0
- data/docs/modules/ROOT/pages/cops_minitest.adoc +32 -0
- data/lib/rubocop/cop/minitest/assert_empty.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_empty_literal.rb +4 -9
- data/lib/rubocop/cop/minitest/assert_equal.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_in_delta.rb +2 -1
- data/lib/rubocop/cop/minitest/assert_includes.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_instance_of.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_kind_of.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_match.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_nil.rb +4 -11
- data/lib/rubocop/cop/minitest/assert_output.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_path_exists.rb +5 -12
- data/lib/rubocop/cop/minitest/assert_respond_to.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_silent.rb +8 -6
- data/lib/rubocop/cop/minitest/assert_truthy.rb +4 -11
- data/lib/rubocop/cop/minitest/assert_with_expected_argument.rb +1 -1
- data/lib/rubocop/cop/minitest/assertion_in_lifecycle_hook.rb +1 -1
- data/lib/rubocop/cop/minitest/global_expectations.rb +4 -7
- data/lib/rubocop/cop/minitest/literal_as_actual_argument.rb +14 -14
- data/lib/rubocop/cop/minitest/multiple_assertions.rb +2 -2
- data/lib/rubocop/cop/minitest/no_assertions.rb +48 -0
- data/lib/rubocop/cop/minitest/refute_empty.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_equal.rb +5 -7
- data/lib/rubocop/cop/minitest/refute_false.rb +14 -22
- data/lib/rubocop/cop/minitest/refute_in_delta.rb +2 -1
- data/lib/rubocop/cop/minitest/refute_includes.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_instance_of.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_kind_of.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_match.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_nil.rb +3 -8
- data/lib/rubocop/cop/minitest/refute_path_exists.rb +5 -12
- data/lib/rubocop/cop/minitest/refute_respond_to.rb +1 -1
- data/lib/rubocop/cop/minitest/test_method_name.rb +8 -7
- data/lib/rubocop/cop/minitest/unspecified_exception.rb +1 -1
- data/lib/rubocop/cop/minitest_cops.rb +1 -0
- data/lib/rubocop/cop/mixin/in_delta_mixin.rb +5 -15
- data/lib/rubocop/cop/mixin/minitest_cop_rule.rb +11 -12
- data/lib/rubocop/cop/mixin/minitest_exploration_helpers.rb +15 -4
- data/lib/rubocop/minitest/version.rb +1 -1
- data/relnotes/v0.12.0.md +10 -0
- data/rubocop-minitest.gemspec +1 -1
- data/tasks/cops_documentation.rake +9 -11
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7a721b7443b19d1ff86922a0500d12daa296622bee5dc17ddcc2bdbf943245e
|
4
|
+
data.tar.gz: 14616b62fce87850843091ed66d9f76281a31038fcbf78bc5ea99a2b38c5b7db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb0913607602b41d7c05e9ca5228b3dcecdd44ea10a7b5adcfb407b9c78801aa3f5d160dba9f2a629f95377c3d12001b68aac3b08cd3f44fa708255247989c71
|
7
|
+
data.tar.gz: 56a97c8ff0938d66b565b3578c5c698c85188bc7130fcf3ac7955df466b5c48a0abbed8ace45af2ea2c66aaa1f2635aaad6fb02de1f294da4a710e983aec1b94
|
data/.circleci/config.yml
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## master (unreleased)
|
4
4
|
|
5
|
+
## 0.12.0 (2021-04-23)
|
6
|
+
|
7
|
+
### New features
|
8
|
+
|
9
|
+
* [#124](https://github.com/rubocop/rubocop-minitest/pull/124): Add new `Minitest/NoAssertions` cop. ([@ghiculescu][])
|
10
|
+
|
11
|
+
### Changes
|
12
|
+
|
13
|
+
* [#129](https://github.com/rubocop/rubocop-minitest/pull/129): Drop Ruby 2.4 support. ([@koic][])
|
14
|
+
|
5
15
|
## 0.11.1 (2021-03-31)
|
6
16
|
|
7
17
|
### Changes
|
data/config/default.yml
CHANGED
@@ -118,6 +118,11 @@ Minitest/MultipleAssertions:
|
|
118
118
|
VersionAdded: '0.10'
|
119
119
|
Max: 3
|
120
120
|
|
121
|
+
Minitest/NoAssertions:
|
122
|
+
Description: 'This cop checks for at least one assertion (or flunk) in tests.'
|
123
|
+
Enabled: false
|
124
|
+
VersionAdded: '0.12'
|
125
|
+
|
121
126
|
Minitest/RefuteEmpty:
|
122
127
|
Description: 'This cop enforces to use `refute_empty` instead of using `refute(object.empty?)`.'
|
123
128
|
StyleGuide: 'https://minitest.rubystyle.guide#refute-empty'
|
data/docs/antora.yml
CHANGED
@@ -32,6 +32,7 @@ based on the https://minitest.rubystyle.guide/[Minitest Style Guide].
|
|
32
32
|
* xref:cops_minitest.adoc#minitestglobalexpectations[Minitest/GlobalExpectations]
|
33
33
|
* xref:cops_minitest.adoc#minitestliteralasactualargument[Minitest/LiteralAsActualArgument]
|
34
34
|
* xref:cops_minitest.adoc#minitestmultipleassertions[Minitest/MultipleAssertions]
|
35
|
+
* xref:cops_minitest.adoc#minitestnoassertions[Minitest/NoAssertions]
|
35
36
|
* xref:cops_minitest.adoc#minitestrefuteempty[Minitest/RefuteEmpty]
|
36
37
|
* xref:cops_minitest.adoc#minitestrefuteequal[Minitest/RefuteEqual]
|
37
38
|
* xref:cops_minitest.adoc#minitestrefutefalse[Minitest/RefuteFalse]
|
@@ -625,6 +625,38 @@ end
|
|
625
625
|
| Integer
|
626
626
|
|===
|
627
627
|
|
628
|
+
== Minitest/NoAssertions
|
629
|
+
|
630
|
+
|===
|
631
|
+
| Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChanged
|
632
|
+
|
633
|
+
| Disabled
|
634
|
+
| Yes
|
635
|
+
| No
|
636
|
+
| 0.12
|
637
|
+
| -
|
638
|
+
|===
|
639
|
+
|
640
|
+
This cop checks if test cases contain any assertion calls.
|
641
|
+
|
642
|
+
=== Examples
|
643
|
+
|
644
|
+
[source,ruby]
|
645
|
+
----
|
646
|
+
# bad
|
647
|
+
class FooTest < Minitest::Test
|
648
|
+
def test_the_truth
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
# good
|
653
|
+
class FooTest < Minitest::Test
|
654
|
+
def test_the_truth
|
655
|
+
assert true
|
656
|
+
end
|
657
|
+
end
|
658
|
+
----
|
659
|
+
|
628
660
|
== Minitest/RefuteEmpty
|
629
661
|
|
630
662
|
|===
|
@@ -14,8 +14,9 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# assert_empty(object)
|
16
16
|
#
|
17
|
-
class AssertEmptyLiteral <
|
17
|
+
class AssertEmptyLiteral < Base
|
18
18
|
include ArgumentRangeHelper
|
19
|
+
extend AutoCorrector
|
19
20
|
|
20
21
|
MSG = 'Prefer using `assert_empty(%<arguments>s)` over ' \
|
21
22
|
'`assert_equal(%<literal>s, %<arguments>s)`.'
|
@@ -32,15 +33,9 @@ module RuboCop
|
|
32
33
|
args = matchers.map(&:source).join(', ')
|
33
34
|
|
34
35
|
message = format(MSG, literal: literal.source, arguments: args)
|
35
|
-
add_offense(node, message: message)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
assert_equal_with_empty_literal(node) do |_literal, matchers|
|
41
|
-
object = matchers.first
|
36
|
+
add_offense(node, message: message) do |corrector|
|
37
|
+
object = matchers.first
|
42
38
|
|
43
|
-
lambda do |corrector|
|
44
39
|
corrector.replace(node.loc.selector, 'assert_empty')
|
45
40
|
corrector.replace(first_and_second_arguments_range(node), object.source)
|
46
41
|
end
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# assert_in_delta(0.2, actual)
|
16
16
|
# assert_in_delta(0.2, actual, 0.001, 'message')
|
17
17
|
#
|
18
|
-
class AssertInDelta <
|
18
|
+
class AssertInDelta < Base
|
19
19
|
include InDeltaMixin
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
RESTRICT_ON_SEND = %i[assert_equal].freeze
|
22
23
|
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# assert_includes(collection, object)
|
16
16
|
# assert_includes(collection, object, 'message')
|
17
17
|
#
|
18
|
-
class AssertIncludes <
|
18
|
+
class AssertIncludes < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :assert, target_method: :include?, preferred_method: :assert_includes
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# assert_instance_of(Class, object)
|
16
16
|
# assert_instance_of(Class, object, 'message')
|
17
17
|
#
|
18
|
-
class AssertInstanceOf <
|
18
|
+
class AssertInstanceOf < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :assert, target_method: :instance_of?, inverse: true
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# assert_nil(actual)
|
16
16
|
# assert_nil(actual, 'message')
|
17
17
|
#
|
18
|
-
class AssertNil <
|
18
|
+
class AssertNil < Base
|
19
19
|
include ArgumentRangeHelper
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = 'Prefer using `assert_nil(%<arguments>s)` over ' \
|
22
23
|
'`assert_equal(nil, %<arguments>s)`.'
|
@@ -32,17 +33,9 @@ module RuboCop
|
|
32
33
|
|
33
34
|
arguments = [actual.source, message&.source].compact.join(', ')
|
34
35
|
|
35
|
-
add_offense(node, message: format(MSG, arguments: arguments))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
lambda do |corrector|
|
41
|
-
assert_equal_with_nil(node) do |actual|
|
36
|
+
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
|
42
37
|
corrector.replace(node.loc.selector, 'assert_nil')
|
43
|
-
corrector.replace(
|
44
|
-
first_and_second_arguments_range(node), actual.source
|
45
|
-
)
|
38
|
+
corrector.replace(first_and_second_arguments_range(node), actual.source)
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -15,7 +15,9 @@ module RuboCop
|
|
15
15
|
# assert_path_exists(path)
|
16
16
|
# assert_path_exists(path, 'message')
|
17
17
|
#
|
18
|
-
class AssertPathExists <
|
18
|
+
class AssertPathExists < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
19
21
|
MSG = 'Prefer using `%<good_method>s` over `%<bad_method>s`.'
|
20
22
|
RESTRICT_ON_SEND = %i[assert].freeze
|
21
23
|
|
@@ -32,17 +34,8 @@ module RuboCop
|
|
32
34
|
good_method = build_good_method(path, failure_message)
|
33
35
|
message = format(MSG, good_method: good_method, bad_method: node.source)
|
34
36
|
|
35
|
-
add_offense(node, message: message)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
assert_file_exists(node) do |path, failure_message|
|
41
|
-
failure_message = failure_message.first
|
42
|
-
|
43
|
-
lambda do |corrector|
|
44
|
-
replacement = build_good_method(path, failure_message)
|
45
|
-
corrector.replace(node, replacement)
|
37
|
+
add_offense(node, message: message) do |corrector|
|
38
|
+
corrector.replace(node, good_method)
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
# assert_respond_to(object, :do_something, 'message')
|
18
18
|
# assert_respond_to(self, :do_something)
|
19
19
|
#
|
20
|
-
class AssertRespondTo <
|
20
|
+
class AssertRespondTo < Base
|
21
21
|
extend MinitestCopRule
|
22
22
|
|
23
23
|
define_rule :assert, target_method: :respond_to?
|
@@ -13,7 +13,9 @@ module RuboCop
|
|
13
13
|
# # good
|
14
14
|
# assert_silent { puts object.do_something }
|
15
15
|
#
|
16
|
-
class AssertSilent <
|
16
|
+
class AssertSilent < Base
|
17
|
+
extend AutoCorrector
|
18
|
+
|
17
19
|
MSG = 'Prefer using `assert_silent` over `assert_output("", "")`.'
|
18
20
|
|
19
21
|
def_node_matcher :assert_silent_candidate?, <<~PATTERN
|
@@ -25,12 +27,12 @@ module RuboCop
|
|
25
27
|
PATTERN
|
26
28
|
|
27
29
|
def on_block(node)
|
28
|
-
|
29
|
-
|
30
|
+
return unless assert_silent_candidate?(node)
|
31
|
+
|
32
|
+
send_node = node.send_node
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
corrector.replace(node, 'assert_silent')
|
34
|
+
add_offense(send_node) do |corrector|
|
35
|
+
corrector.replace(send_node, 'assert_silent')
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# assert(actual)
|
16
16
|
# assert(actual, 'message')
|
17
17
|
#
|
18
|
-
class AssertTruthy <
|
18
|
+
class AssertTruthy < Base
|
19
19
|
include ArgumentRangeHelper
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = 'Prefer using `assert(%<arguments>s)` over ' \
|
22
23
|
'`assert_equal(true, %<arguments>s)`.'
|
@@ -32,17 +33,9 @@ module RuboCop
|
|
32
33
|
|
33
34
|
arguments = [actual.source, message&.source].compact.join(', ')
|
34
35
|
|
35
|
-
add_offense(node, message: format(MSG, arguments: arguments))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
lambda do |corrector|
|
41
|
-
assert_equal_with_truthy(node) do |actual|
|
36
|
+
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
|
42
37
|
corrector.replace(node.loc.selector, 'assert')
|
43
|
-
corrector.replace(
|
44
|
-
first_and_second_arguments_range(node), actual.source
|
45
|
-
)
|
38
|
+
corrector.replace(first_and_second_arguments_range(node), actual.source)
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
# assert_equal(expected, actual)
|
20
20
|
# assert(foo, 'message')
|
21
21
|
#
|
22
|
-
class AssertWithExpectedArgument <
|
22
|
+
class AssertWithExpectedArgument < Base
|
23
23
|
MSG = 'Did you mean to use `assert_equal(%<arguments>s)`?'
|
24
24
|
RESTRICT_ON_SEND = %i[assert].freeze
|
25
25
|
|
@@ -16,7 +16,9 @@ module RuboCop
|
|
16
16
|
# _(musts).must_equal expected_musts
|
17
17
|
# _(wonts).wont_match expected_wonts
|
18
18
|
# _ { musts }.must_raise TypeError
|
19
|
-
class GlobalExpectations <
|
19
|
+
class GlobalExpectations < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG = 'Use `%<preferred>s` instead.'
|
21
23
|
|
22
24
|
VALUE_MATCHERS = %i[
|
@@ -64,13 +66,8 @@ module RuboCop
|
|
64
66
|
return unless value_global_expectation?(node) || block_global_expectation?(node)
|
65
67
|
|
66
68
|
message = format(MSG, preferred: preferred_receiver(node))
|
67
|
-
add_offense(node, location: node.receiver.source_range, message: message)
|
68
|
-
end
|
69
|
-
|
70
|
-
def autocorrect(node)
|
71
|
-
return unless value_global_expectation?(node) || block_global_expectation?(node)
|
72
69
|
|
73
|
-
|
70
|
+
add_offense(node.receiver.source_range, message: message) do |corrector|
|
74
71
|
receiver = node.receiver.source_range
|
75
72
|
|
76
73
|
if BLOCK_MATCHERS.include?(node.method_name)
|
@@ -17,8 +17,9 @@ module RuboCop
|
|
17
17
|
# assert_equal [1, 2], foo
|
18
18
|
# assert_equal [1, 2], foo, 'message'
|
19
19
|
#
|
20
|
-
class LiteralAsActualArgument <
|
20
|
+
class LiteralAsActualArgument < Base
|
21
21
|
include ArgumentRangeHelper
|
22
|
+
extend AutoCorrector
|
22
23
|
|
23
24
|
MSG = 'Replace the literal with the first argument.'
|
24
25
|
RESTRICT_ON_SEND = %i[assert_equal].freeze
|
@@ -27,25 +28,24 @@ module RuboCop
|
|
27
28
|
return unless node.method?(:assert_equal)
|
28
29
|
|
29
30
|
actual = node.arguments[1]
|
30
|
-
return unless actual
|
31
|
+
return unless actual&.recursive_basic_literal?
|
31
32
|
|
32
|
-
add_offense(
|
33
|
+
add_offense(all_arguments_range(node)) do |corrector|
|
34
|
+
autocorrect(corrector, node)
|
35
|
+
end
|
33
36
|
end
|
34
37
|
|
35
|
-
def autocorrect(node)
|
38
|
+
def autocorrect(corrector, node)
|
36
39
|
expected, actual, message = *node.arguments
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
arguments = [new_actual_source, expected.source, message&.source].compact.join(', ')
|
41
|
+
new_actual_source = if actual.hash_type? && !actual.braces?
|
42
|
+
"{#{actual.source}}"
|
43
|
+
else
|
44
|
+
actual.source
|
45
|
+
end
|
46
|
+
arguments = [new_actual_source, expected.source, message&.source].compact.join(', ')
|
46
47
|
|
47
|
-
|
48
|
-
end
|
48
|
+
corrector.replace(node, "assert_equal(#{arguments})")
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
26
26
|
# end
|
27
27
|
# end
|
28
28
|
#
|
29
|
-
class MultipleAssertions <
|
29
|
+
class MultipleAssertions < Base
|
30
30
|
include ConfigurableMax
|
31
31
|
include MinitestExplorationHelpers
|
32
32
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
self.max = assertions_count
|
44
44
|
|
45
45
|
message = format(MSG, total: assertions_count, max: max_assertions)
|
46
|
-
add_offense(node
|
46
|
+
add_offense(node.loc.name, message: message)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Minitest
|
6
|
+
# This cop checks if test cases contain any assertion calls.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# class FooTest < Minitest::Test
|
11
|
+
# def test_the_truth
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# class FooTest < Minitest::Test
|
17
|
+
# def test_the_truth
|
18
|
+
# assert true
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
class NoAssertions < Base
|
23
|
+
include MinitestExplorationHelpers
|
24
|
+
|
25
|
+
MSG = 'Test case has no assertions.'
|
26
|
+
|
27
|
+
def on_class(class_node)
|
28
|
+
return unless test_class?(class_node)
|
29
|
+
|
30
|
+
test_cases(class_node).each do |node|
|
31
|
+
assertions_count = assertions_count(node)
|
32
|
+
|
33
|
+
next if assertions_count.positive?
|
34
|
+
|
35
|
+
add_offense(node.block_type? ? node.loc.expression : node.loc.name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def assertions_count(node)
|
42
|
+
base = assertion?(node) ? 1 : 0
|
43
|
+
base + node.each_child_node.sum { |c| assertions_count(c) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -14,8 +14,9 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# refute_equal("rubocop-minitest", actual)
|
16
16
|
#
|
17
|
-
class RefuteEqual <
|
17
|
+
class RefuteEqual < Base
|
18
18
|
include ArgumentRangeHelper
|
19
|
+
extend AutoCorrector
|
19
20
|
|
20
21
|
MSG = 'Prefer using `refute_equal(%<preferred>s)` over ' \
|
21
22
|
'`assert(%<over>s)`.'
|
@@ -29,13 +30,10 @@ module RuboCop
|
|
29
30
|
preferred, over = process_not_equal(node)
|
30
31
|
return unless preferred && over
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
33
|
+
assert_not_equal(node) do |_, expected, actual|
|
34
|
+
message = format(MSG, preferred: preferred, over: over)
|
35
35
|
|
36
|
-
|
37
|
-
lambda do |corrector|
|
38
|
-
assert_not_equal(node) do |_, expected, actual|
|
36
|
+
add_offense(node, message: message) do |corrector|
|
39
37
|
corrector.replace(node.loc.selector, 'refute_equal')
|
40
38
|
|
41
39
|
replacement = [expected, actual].map(&:source).join(', ')
|
@@ -18,8 +18,9 @@ module RuboCop
|
|
18
18
|
# refute(actual)
|
19
19
|
# refute(actual, 'message')
|
20
20
|
#
|
21
|
-
class RefuteFalse <
|
21
|
+
class RefuteFalse < Base
|
22
22
|
include ArgumentRangeHelper
|
23
|
+
extend AutoCorrector
|
23
24
|
|
24
25
|
MSG_FOR_ASSERT_EQUAL = 'Prefer using `refute(%<arguments>s)` over ' \
|
25
26
|
'`assert_equal(false, %<arguments>s)`.'
|
@@ -36,38 +37,29 @@ module RuboCop
|
|
36
37
|
PATTERN
|
37
38
|
|
38
39
|
def on_send(node)
|
39
|
-
actual, rest_receiver_arg = assert_equal_with_false(node) ||
|
40
|
-
assert_with_bang_argument(node)
|
40
|
+
actual, rest_receiver_arg = assert_equal_with_false(node) || assert_with_bang_argument(node)
|
41
41
|
return unless actual
|
42
42
|
|
43
43
|
message_argument = rest_receiver_arg.first
|
44
44
|
|
45
45
|
arguments = [actual.source, message_argument&.source].compact.join(', ')
|
46
46
|
|
47
|
-
message =
|
48
|
-
MSG_FOR_ASSERT_EQUAL
|
49
|
-
else
|
50
|
-
MSG_FOR_ASSERT
|
51
|
-
end
|
47
|
+
message = node.method?(:assert_equal) ? MSG_FOR_ASSERT_EQUAL : MSG_FOR_ASSERT
|
52
48
|
|
53
|
-
add_offense(node, message: format(message, arguments: arguments))
|
49
|
+
add_offense(node, message: format(message, arguments: arguments)) do |corrector|
|
50
|
+
autocorrect(corrector, node, actual)
|
51
|
+
end
|
54
52
|
end
|
55
53
|
|
56
|
-
|
57
|
-
lambda do |corrector|
|
58
|
-
corrector.replace(node.loc.selector, 'refute')
|
54
|
+
private
|
59
55
|
|
60
|
-
|
61
|
-
|
62
|
-
first_and_second_arguments_range(node), actual.source
|
63
|
-
)
|
64
|
-
end
|
56
|
+
def autocorrect(corrector, node, actual)
|
57
|
+
corrector.replace(node.loc.selector, 'refute')
|
65
58
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
59
|
+
if node.method?(:assert_equal)
|
60
|
+
corrector.replace(first_and_second_arguments_range(node), actual.source)
|
61
|
+
else
|
62
|
+
corrector.replace(first_argument_range(node), actual.source)
|
71
63
|
end
|
72
64
|
end
|
73
65
|
end
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# refute_in_delta(0.2, actual)
|
16
16
|
# refute_in_delta(0.2, actual, 0.001, 'message')
|
17
17
|
#
|
18
|
-
class RefuteInDelta <
|
18
|
+
class RefuteInDelta < Base
|
19
19
|
include InDeltaMixin
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
RESTRICT_ON_SEND = %i[refute_equal].freeze
|
22
23
|
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# refute_includes(collection, object)
|
16
16
|
# refute_includes(collection, object, 'message')
|
17
17
|
#
|
18
|
-
class RefuteIncludes <
|
18
|
+
class RefuteIncludes < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :refute, target_method: :include?, preferred_method: :refute_includes
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# refute_instance_of(Class, object)
|
16
16
|
# refute_instance_of(Class, object, 'message')
|
17
17
|
#
|
18
|
-
class RefuteInstanceOf <
|
18
|
+
class RefuteInstanceOf < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :refute, target_method: :instance_of?, inverse: true
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# refute_nil(actual)
|
16
16
|
# refute_nil(actual, 'message')
|
17
17
|
#
|
18
|
-
class RefuteNil <
|
18
|
+
class RefuteNil < Base
|
19
19
|
include ArgumentRangeHelper
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = 'Prefer using `refute_nil(%<arguments>s)` over ' \
|
22
23
|
'`refute_equal(nil, %<arguments>s)`.'
|
@@ -32,13 +33,7 @@ module RuboCop
|
|
32
33
|
|
33
34
|
arguments = [actual.source, message&.source].compact.join(', ')
|
34
35
|
|
35
|
-
add_offense(node, message: format(MSG, arguments: arguments))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
lambda do |corrector|
|
41
|
-
refute_equal_with_nil(node) do |actual|
|
36
|
+
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
|
42
37
|
corrector.replace(node.loc.selector, 'refute_nil')
|
43
38
|
corrector.replace(
|
44
39
|
first_and_second_arguments_range(node), actual.source
|
@@ -15,7 +15,9 @@ module RuboCop
|
|
15
15
|
# refute_path_exists(path)
|
16
16
|
# refute_path_exists(path, 'message')
|
17
17
|
#
|
18
|
-
class RefutePathExists <
|
18
|
+
class RefutePathExists < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
19
21
|
MSG = 'Prefer using `%<good_method>s` over `%<bad_method>s`.'
|
20
22
|
RESTRICT_ON_SEND = %i[refute].freeze
|
21
23
|
|
@@ -32,17 +34,8 @@ module RuboCop
|
|
32
34
|
good_method = build_good_method(path, failure_message)
|
33
35
|
message = format(MSG, good_method: good_method, bad_method: node.source)
|
34
36
|
|
35
|
-
add_offense(node, message: message)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
refute_file_exists(node) do |path, failure_message|
|
41
|
-
failure_message = failure_message.first
|
42
|
-
|
43
|
-
lambda do |corrector|
|
44
|
-
replacement = build_good_method(path, failure_message)
|
45
|
-
corrector.replace(node, replacement)
|
37
|
+
add_offense(node, message: message) do |corrector|
|
38
|
+
corrector.replace(node, good_method)
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
# refute_respond_to(object, :do_something, 'message')
|
18
18
|
# refute_respond_to(self, :do_something)
|
19
19
|
#
|
20
|
-
class RefuteRespondTo <
|
20
|
+
class RefuteRespondTo < Base
|
21
21
|
extend MinitestCopRule
|
22
22
|
|
23
23
|
define_rule :refute, target_method: :respond_to?
|
@@ -27,9 +27,10 @@ module RuboCop
|
|
27
27
|
# end
|
28
28
|
# end
|
29
29
|
#
|
30
|
-
class TestMethodName <
|
30
|
+
class TestMethodName < Base
|
31
31
|
include MinitestExplorationHelpers
|
32
32
|
include DefNode
|
33
|
+
extend AutoCorrector
|
33
34
|
|
34
35
|
MSG = 'Test method name should start with `test_` prefix.'
|
35
36
|
|
@@ -37,13 +38,13 @@ module RuboCop
|
|
37
38
|
return unless test_class?(class_node)
|
38
39
|
|
39
40
|
class_elements(class_node).each do |node|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
next unless offense?(node)
|
42
|
+
|
43
|
+
test_method_name = node.loc.name
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
add_offense(test_method_name) do |corrector|
|
46
|
+
corrector.replace(test_method_name, "test_#{node.method_name}")
|
47
|
+
end
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# assert_raises(FooException) { raise FooException }
|
15
15
|
# assert_raises(FooException, 'This should have raised') { raise FooException }
|
16
16
|
#
|
17
|
-
class UnspecifiedException <
|
17
|
+
class UnspecifiedException < Base
|
18
18
|
MSG = 'Specify the exception being captured.'
|
19
19
|
|
20
20
|
def on_block(block_node)
|
@@ -23,6 +23,7 @@ require_relative 'minitest/assert_truthy'
|
|
23
23
|
require_relative 'minitest/global_expectations'
|
24
24
|
require_relative 'minitest/literal_as_actual_argument'
|
25
25
|
require_relative 'minitest/multiple_assertions'
|
26
|
+
require_relative 'minitest/no_assertions'
|
26
27
|
require_relative 'minitest/refute_empty'
|
27
28
|
require_relative 'minitest/refute_false'
|
28
29
|
require_relative 'minitest/refute_equal'
|
@@ -9,24 +9,14 @@ module RuboCop
|
|
9
9
|
def on_send(node)
|
10
10
|
equal_floats_call(node) do |expected, actual, message|
|
11
11
|
message = message.first
|
12
|
+
good_method = build_good_method(expected, actual, message)
|
12
13
|
|
13
14
|
if expected.float_type? || actual.float_type?
|
14
|
-
message = format(MSG,
|
15
|
-
good_method: build_good_method(expected, actual, message),
|
16
|
-
bad_method: node.source)
|
15
|
+
message = format(MSG, good_method: good_method, bad_method: node.source)
|
17
16
|
|
18
|
-
add_offense(node, message: message)
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def autocorrect(node)
|
24
|
-
equal_floats_call(node) do |expected, actual, message|
|
25
|
-
message = message.first
|
26
|
-
replacement = build_good_method(expected, actual, message)
|
27
|
-
|
28
|
-
lambda do |corrector|
|
29
|
-
corrector.replace(node, replacement)
|
17
|
+
add_offense(node, message: message) do |corrector|
|
18
|
+
corrector.replace(node, good_method)
|
19
|
+
end
|
30
20
|
end
|
31
21
|
end
|
32
22
|
end
|
@@ -26,6 +26,7 @@ module RuboCop
|
|
26
26
|
|
27
27
|
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
28
28
|
include ArgumentRangeHelper
|
29
|
+
extend AutoCorrector
|
29
30
|
|
30
31
|
MSG = 'Prefer using `#{preferred_method}(%<new_arguments>s)` over ' \
|
31
32
|
'`#{assertion_method}(%<original_arguments>s)`.'
|
@@ -36,23 +37,21 @@ module RuboCop
|
|
36
37
|
return unless (arguments = peel_redundant_parentheses_from(node.arguments))
|
37
38
|
return unless arguments.first.respond_to?(:method?) && arguments.first.method?(:#{target_method})
|
38
39
|
|
39
|
-
add_offense(node, message: offense_message(arguments))
|
40
|
+
add_offense(node, message: offense_message(arguments)) do |corrector|
|
41
|
+
autocorrect(corrector, node, arguments)
|
42
|
+
end
|
40
43
|
end
|
41
44
|
|
42
|
-
def autocorrect(node)
|
43
|
-
|
44
|
-
corrector.replace(node.loc.selector, '#{preferred_method}')
|
45
|
-
|
46
|
-
arguments = peel_redundant_parentheses_from(node.arguments)
|
45
|
+
def autocorrect(corrector, node, arguments)
|
46
|
+
corrector.replace(node.loc.selector, '#{preferred_method}')
|
47
47
|
|
48
|
-
|
48
|
+
new_arguments = new_arguments(arguments).join(', ')
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
corrector.replace(first_argument_range(node), new_arguments)
|
50
|
+
if enclosed_in_redundant_parentheses?(node)
|
51
|
+
new_arguments = '(' + new_arguments + ')'
|
55
52
|
end
|
53
|
+
|
54
|
+
corrector.replace(first_argument_range(node), new_arguments)
|
56
55
|
end
|
57
56
|
|
58
57
|
private
|
@@ -19,6 +19,8 @@ module RuboCop
|
|
19
19
|
refute_respond_to refute_same
|
20
20
|
].freeze
|
21
21
|
|
22
|
+
FLUNK = 'flunk'
|
23
|
+
|
22
24
|
LIFECYCLE_HOOK_METHODS = %i[
|
23
25
|
before_setup
|
24
26
|
setup
|
@@ -42,8 +44,8 @@ module RuboCop
|
|
42
44
|
end
|
43
45
|
|
44
46
|
def test_cases(class_node)
|
45
|
-
class_def_nodes(class_node)
|
46
|
-
|
47
|
+
(class_def_nodes(class_node).select { |def_node| test_case_name?(def_node.method_name) }) +
|
48
|
+
test_method_calls(class_node)
|
47
49
|
end
|
48
50
|
|
49
51
|
def lifecycle_hooks(class_node)
|
@@ -62,6 +64,12 @@ module RuboCop
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
67
|
+
# support https://api.rubyonrails.org/classes/ActiveSupport/Testing/Declarative.html
|
68
|
+
def test_method_calls(class_node)
|
69
|
+
block_nodes = class_node.each_descendant(:block)
|
70
|
+
block_nodes.select { |block_node| block_node.method?(:test) }
|
71
|
+
end
|
72
|
+
|
65
73
|
def test_case_name?(name)
|
66
74
|
name.to_s.start_with?('test_')
|
67
75
|
end
|
@@ -82,11 +90,14 @@ module RuboCop
|
|
82
90
|
|
83
91
|
def assertion?(node)
|
84
92
|
node.send_type? &&
|
85
|
-
ASSERTION_PREFIXES.any?
|
93
|
+
ASSERTION_PREFIXES.any? do |prefix|
|
94
|
+
method_name = node.method_name.to_s
|
95
|
+
method_name == FLUNK || method_name.start_with?(prefix)
|
96
|
+
end
|
86
97
|
end
|
87
98
|
|
88
99
|
def assertion_method?(method_name)
|
89
|
-
ASSERTION_METHODS.include?(method_name)
|
100
|
+
method_name == FLUNK || ASSERTION_METHODS.include?(method_name)
|
90
101
|
end
|
91
102
|
|
92
103
|
def lifecycle_hook_method?(node)
|
data/relnotes/v0.12.0.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
### New features
|
2
|
+
|
3
|
+
* [#124](https://github.com/rubocop/rubocop-minitest/pull/124): Add new `Minitest/NoAssertions` cop. ([@ghiculescu][])
|
4
|
+
|
5
|
+
### Changes
|
6
|
+
|
7
|
+
* [#129](https://github.com/rubocop/rubocop-minitest/pull/129): Drop Ruby 2.4 support. ([@koic][])
|
8
|
+
|
9
|
+
[@ghiculescu]: https://github.com/ghiculescu
|
10
|
+
[@koic]: https://github.com/koic
|
data/rubocop-minitest.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
DESCRIPTION
|
17
17
|
spec.license = 'MIT'
|
18
18
|
|
19
|
-
spec.required_ruby_version = '>= 2.
|
19
|
+
spec.required_ruby_version = '>= 2.5.0'
|
20
20
|
spec.metadata = {
|
21
21
|
'homepage_uri' => 'https://docs.rubocop.org/rubocop-minitest/',
|
22
22
|
'changelog_uri' => 'https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md',
|
@@ -46,17 +46,15 @@ task documentation_syntax_check: :yard_for_generate_documentation do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
examples.to_a.each do |example|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
ok = false
|
59
|
-
end
|
49
|
+
buffer = Parser::Source::Buffer.new('<code>', 1)
|
50
|
+
buffer.source = example.text
|
51
|
+
parser = Parser::Ruby25.new(RuboCop::AST::Builder.new)
|
52
|
+
parser.diagnostics.all_errors_are_fatal = true
|
53
|
+
parser.parse(buffer)
|
54
|
+
rescue Parser::SyntaxError => e
|
55
|
+
path = example.object.file
|
56
|
+
puts "#{path}: Syntax Error in an example. #{e}"
|
57
|
+
ok = false
|
60
58
|
end
|
61
59
|
end
|
62
60
|
abort unless ok
|
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.12.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: 2021-
|
13
|
+
date: 2021-04-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/rubocop/cop/minitest/global_expectations.rb
|
106
106
|
- lib/rubocop/cop/minitest/literal_as_actual_argument.rb
|
107
107
|
- lib/rubocop/cop/minitest/multiple_assertions.rb
|
108
|
+
- lib/rubocop/cop/minitest/no_assertions.rb
|
108
109
|
- lib/rubocop/cop/minitest/refute_empty.rb
|
109
110
|
- lib/rubocop/cop/minitest/refute_equal.rb
|
110
111
|
- lib/rubocop/cop/minitest/refute_false.rb
|
@@ -135,6 +136,7 @@ files:
|
|
135
136
|
- relnotes/v0.10.3.md
|
136
137
|
- relnotes/v0.11.0.md
|
137
138
|
- relnotes/v0.11.1.md
|
139
|
+
- relnotes/v0.12.0.md
|
138
140
|
- relnotes/v0.2.0.md
|
139
141
|
- relnotes/v0.2.1.md
|
140
142
|
- relnotes/v0.3.0.md
|
@@ -159,7 +161,7 @@ metadata:
|
|
159
161
|
homepage_uri: https://docs.rubocop.org/rubocop-minitest/
|
160
162
|
changelog_uri: https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md
|
161
163
|
source_code_uri: https://github.com/rubocop/rubocop-minitest
|
162
|
-
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.
|
164
|
+
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.12
|
163
165
|
bug_tracker_uri: https://github.com/rubocop/rubocop-minitest/issues
|
164
166
|
post_install_message:
|
165
167
|
rdoc_options: []
|
@@ -169,7 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
171
|
requirements:
|
170
172
|
- - ">="
|
171
173
|
- !ruby/object:Gem::Version
|
172
|
-
version: 2.
|
174
|
+
version: 2.5.0
|
173
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
176
|
requirements:
|
175
177
|
- - ">="
|