rubocop-rspec 2.11.1 → 2.13.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.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +125 -81
  3. data/config/default.yml +59 -6
  4. data/lib/rubocop/cop/rspec/align_left_let_brace.rb +8 -9
  5. data/lib/rubocop/cop/rspec/align_right_let_brace.rb +8 -9
  6. data/lib/rubocop/cop/rspec/any_instance.rb +1 -0
  7. data/lib/rubocop/cop/rspec/around_block.rb +26 -3
  8. data/lib/rubocop/cop/rspec/be.rb +0 -1
  9. data/lib/rubocop/cop/rspec/be_eq.rb +0 -1
  10. data/lib/rubocop/cop/rspec/be_eql.rb +0 -1
  11. data/lib/rubocop/cop/rspec/before_after_all.rb +1 -0
  12. data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +9 -3
  13. data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +2 -1
  14. data/lib/rubocop/cop/rspec/capybara/specific_finders.rb +86 -0
  15. data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +158 -0
  16. data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +0 -1
  17. data/lib/rubocop/cop/rspec/change_by_zero.rb +67 -7
  18. data/lib/rubocop/cop/rspec/class_check.rb +101 -0
  19. data/lib/rubocop/cop/rspec/context_method.rb +2 -1
  20. data/lib/rubocop/cop/rspec/context_wording.rb +49 -18
  21. data/lib/rubocop/cop/rspec/describe_class.rb +1 -1
  22. data/lib/rubocop/cop/rspec/describe_method.rb +1 -0
  23. data/lib/rubocop/cop/rspec/described_class.rb +5 -15
  24. data/lib/rubocop/cop/rspec/dialect.rb +1 -0
  25. data/lib/rubocop/cop/rspec/empty_example_group.rb +19 -4
  26. data/lib/rubocop/cop/rspec/empty_hook.rb +4 -5
  27. data/lib/rubocop/cop/rspec/empty_line_after_example.rb +4 -9
  28. data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +1 -1
  29. data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +2 -1
  30. data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +32 -2
  31. data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +2 -1
  32. data/lib/rubocop/cop/rspec/example_length.rb +3 -2
  33. data/lib/rubocop/cop/rspec/example_without_description.rb +3 -2
  34. data/lib/rubocop/cop/rspec/example_wording.rb +2 -1
  35. data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +1 -0
  36. data/lib/rubocop/cop/rspec/expect_actual.rb +5 -0
  37. data/lib/rubocop/cop/rspec/expect_change.rb +9 -9
  38. data/lib/rubocop/cop/rspec/expect_in_hook.rb +4 -1
  39. data/lib/rubocop/cop/rspec/expect_output.rb +1 -0
  40. data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +2 -1
  41. data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +50 -13
  42. data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +1 -0
  43. data/lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb +1 -1
  44. data/lib/rubocop/cop/rspec/file_path.rb +8 -4
  45. data/lib/rubocop/cop/rspec/focus.rb +20 -4
  46. data/lib/rubocop/cop/rspec/hook_argument.rb +10 -5
  47. data/lib/rubocop/cop/rspec/hooks_before_examples.rb +10 -9
  48. data/lib/rubocop/cop/rspec/identical_equality_assertion.rb +0 -1
  49. data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +1 -0
  50. data/lib/rubocop/cop/rspec/implicit_expect.rb +1 -3
  51. data/lib/rubocop/cop/rspec/instance_spy.rb +1 -1
  52. data/lib/rubocop/cop/rspec/instance_variable.rb +0 -1
  53. data/lib/rubocop/cop/rspec/it_behaves_like.rb +3 -2
  54. data/lib/rubocop/cop/rspec/iterated_expectation.rb +16 -0
  55. data/lib/rubocop/cop/rspec/leading_subject.rb +15 -15
  56. data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +1 -1
  57. data/lib/rubocop/cop/rspec/let_before_examples.rb +7 -8
  58. data/lib/rubocop/cop/rspec/let_setup.rb +4 -4
  59. data/lib/rubocop/cop/rspec/message_chain.rb +1 -1
  60. data/lib/rubocop/cop/rspec/message_expectation.rb +1 -1
  61. data/lib/rubocop/cop/rspec/message_spies.rb +7 -1
  62. data/lib/rubocop/cop/rspec/missing_example_group_argument.rb +2 -1
  63. data/lib/rubocop/cop/rspec/mixin/css_selector.rb +99 -0
  64. data/lib/rubocop/cop/rspec/mixin/empty_line_separation.rb +13 -4
  65. data/lib/rubocop/cop/rspec/mixin/namespace.rb +23 -0
  66. data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -0
  67. data/lib/rubocop/cop/rspec/multiple_expectations.rb +19 -3
  68. data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +1 -3
  69. data/lib/rubocop/cop/rspec/multiple_subjects.rb +17 -2
  70. data/lib/rubocop/cop/rspec/named_subject.rb +2 -1
  71. data/lib/rubocop/cop/rspec/nested_groups.rb +45 -25
  72. data/lib/rubocop/cop/rspec/no_expectation_example.rb +64 -0
  73. data/lib/rubocop/cop/rspec/not_to_not.rb +13 -1
  74. data/lib/rubocop/cop/rspec/overwriting_setup.rb +2 -1
  75. data/lib/rubocop/cop/rspec/pending.rb +1 -0
  76. data/lib/rubocop/cop/rspec/predicate_matcher.rb +2 -1
  77. data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +1 -2
  78. data/lib/rubocop/cop/rspec/rails/have_http_status.rb +47 -0
  79. data/lib/rubocop/cop/rspec/receive_counts.rb +14 -15
  80. data/lib/rubocop/cop/rspec/receive_never.rb +4 -5
  81. data/lib/rubocop/cop/rspec/repeated_description.rb +25 -26
  82. data/lib/rubocop/cop/rspec/repeated_example.rb +1 -1
  83. data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +28 -29
  84. data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +28 -29
  85. data/lib/rubocop/cop/rspec/repeated_include_example.rb +32 -33
  86. data/lib/rubocop/cop/rspec/return_from_stub.rb +12 -12
  87. data/lib/rubocop/cop/rspec/scattered_let.rb +1 -5
  88. data/lib/rubocop/cop/rspec/scattered_setup.rb +2 -2
  89. data/lib/rubocop/cop/rspec/shared_context.rb +1 -1
  90. data/lib/rubocop/cop/rspec/stubbed_mock.rb +0 -1
  91. data/lib/rubocop/cop/rspec/subject_declaration.rb +0 -1
  92. data/lib/rubocop/cop/rspec/subject_stub.rb +2 -2
  93. data/lib/rubocop/cop/rspec/unspecified_exception.rb +15 -15
  94. data/lib/rubocop/cop/rspec/variable_definition.rb +1 -0
  95. data/lib/rubocop/cop/rspec/variable_name.rb +6 -7
  96. data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -0
  97. data/lib/rubocop/cop/rspec/void_expect.rb +2 -1
  98. data/lib/rubocop/cop/rspec/yield.rb +3 -2
  99. data/lib/rubocop/cop/rspec_cops.rb +5 -0
  100. data/lib/rubocop/rspec/config_formatter.rb +14 -3
  101. data/lib/rubocop/rspec/inject.rb +1 -3
  102. data/lib/rubocop/rspec/language/node_pattern.rb +4 -0
  103. data/lib/rubocop/rspec/language.rb +6 -1
  104. data/lib/rubocop/rspec/node.rb +1 -1
  105. data/lib/rubocop/rspec/version.rb +1 -1
  106. data/lib/rubocop/rspec/wording.rb +2 -2
  107. data/lib/rubocop/rspec.rb +14 -0
  108. data/lib/rubocop-rspec.rb +3 -0
  109. metadata +12 -88
