rubocop-minitest 0.6.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +0 -3
- data/.gitattributes +1 -0
- data/.rubocop.yml +2 -1
- data/.rubocop_todo.yml +0 -7
- data/CHANGELOG.md +65 -0
- data/Gemfile +1 -1
- data/README.md +5 -1
- data/Rakefile +29 -0
- data/config/default.yml +103 -18
- data/docs/antora.yml +7 -0
- data/docs/modules/ROOT/nav.adoc +6 -0
- data/docs/modules/ROOT/pages/cops.adoc +37 -0
- data/docs/modules/ROOT/pages/cops_minitest.adoc +1014 -0
- data/docs/modules/ROOT/pages/index.adoc +5 -0
- data/docs/modules/ROOT/pages/installation.adoc +15 -0
- data/docs/modules/ROOT/pages/usage.adoc +32 -0
- data/{manual → legacy-docs}/cops.md +1 -0
- data/{manual → legacy-docs}/cops_minitest.md +64 -41
- data/{manual → legacy-docs}/index.md +0 -0
- data/{manual → legacy-docs}/installation.md +0 -0
- data/{manual → legacy-docs}/usage.md +0 -0
- data/lib/rubocop/cop/generator.rb +56 -0
- data/lib/rubocop/cop/minitest/assert_empty.rb +4 -30
- data/lib/rubocop/cop/minitest/assert_empty_literal.rb +15 -0
- data/lib/rubocop/cop/minitest/assert_equal.rb +2 -31
- data/lib/rubocop/cop/minitest/assert_in_delta.rb +27 -0
- data/lib/rubocop/cop/minitest/assert_includes.rb +4 -4
- data/lib/rubocop/cop/minitest/assert_instance_of.rb +4 -38
- data/lib/rubocop/cop/minitest/assert_kind_of.rb +25 -0
- data/lib/rubocop/cop/minitest/assert_match.rb +4 -39
- data/lib/rubocop/cop/minitest/assert_nil.rb +2 -2
- data/lib/rubocop/cop/minitest/assert_output.rb +49 -0
- data/lib/rubocop/cop/minitest/assert_path_exists.rb +58 -0
- data/lib/rubocop/cop/minitest/assert_respond_to.rb +10 -45
- data/lib/rubocop/cop/minitest/assert_silent.rb +45 -0
- data/lib/rubocop/cop/minitest/assert_truthy.rb +2 -2
- data/lib/rubocop/cop/minitest/assertion_in_lifecycle_hook.rb +43 -0
- data/lib/rubocop/cop/minitest/global_expectations.rb +95 -0
- data/lib/rubocop/cop/minitest/literal_as_actual_argument.rb +52 -0
- data/lib/rubocop/cop/minitest/multiple_assertions.rb +63 -0
- data/lib/rubocop/cop/minitest/refute_empty.rb +4 -30
- data/lib/rubocop/cop/minitest/refute_false.rb +3 -3
- data/lib/rubocop/cop/minitest/refute_in_delta.rb +27 -0
- data/lib/rubocop/cop/minitest/refute_includes.rb +4 -4
- data/lib/rubocop/cop/minitest/refute_instance_of.rb +4 -38
- data/lib/rubocop/cop/minitest/refute_kind_of.rb +25 -0
- data/lib/rubocop/cop/minitest/refute_match.rb +4 -39
- data/lib/rubocop/cop/minitest/refute_nil.rb +2 -2
- data/lib/rubocop/cop/minitest/refute_path_exists.rb +58 -0
- data/lib/rubocop/cop/minitest/refute_respond_to.rb +10 -45
- data/lib/rubocop/cop/minitest/test_method_name.rb +70 -0
- data/lib/rubocop/cop/minitest/unspecified_exception.rb +36 -0
- data/lib/rubocop/cop/minitest_cops.rb +17 -1
- data/lib/rubocop/cop/mixin/argument_range_helper.rb +10 -0
- data/lib/rubocop/cop/mixin/in_delta_mixin.rb +50 -0
- data/lib/rubocop/cop/mixin/minitest_cop_rule.rb +102 -0
- data/lib/rubocop/cop/mixin/minitest_exploration_helpers.rb +84 -0
- data/lib/rubocop/minitest/version.rb +1 -1
- data/mkdocs.yml +2 -2
- data/relnotes/v0.10.0.md +21 -0
- data/relnotes/v0.6.2.md +5 -0
- data/relnotes/v0.7.0.md +13 -0
- data/relnotes/v0.8.0.md +12 -0
- data/relnotes/v0.8.1.md +5 -0
- data/relnotes/v0.9.0.md +10 -0
- data/rubocop-minitest.gemspec +4 -4
- data/tasks/cops_documentation.rake +83 -52
- data/tasks/cut_release.rake +16 -0
- metadata +45 -15
- data/lib/rubocop/cop/mixin/includes_cop_rule.rb +0 -78
@@ -0,0 +1,32 @@
|
|
1
|
+
= Usage
|
2
|
+
|
3
|
+
You need to tell RuboCop to load the Minitest extension. There are three
|
4
|
+
ways to do this:
|
5
|
+
|
6
|
+
== RuboCop configuration file
|
7
|
+
|
8
|
+
Put this into your `.rubocop.yml`.
|
9
|
+
|
10
|
+
[source,yaml]
|
11
|
+
----
|
12
|
+
require: rubocop-minitest
|
13
|
+
----
|
14
|
+
|
15
|
+
Now you can run `rubocop` and it will automatically load the RuboCop Minitest
|
16
|
+
cops together with the standard cops.
|
17
|
+
|
18
|
+
== Command line
|
19
|
+
|
20
|
+
[source,sh]
|
21
|
+
----
|
22
|
+
rubocop --require rubocop-minitest
|
23
|
+
----
|
24
|
+
|
25
|
+
== Rake task
|
26
|
+
|
27
|
+
[source,ruby]
|
28
|
+
----
|
29
|
+
RuboCop::RakeTask.new do |task|
|
30
|
+
task.requires << 'rubocop-minitest'
|
31
|
+
end
|
32
|
+
----
|
@@ -10,6 +10,7 @@
|
|
10
10
|
* [Minitest/AssertNil](cops_minitest.md#minitestassertnil)
|
11
11
|
* [Minitest/AssertRespondTo](cops_minitest.md#minitestassertrespondto)
|
12
12
|
* [Minitest/AssertTruthy](cops_minitest.md#minitestasserttruthy)
|
13
|
+
* [Minitest/GlobalExpectations](cops_minitest.md#minitestglobalexpectations)
|
13
14
|
* [Minitest/RefuteEmpty](cops_minitest.md#minitestrefuteempty)
|
14
15
|
* [Minitest/RefuteEqual](cops_minitest.md#minitestrefuteequal)
|
15
16
|
* [Minitest/RefuteFalse](cops_minitest.md#minitestrefutefalse)
|
@@ -14,11 +14,11 @@ instead of using `assert(object.empty?)`.
|
|
14
14
|
```ruby
|
15
15
|
# bad
|
16
16
|
assert(object.empty?)
|
17
|
-
assert(object.empty?, '
|
17
|
+
assert(object.empty?, 'message')
|
18
18
|
|
19
19
|
# good
|
20
20
|
assert_empty(object)
|
21
|
-
assert_empty(object, '
|
21
|
+
assert_empty(object, 'message')
|
22
22
|
```
|
23
23
|
|
24
24
|
### References
|
@@ -82,11 +82,11 @@ instead of using `assert(collection.include?(object))`.
|
|
82
82
|
```ruby
|
83
83
|
# bad
|
84
84
|
assert(collection.include?(object))
|
85
|
-
assert(collection.include?(object), '
|
85
|
+
assert(collection.include?(object), 'message')
|
86
86
|
|
87
87
|
# good
|
88
88
|
assert_includes(collection, object)
|
89
|
-
assert_includes(collection, object, '
|
89
|
+
assert_includes(collection, object, 'message')
|
90
90
|
```
|
91
91
|
|
92
92
|
### References
|
@@ -107,11 +107,11 @@ over `assert(object.instance_of?(Class))`.
|
|
107
107
|
```ruby
|
108
108
|
# bad
|
109
109
|
assert(object.instance_of?(Class))
|
110
|
-
assert(object.instance_of?(Class), '
|
110
|
+
assert(object.instance_of?(Class), 'message')
|
111
111
|
|
112
112
|
# good
|
113
113
|
assert_instance_of(Class, object)
|
114
|
-
assert_instance_of(Class, object, '
|
114
|
+
assert_instance_of(Class, object, 'message')
|
115
115
|
```
|
116
116
|
|
117
117
|
### References
|
@@ -132,11 +132,11 @@ instead of using `assert(matcher.match(string))`.
|
|
132
132
|
```ruby
|
133
133
|
# bad
|
134
134
|
assert(matcher.match(string))
|
135
|
-
assert(matcher.match(string), '
|
135
|
+
assert(matcher.match(string), 'message')
|
136
136
|
|
137
137
|
# good
|
138
138
|
assert_match(regex, string)
|
139
|
-
assert_match(matcher, string, '
|
139
|
+
assert_match(matcher, string, 'message')
|
140
140
|
```
|
141
141
|
|
142
142
|
### References
|
@@ -157,11 +157,11 @@ instead of using `assert_equal(nil, something)`.
|
|
157
157
|
```ruby
|
158
158
|
# bad
|
159
159
|
assert_equal(nil, actual)
|
160
|
-
assert_equal(nil, actual, '
|
160
|
+
assert_equal(nil, actual, 'message')
|
161
161
|
|
162
162
|
# good
|
163
163
|
assert_nil(actual)
|
164
|
-
assert_nil(actual, '
|
164
|
+
assert_nil(actual, 'message')
|
165
165
|
```
|
166
166
|
|
167
167
|
### References
|
@@ -174,21 +174,21 @@ Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChan
|
|
174
174
|
--- | --- | --- | --- | ---
|
175
175
|
Enabled | Yes | Yes | 0.3 | -
|
176
176
|
|
177
|
-
This cop enforces the use of `assert_respond_to(object, :
|
178
|
-
over `assert(object.respond_to?(:
|
177
|
+
This cop enforces the use of `assert_respond_to(object, :do_something)`
|
178
|
+
over `assert(object.respond_to?(:do_something))`.
|
179
179
|
|
180
180
|
### Examples
|
181
181
|
|
182
182
|
```ruby
|
183
183
|
# bad
|
184
|
-
assert(object.respond_to?(:
|
185
|
-
assert(object.respond_to?(:
|
186
|
-
assert(respond_to?(:
|
184
|
+
assert(object.respond_to?(:do_something))
|
185
|
+
assert(object.respond_to?(:do_something), 'message')
|
186
|
+
assert(respond_to?(:do_something))
|
187
187
|
|
188
188
|
# good
|
189
|
-
assert_respond_to(object, :
|
190
|
-
assert_respond_to(object, :
|
191
|
-
assert_respond_to(self,
|
189
|
+
assert_respond_to(object, :do_something)
|
190
|
+
assert_respond_to(object, :do_something, 'message')
|
191
|
+
assert_respond_to(self, :do_something)
|
192
192
|
```
|
193
193
|
|
194
194
|
### References
|
@@ -209,17 +209,40 @@ instead of using `assert_equal(true, actual)`.
|
|
209
209
|
```ruby
|
210
210
|
# bad
|
211
211
|
assert_equal(true, actual)
|
212
|
-
assert_equal(true, actual, '
|
212
|
+
assert_equal(true, actual, 'message')
|
213
213
|
|
214
214
|
# good
|
215
215
|
assert(actual)
|
216
|
-
assert(actual, '
|
216
|
+
assert(actual, 'message')
|
217
217
|
```
|
218
218
|
|
219
219
|
### References
|
220
220
|
|
221
221
|
* [https://github.com/rubocop-hq/minitest-style-guide#assert-truthy](https://github.com/rubocop-hq/minitest-style-guide#assert-truthy)
|
222
222
|
|
223
|
+
## Minitest/GlobalExpectations
|
224
|
+
|
225
|
+
Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChanged
|
226
|
+
--- | --- | --- | --- | ---
|
227
|
+
Enabled | Yes | Yes | 0.7 | -
|
228
|
+
|
229
|
+
This cop checks for deprecated global expectations
|
230
|
+
and autocorrects them to use expect format.
|
231
|
+
|
232
|
+
### Examples
|
233
|
+
|
234
|
+
```ruby
|
235
|
+
# bad
|
236
|
+
musts.must_equal expected_musts
|
237
|
+
wonts.wont_match expected_wonts
|
238
|
+
musts.must_raise TypeError
|
239
|
+
|
240
|
+
# good
|
241
|
+
_(musts).must_equal expected_musts
|
242
|
+
_(wonts).wont_match expected_wonts
|
243
|
+
_ { musts }.must_raise TypeError
|
244
|
+
```
|
245
|
+
|
223
246
|
## Minitest/RefuteEmpty
|
224
247
|
|
225
248
|
Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChanged
|
@@ -234,11 +257,11 @@ using `refute(object.empty?)`.
|
|
234
257
|
```ruby
|
235
258
|
# bad
|
236
259
|
refute(object.empty?)
|
237
|
-
refute(object.empty?, '
|
260
|
+
refute(object.empty?, 'message')
|
238
261
|
|
239
262
|
# good
|
240
263
|
refute_empty(object)
|
241
|
-
refute_empty(object, '
|
264
|
+
refute_empty(object, 'message')
|
242
265
|
```
|
243
266
|
|
244
267
|
### References
|
@@ -283,14 +306,14 @@ over `assert_equal(false, object)`.
|
|
283
306
|
```ruby
|
284
307
|
# bad
|
285
308
|
assert_equal(false, actual)
|
286
|
-
assert_equal(false, actual, '
|
309
|
+
assert_equal(false, actual, 'message')
|
287
310
|
|
288
311
|
assert(!test)
|
289
|
-
assert(!test, '
|
312
|
+
assert(!test, 'message')
|
290
313
|
|
291
314
|
# good
|
292
315
|
refute(actual)
|
293
|
-
refute(actual, '
|
316
|
+
refute(actual, 'message')
|
294
317
|
```
|
295
318
|
|
296
319
|
### References
|
@@ -311,11 +334,11 @@ instead of using `refute(collection.include?(object))`.
|
|
311
334
|
```ruby
|
312
335
|
# bad
|
313
336
|
refute(collection.include?(object))
|
314
|
-
refute(collection.include?(object), '
|
337
|
+
refute(collection.include?(object), 'message')
|
315
338
|
|
316
339
|
# good
|
317
340
|
refute_includes(collection, object)
|
318
|
-
refute_includes(collection, object, '
|
341
|
+
refute_includes(collection, object, 'message')
|
319
342
|
```
|
320
343
|
|
321
344
|
### References
|
@@ -336,11 +359,11 @@ over `refute(object.instance_of?(Class))`.
|
|
336
359
|
```ruby
|
337
360
|
# bad
|
338
361
|
refute(object.instance_of?(Class))
|
339
|
-
refute(object.instance_of?(Class), '
|
362
|
+
refute(object.instance_of?(Class), 'message')
|
340
363
|
|
341
364
|
# good
|
342
365
|
refute_instance_of(Class, object)
|
343
|
-
refute_instance_of(Class, object, '
|
366
|
+
refute_instance_of(Class, object, 'message')
|
344
367
|
```
|
345
368
|
|
346
369
|
### References
|
@@ -361,11 +384,11 @@ instead of using `refute(matcher.match(string))`.
|
|
361
384
|
```ruby
|
362
385
|
# bad
|
363
386
|
refute(matcher.match(string))
|
364
|
-
refute(matcher.match(string), '
|
387
|
+
refute(matcher.match(string), 'message')
|
365
388
|
|
366
389
|
# good
|
367
390
|
refute_match(matcher, string)
|
368
|
-
refute_match(matcher, string, '
|
391
|
+
refute_match(matcher, string, 'message')
|
369
392
|
```
|
370
393
|
|
371
394
|
### References
|
@@ -386,11 +409,11 @@ instead of using `refute_equal(nil, something)`.
|
|
386
409
|
```ruby
|
387
410
|
# bad
|
388
411
|
refute_equal(nil, actual)
|
389
|
-
refute_equal(nil, actual, '
|
412
|
+
refute_equal(nil, actual, 'message')
|
390
413
|
|
391
414
|
# good
|
392
415
|
refute_nil(actual)
|
393
|
-
refute_nil(actual, '
|
416
|
+
refute_nil(actual, 'message')
|
394
417
|
```
|
395
418
|
|
396
419
|
### References
|
@@ -403,21 +426,21 @@ Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChan
|
|
403
426
|
--- | --- | --- | --- | ---
|
404
427
|
Enabled | Yes | Yes | 0.4 | -
|
405
428
|
|
406
|
-
This cop enforces the test to use `refute_respond_to(object, :
|
407
|
-
over `refute(object.respond_to?(:
|
429
|
+
This cop enforces the test to use `refute_respond_to(object, :do_something)`
|
430
|
+
over `refute(object.respond_to?(:do_something))`.
|
408
431
|
|
409
432
|
### Examples
|
410
433
|
|
411
434
|
```ruby
|
412
435
|
# bad
|
413
|
-
refute(object.respond_to?(:
|
414
|
-
refute(object.respond_to?(:
|
415
|
-
refute(respond_to?(:
|
436
|
+
refute(object.respond_to?(:do_something))
|
437
|
+
refute(object.respond_to?(:do_something), 'message')
|
438
|
+
refute(respond_to?(:do_something))
|
416
439
|
|
417
440
|
# good
|
418
|
-
refute_respond_to(object, :
|
419
|
-
refute_respond_to(object, :
|
420
|
-
refute_respond_to(self, :
|
441
|
+
refute_respond_to(object, :do_something)
|
442
|
+
refute_respond_to(object, :do_something, 'message')
|
443
|
+
refute_respond_to(self, :do_something)
|
421
444
|
```
|
422
445
|
|
423
446
|
### References
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Source and test generator for new cops
|
6
|
+
#
|
7
|
+
# This generator will take a cop name and generate a source file
|
8
|
+
# and test file when given a valid qualified cop name.
|
9
|
+
class Generator
|
10
|
+
TEST_TEMPLATE = <<~TEST
|
11
|
+
# frozen_string_literal: true
|
12
|
+
|
13
|
+
require 'test_helper'
|
14
|
+
|
15
|
+
class %<cop_name>sTest < Minitest::Test
|
16
|
+
def test_registers_offense_when_using_bad_method
|
17
|
+
assert_offense(<<~RUBY)
|
18
|
+
bad_method
|
19
|
+
^^^^^^^^^^ Use `#good_method` instead of `#bad_method`.
|
20
|
+
RUBY
|
21
|
+
|
22
|
+
assert_correction(<<~RUBY)
|
23
|
+
good_method
|
24
|
+
RUBY
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_does_not_register_offense_when_using_good_method
|
28
|
+
assert_no_offenses(<<~RUBY)
|
29
|
+
good_method
|
30
|
+
RUBY
|
31
|
+
end
|
32
|
+
end
|
33
|
+
TEST
|
34
|
+
|
35
|
+
def write_test
|
36
|
+
write_unless_file_exists(test_path, generated_test)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def test_path
|
42
|
+
File.join(
|
43
|
+
'test',
|
44
|
+
'rubocop',
|
45
|
+
'cop',
|
46
|
+
'minitest',
|
47
|
+
"#{snake_case(badge.cop_name.to_s)}_test.rb"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def generated_test
|
52
|
+
generate(TEST_TEMPLATE)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -9,42 +9,16 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
# # bad
|
11
11
|
# assert(object.empty?)
|
12
|
-
# assert(object.empty?, '
|
12
|
+
# assert(object.empty?, 'message')
|
13
13
|
#
|
14
14
|
# # good
|
15
15
|
# assert_empty(object)
|
16
|
-
# assert_empty(object, '
|
16
|
+
# assert_empty(object, 'message')
|
17
17
|
#
|
18
18
|
class AssertEmpty < Cop
|
19
|
-
|
19
|
+
extend MinitestCopRule
|
20
20
|
|
21
|
-
|
22
|
-
'`assert(%<receiver>s)`.'
|
23
|
-
|
24
|
-
def_node_matcher :assert_with_empty, <<~PATTERN
|
25
|
-
(send nil? :assert $(send $_ :empty?) $...)
|
26
|
-
PATTERN
|
27
|
-
|
28
|
-
def on_send(node)
|
29
|
-
assert_with_empty(node) do |first_receiver_arg, actual, rest_receiver_arg|
|
30
|
-
message = rest_receiver_arg.first
|
31
|
-
|
32
|
-
arguments = [actual.source, message&.source].compact.join(', ')
|
33
|
-
receiver = [first_receiver_arg.source, message&.source].compact.join(', ')
|
34
|
-
|
35
|
-
offense_message = format(MSG, arguments: arguments, receiver: receiver)
|
36
|
-
add_offense(node, message: offense_message)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def autocorrect(node)
|
41
|
-
lambda do |corrector|
|
42
|
-
assert_with_empty(node) do |_, actual_arg|
|
43
|
-
corrector.replace(node.loc.selector, 'assert_empty')
|
44
|
-
corrector.replace(first_argument_range(node), actual_arg.source)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
21
|
+
define_rule :assert, target_method: :empty?
|
48
22
|
end
|
49
23
|
end
|
50
24
|
end
|
@@ -15,6 +15,8 @@ module RuboCop
|
|
15
15
|
# assert_empty(object)
|
16
16
|
#
|
17
17
|
class AssertEmptyLiteral < Cop
|
18
|
+
include ArgumentRangeHelper
|
19
|
+
|
18
20
|
MSG = 'Prefer using `assert_empty(%<arguments>s)` over ' \
|
19
21
|
'`assert(%<literal>s, %<arguments>s)`.'
|
20
22
|
|
@@ -24,12 +26,25 @@ module RuboCop
|
|
24
26
|
|
25
27
|
def on_send(node)
|
26
28
|
assert_with_empty_literal(node) do |literal, matchers|
|
29
|
+
return unless literal.values.empty?
|
30
|
+
|
27
31
|
args = matchers.map(&:source).join(', ')
|
28
32
|
|
29
33
|
message = format(MSG, literal: literal.source, arguments: args)
|
30
34
|
add_offense(node, message: message)
|
31
35
|
end
|
32
36
|
end
|
37
|
+
|
38
|
+
def autocorrect(node)
|
39
|
+
assert_with_empty_literal(node) do |_literal, matchers|
|
40
|
+
object = matchers.first
|
41
|
+
|
42
|
+
lambda do |corrector|
|
43
|
+
corrector.replace(node.loc.selector, 'assert_empty')
|
44
|
+
corrector.replace(first_and_second_arguments_range(node), object.source)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
33
48
|
end
|
34
49
|
end
|
35
50
|
end
|