@@ -6,7 +6,6 @@ module RuboCop
6
6
  # Checks if an example group defines `subject` multiple times.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
10
  # describe Foo do
12
11
  # subject(:user) { User.new }
@@ -19,6 +18,21 @@ module RuboCop
19
18
  # subject(:post) { Post.new }
20
19
  # end
21
20
  #
21
+ # # bad (does not support autocorrection)
22
+ # describe Foo do
23
+ # subject!(:user) { User.new }
24
+ # subject!(:post) { Post.new }
25
+ # end
26
+ #
27
+ # # good
28
+ # describe Foo do
29
+ # before do
30
+ # User.new
31
+ # Post.new
32
+ # end
33
+ # end
34
+ #
35
+ # This cop does not support autocorrection in some cases.
22
36
  # The autocorrect behavior for this cop depends on the type of
23
37
  # duplication:
24
38
  #
@@ -33,13 +47,14 @@ module RuboCop
33
47
  # - If subjects are defined with `subject!` then we don't autocorrect.
34
48
  # This is enough of an edge case that people can just move this to
35
49
  # a `before` hook on their own
50
+ #
36
51
  class MultipleSubjects < Base
37
52
  extend AutoCorrector
38
53
  include RangeHelp
39
54
 
40
55
  MSG = 'Do not set more than one subject per example group'
41
56
 
42
- def on_block(node)
57
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
43
58
  return unless example_group?(node)
44
59
 
45
60
  subjects = RuboCop::RSpec::ExampleGroup.new(node).subjects
@@ -41,6 +41,7 @@ module RuboCop
41
41
  #
42
42
  # it { is_expected.to be_valid }
43
43
  # end
44
+ #
44
45
  class NamedSubject < Base
45
46
  MSG = 'Name your test subject if you need to reference it explicitly.'
46
47
 
@@ -55,7 +56,7 @@ module RuboCop
55
56
  # @!method subject_usage(node)
56
57
  def_node_search :subject_usage, '$(send nil? :subject)'
57
58
 
58
- def on_block(node)
59
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
59
60
  if !example_or_hook_block?(node) || ignored_shared_example?(node)
60
61
  return
61
62
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  # end
37
37
  # end
38
38
  #
39
- # # better
39
+ # # good
40
40
  # context 'using some feature as an admin' do
41
41
  # let(:some) { :various }
42
42
  # let(:feature) { :setup }
@@ -53,34 +53,40 @@ module RuboCop
53
53
  # it 'yada yada'
54
54
  # end
55
55
  #
56
- # @example configuration
57
- #
58
- # # .rubocop.yml
59
- # # RSpec/NestedGroups:
60
- # # Max: 2
61
- #
62
- # context 'when using some feature' do
63
- # let(:some) { :various }
64
- # let(:feature) { :setup }
65
- #
66
- # context 'when user is signed in' do
67
- # let(:user) do
68
- # UserCreate.call(user_attributes)
56
+ # @example `Max: 3` (default)
57
+ # # bad
58
+ # describe Foo do
59
+ # context 'foo' do
60
+ # context 'bar' do
61
+ # context 'baz' do # flagged by rubocop
62
+ # end
69
63
  # end
64
+ # end
65
+ # end
70
66
  #
71
- # let(:user_attributes) do
72
- # {
73
- # name: 'John',
74
- # age: 22,
75
- # role: role
76
- # }
67
+ # @example `Max: 2`
68
+ # # bad
69
+ # describe Foo do
70
+ # context 'foo' do
71
+ # context 'bar' do # flagged by rubocop
72
+ # context 'baz' do # flagged by rubocop
73
+ # end
77
74
  # end
75
+ # end
76
+ # end
78
77
  #
79
- # context 'when user is an admin' do # flagged by rubocop
80
- # let(:role) { 'admin' }
78
+ # @example `AllowedGroups: [] (default)`
79
+ # describe Foo do # <-- nested groups 1
80
+ # context 'foo' do # <-- nested groups 2
81
+ # context 'bar' do # <-- nested groups 3
82
+ # end
83
+ # end
84
+ # end
81
85
  #
82
- # it 'blah blah'
83
- # it 'yada yada'
86
+ # @example `AllowedGroups: [path]`
87
+ # describe Foo do # <-- nested groups 1
88
+ # path '/foo' do # <-- nested groups 1 (not counted)
89
+ # context 'bar' do # <-- nested groups 2
84
90
  # end
85
91
  # end
86
92
  # end
@@ -113,13 +119,23 @@ module RuboCop
113
119
  example_group = example_group?(node)
114
120
  yield node, nesting if example_group && nesting > max_nesting
115
121
 
116
- next_nesting = example_group ? nesting + 1 : nesting
122
+ next_nesting = if count_up_nesting?(node, example_group)
123
+ nesting + 1
124
+ else
125
+ nesting
126
+ end
117
127
 
118
128
  node.each_child_node(:block, :begin) do |child|
119
129
  find_nested_example_groups(child, nesting: next_nesting, &block)
120
130
  end
121
131
  end
122
132
 
133
+ def count_up_nesting?(node, example_group)
134
+ example_group &&
135
+ (node.block_type? &&
136
+ !allowed_groups.include?(node.method_name))
137
+ end
138
+
123
139
  def message(nesting)
124
140
  format(MSG, total: nesting, max: max_nesting)
125
141
  end
@@ -136,6 +152,10 @@ module RuboCop
136
152
  cop_config.fetch('Max', 3)
137
153
  end
138
154
  end
155
+
156
+ def allowed_groups
157
+ @allowed_groups ||= cop_config.fetch('AllowedGroups', [])
158
+ end
139
159
  end
140
160
  end
141
161
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Checks if an example contains any expectation.
7
+ #
8
+ # All RSpec's example and expectation methods are covered by default.
9
+ # If you are using your own custom methods,
10
+ # add the following configuration:
11
+ #
12
+ # RSpec:
13
+ # Language:
14
+ # Examples:
15
+ # Regular:
16
+ # - custom_it
17
+ # Expectations:
18
+ # - custom_expect
19
+ #
20
+ # @example
21
+ # # bad
22
+ # it do
23
+ # a?
24
+ # end
25
+ #
26
+ # # good
27
+ # it do
28
+ # expect(a?).to be(true)
29
+ # end
30
+ #
31
+ class NoExpectationExample < Base
32
+ MSG = 'No expectation found in this example.'
33
+
34
+ # @!method regular_or_focused_example?(node)
35
+ # @param [RuboCop::AST::Node] node
36
+ # @return [Boolean]
37
+ def_node_matcher :regular_or_focused_example?, <<~PATTERN
38
+ {
39
+ #{block_pattern('{#Examples.regular | #Examples.focused}')}
40
+ #{numblock_pattern('{#Examples.regular | #Examples.focused}')}
41
+ }
42
+ PATTERN
43
+
44
+ # @!method including_any_expectation?(node)
45
+ # @param [RuboCop::AST::Node] node
46
+ # @return [Boolean]
47
+ def_node_search(
48
+ :including_any_expectation?,
49
+ send_pattern('#Expectations.all')
50
+ )
51
+
52
+ # @param [RuboCop::AST::BlockNode] node
53
+ def on_block(node)
54
+ return unless regular_or_focused_example?(node)
55
+ return if including_any_expectation?(node)
56
+
57
+ add_offense(node)
58
+ end
59
+
60
+ alias on_numblock on_block
61
+ end
62
+ end
63
+ end
64
+ end
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module RSpec
6
6
  # Checks for consistent method usage for negating expectations.
7
7
  #
8
- # @example
8
+ # @example `EnforcedStyle: not_to` (default)
9
9
  # # bad
10
10
  # it '...' do
11
11
  # expect(false).to_not be_true
@@ -15,6 +15,18 @@ module RuboCop
15
15
  # it '...' do
16
16
  # expect(false).not_to be_true
17
17
  # end
18
+ #
19
+ # @example `EnforcedStyle: to_not`
20
+ # # bad
21
+ # it '...' do
22
+ # expect(false).not_to be_true
23
+ # end
24
+ #
25
+ # # good
26
+ # it '...' do
27
+ # expect(false).to_not be_true
28
+ # end
29
+ #
18
30
  class NotToNot < Base
19
31
  extend AutoCorrector
20
32
  include ConfigurableEnforcedStyle
@@ -21,6 +21,7 @@ module RuboCop
21
21
  # let(:foo) { bar }
22
22
  # let(:baz) { baz }
23
23
  # let!(:other) { other }
24
+ #
24
25
  class OverwritingSetup < Base
25
26
  MSG = '`%<name>s` is already defined.'
26
27
 
@@ -30,7 +31,7 @@ module RuboCop
30
31
  # @!method first_argument_name(node)
31
32
  def_node_matcher :first_argument_name, '(send _ _ ({str sym} $_))'
32
33
 
33
- def on_block(node)
34
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
34
35
  return unless example_group_with_body?(node)
35
36
 
36
37
  find_duplicates(node.body) do |duplicate, name|
@@ -31,6 +31,7 @@ module RuboCop
31
31
  # # good
32
32
  # describe MyClass do
33
33
  # end
34
+ #
34
35
  class Pending < Base
35
36
  MSG = 'Pending spec found.'
36
37
 
@@ -276,6 +276,7 @@ module RuboCop
276
276
  #
277
277
  # # good - the above code is rewritten to it by this cop
278
278
  # expect(foo.something?).to be_truthy
279
+ #
279
280
  class PredicateMatcher < Base
280
281
  extend AutoCorrector
281
282
  include ConfigurableEnforcedStyle
@@ -291,7 +292,7 @@ module RuboCop
291
292
  end
292
293
  end
293
294
 
294
- def on_block(node)
295
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
295
296
  check_explicit(node) if style == :explicit
296
297
  end
297
298
 
@@ -7,7 +7,6 @@ module RuboCop
7
7
  # Checks that tests use RSpec `before` hook over Rails `setup` method.
8
8
  #
9
9
  # @example
10
- #
11
10
  # # bad
12
11
  # setup do
13
12
  # allow(foo).to receive(:bar)
@@ -30,7 +29,7 @@ module RuboCop
30
29
  (args) _)
31
30
  PATTERN
32
31
 
33
- def on_block(node)
32
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
34
33
  setup_call(node) do |setup|
35
34
  add_offense(node) do |corrector|
36
35
  corrector.replace setup, 'before'
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ module Rails
7
+ # Checks that tests use `have_http_status` instead of equality matchers.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # expect(response.status).to be(200)
12
+ #
13
+ # # good
14
+ # expect(response).to have_http_status(200)
15
+ #
16
+ class HaveHttpStatus < Base
17
+ extend AutoCorrector
18
+
19
+ MSG =
20
+ 'Prefer `expect(response).%<to>s have_http_status(%<status>i)` ' \
21
+ 'over `expect(response.status).%<to>s %<match>s`.'
22
+
23
+ # @!method match_status(node)
24
+ def_node_matcher :match_status, <<-PATTERN
25
+ (send
26
+ (send nil? :expect
27
+ $(send (send nil? :response) :status)
28
+ )
29
+ $#Runners.all
30
+ $(send nil? {:be :eq :eql :equal} (int $_))
31
+ )
32
+ PATTERN
33
+
34
+ def on_send(node)
35
+ match_status(node) do |response_status, to, match, status|
36
+ message = format(MSG, to: to, match: match.source, status: status)
37
+ add_offense(node, message: message) do |corrector|
38
+ corrector.replace(response_status.source_range, 'response')
39
+ corrector.replace(match.loc.selector, 'have_http_status')
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -6,22 +6,21 @@ module RuboCop
6
6
  # Check for `once` and `twice` receive counts matchers usage.
7
7
  #
8
8
  # @example
9
+ # # bad
10
+ # expect(foo).to receive(:bar).exactly(1).times
11
+ # expect(foo).to receive(:bar).exactly(2).times
12
+ # expect(foo).to receive(:bar).at_least(1).times
13
+ # expect(foo).to receive(:bar).at_least(2).times
14
+ # expect(foo).to receive(:bar).at_most(1).times
15
+ # expect(foo).to receive(:bar).at_most(2).times
9
16
  #
10
- # # bad
11
- # expect(foo).to receive(:bar).exactly(1).times
12
- # expect(foo).to receive(:bar).exactly(2).times
13
- # expect(foo).to receive(:bar).at_least(1).times
14
- # expect(foo).to receive(:bar).at_least(2).times
15
- # expect(foo).to receive(:bar).at_most(1).times
16
- # expect(foo).to receive(:bar).at_most(2).times
17
- #
18
- # # good
19
- # expect(foo).to receive(:bar).once
20
- # expect(foo).to receive(:bar).twice
21
- # expect(foo).to receive(:bar).at_least(:once)
22
- # expect(foo).to receive(:bar).at_least(:twice)
23
- # expect(foo).to receive(:bar).at_most(:once)
24
- # expect(foo).to receive(:bar).at_most(:twice).times
17
+ # # good
18
+ # expect(foo).to receive(:bar).once
19
+ # expect(foo).to receive(:bar).twice
20
+ # expect(foo).to receive(:bar).at_least(:once)
21
+ # expect(foo).to receive(:bar).at_least(:twice)
22
+ # expect(foo).to receive(:bar).at_most(:once)
23
+ # expect(foo).to receive(:bar).at_most(:twice).times
25
24
  #
26
25
  class ReceiveCounts < Base
27
26
  extend AutoCorrector
@@ -6,12 +6,11 @@ module RuboCop
6
6
  # Prefer `not_to receive(...)` over `receive(...).never`.
7
7
  #
8
8
  # @example
9
+ # # bad
10
+ # expect(foo).to receive(:bar).never
9
11
  #
10
- # # bad
11
- # expect(foo).to receive(:bar).never
12
- #
13
- # # good
14
- # expect(foo).not_to receive(:bar)
12
+ # # good
13
+ # expect(foo).not_to receive(:bar)
15
14
  #
16
15
  class ReceiveNever < Base
17
16
  extend AutoCorrector
@@ -6,44 +6,43 @@ module RuboCop
6
6
  # Check for repeated description strings in example groups.
7
7
  #
8
8
  # @example
9
+ # # bad
10
+ # RSpec.describe User do
11
+ # it 'is valid' do
12
+ # # ...
13
+ # end
9
14
  #
10
- # # bad
11
- # RSpec.describe User do
12
- # it 'is valid' do
13
- # # ...
14
- # end
15
- #
16
- # it 'is valid' do
17
- # # ...
18
- # end
15
+ # it 'is valid' do
16
+ # # ...
19
17
  # end
18
+ # end
20
19
  #
21
- # # good
22
- # RSpec.describe User do
23
- # it 'is valid when first and last name are present' do
24
- # # ...
25
- # end
20
+ # # good
21
+ # RSpec.describe User do
22
+ # it 'is valid when first and last name are present' do
23
+ # # ...
24
+ # end
26
25
  #
27
- # it 'is valid when last name only is present' do
28
- # # ...
29
- # end
26
+ # it 'is valid when last name only is present' do
27
+ # # ...
30
28
  # end
29
+ # end
31
30
  #
32
- # # good
33
- # RSpec.describe User do
34
- # it 'is valid' do
35
- # # ...
36
- # end
31
+ # # good
32
+ # RSpec.describe User do
33
+ # it 'is valid' do
34
+ # # ...
35
+ # end
37
36
  #
38
- # it 'is valid', :flag do
39
- # # ...
40
- # end
37
+ # it 'is valid', :flag do
38
+ # # ...
41
39
  # end
40
+ # end
42
41
  #
43
42
  class RepeatedDescription < Base
44
43
  MSG = "Don't repeat descriptions within an example group."
45
44
 
46
- def on_block(node)
45
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
47
46
  return unless example_group?(node)
48
47
 
49
48
  repeated_descriptions(node).each do |repeated_description|
@@ -18,7 +18,7 @@ module RuboCop
18
18
  class RepeatedExample < Base
19
19
  MSG = "Don't repeat examples within an example group."
20
20
 
21
- def on_block(node)
21
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
22
22
  return unless example_group?(node)
23
23
 
24
24
  repeated_examples(node).each do |repeated_example|
@@ -6,42 +6,41 @@ module RuboCop
6
6
  # Check for repeated describe and context block body.
7
7
  #
8
8
  # @example
9
+ # # bad
10
+ # describe 'cool feature x' do
11
+ # it { cool_predicate }
12
+ # end
9
13
  #
10
- # # bad
11
- # describe 'cool feature x' do
12
- # it { cool_predicate }
13
- # end
14
+ # describe 'cool feature y' do
15
+ # it { cool_predicate }
16
+ # end
14
17
  #
15
- # describe 'cool feature y' do
16
- # it { cool_predicate }
17
- # end
18
+ # # good
19
+ # describe 'cool feature' do
20
+ # it { cool_predicate }
21
+ # end
18
22
  #
19
- # # good
20
- # describe 'cool feature' do
21
- # it { cool_predicate }
22
- # end
23
+ # describe 'another cool feature' do
24
+ # it { another_predicate }
25
+ # end
23
26
  #
24
- # describe 'another cool feature' do
25
- # it { another_predicate }
26
- # end
27
+ # # good
28
+ # context 'when case x', :tag do
29
+ # it { cool_predicate }
30
+ # end
27
31
  #
28
- # # good
29
- # context 'when case x', :tag do
30
- # it { cool_predicate }
31
- # end
32
+ # context 'when case y' do
33
+ # it { cool_predicate }
34
+ # end
32
35
  #
33
- # context 'when case y' do
34
- # it { cool_predicate }
35
- # end
36
+ # # good
37
+ # context Array do
38
+ # it { is_expected.to respond_to :each }
39
+ # end
36
40
  #
37
- # # good
38
- # context Array do
39
- # it { is_expected.to respond_to :each }
40
- # end
41
- #
42
- # context Hash do
43
- # it { is_expected.to respond_to :each }
44
- # end
41
+ # context Hash do
42
+ # it { is_expected.to respond_to :each }
43
+ # end
45
44
  #
46
45
  class RepeatedExampleGroupBody < Base
47
46
  MSG = 'Repeated %<group>s block body on line(s) %<loc>s'
@@ -6,42 +6,41 @@ module RuboCop
6
6
  # Check for repeated example group descriptions.
7
7
  #
8
8
  # @example
9
+ # # bad
10
+ # describe 'cool feature' do
11
+ # # example group
12
+ # end
9
13
  #
10
- # # bad
11
- # describe 'cool feature' do
12
- # # example group
13
- # end
14
+ # describe 'cool feature' do
15
+ # # example group
16
+ # end
14
17
  #
15
- # describe 'cool feature' do
16
- # # example group
17
- # end
18
+ # # bad
19
+ # context 'when case x' do
20
+ # # example group
21
+ # end
18
22
  #
19
- # # bad
20
- # context 'when case x' do
21
- # # example group
22
- # end
23
+ # describe 'when case x' do
24
+ # # example group
25
+ # end
23
26
  #
24
- # describe 'when case x' do
25
- # # example group
26
- # end
27
+ # # good
28
+ # describe 'cool feature' do
29
+ # # example group
30
+ # end
27
31
  #
28
- # # good
29
- # describe 'cool feature' do
30
- # # example group
31
- # end
32
+ # describe 'another cool feature' do
33
+ # # example group
34
+ # end
32
35
  #
33
- # describe 'another cool feature' do
34
- # # example group
35
- # end
36
+ # # good
37
+ # context 'when case x' do
38
+ # # example group
39
+ # end
36
40
  #
37
- # # good
38
- # context 'when case x' do
39
- # # example group
40
- # end
41
- #
42
- # context 'when another case' do
43
- # # example group
44
- # end
41
+ # context 'when another case' do
42
+ # # example group
43
+ # end
45
44
  #
46
45
  class RepeatedExampleGroupDescription < Base
47
46
  MSG = 'Repeated %<group>s block description on line(s) %<loc>s'