rubocop-rspec 2.29.2 → 3.0.1

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/README.md +1 -1
  4. data/config/default.yml +62 -264
  5. data/config/obsoletion.yml +11 -0
  6. data/lib/rubocop/cop/rspec/base.rb +0 -1
  7. data/lib/rubocop/cop/rspec/dialect.rb +13 -0
  8. data/lib/rubocop/cop/rspec/expect_actual.rb +1 -1
  9. data/lib/rubocop/cop/rspec/expect_in_hook.rb +1 -1
  10. data/lib/rubocop/cop/rspec/expect_in_let.rb +42 -0
  11. data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +1 -1
  12. data/lib/rubocop/cop/rspec/missing_expectation_target_method.rb +54 -0
  13. data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -1
  14. data/lib/rubocop/cop/rspec/multiple_expectations.rb +2 -2
  15. data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +2 -4
  16. data/lib/rubocop/cop/rspec/named_subject.rb +5 -2
  17. data/lib/rubocop/cop/rspec/predicate_matcher.rb +1 -1
  18. data/lib/rubocop/cop/rspec/remove_const.rb +0 -1
  19. data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
  20. data/lib/rubocop/cop/rspec/sort_metadata.rb +1 -1
  21. data/lib/rubocop/cop/rspec/stubbed_mock.rb +3 -1
  22. data/lib/rubocop/cop/rspec/subject_stub.rb +2 -2
  23. data/lib/rubocop/cop/rspec_cops.rb +2 -25
  24. data/lib/rubocop/rspec/concept.rb +0 -1
  25. data/lib/rubocop/rspec/config_formatter.rb +1 -24
  26. data/lib/rubocop/rspec/cop/generator.rb +25 -0
  27. data/lib/rubocop/rspec/language.rb +0 -1
  28. data/lib/rubocop/rspec/shared_contexts/default_rspec_language_config_context.rb +1 -1
  29. data/lib/rubocop/rspec/version.rb +1 -1
  30. data/lib/rubocop-rspec.rb +1 -17
  31. metadata +7 -69
  32. data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +0 -39
  33. data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +0 -104
  34. data/lib/rubocop/cop/rspec/capybara/match_style.rb +0 -38
  35. data/lib/rubocop/cop/rspec/capybara/negation_matcher.rb +0 -33
  36. data/lib/rubocop/cop/rspec/capybara/specific_actions.rb +0 -29
  37. data/lib/rubocop/cop/rspec/capybara/specific_finders.rb +0 -24
  38. data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +0 -35
  39. data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +0 -36
  40. data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +0 -35
  41. data/lib/rubocop/cop/rspec/factory_bot/consistent_parentheses_style.rb +0 -50
  42. data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +0 -40
  43. data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +0 -29
  44. data/lib/rubocop/cop/rspec/factory_bot/factory_name_style.rb +0 -33
  45. data/lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb +0 -55
  46. data/lib/rubocop/cop/rspec/file_path.rb +0 -179
  47. data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +0 -27
  48. data/lib/rubocop/cop/rspec/rails/have_http_status.rb +0 -35
  49. data/lib/rubocop/cop/rspec/rails/http_status.rb +0 -61
  50. data/lib/rubocop/cop/rspec/rails/inferred_spec_type.rb +0 -62
  51. data/lib/rubocop/cop/rspec/rails/minitest_assertions.rb +0 -39
  52. data/lib/rubocop/cop/rspec/rails/negation_be_valid.rb +0 -39
  53. data/lib/rubocop/cop/rspec/rails/travel_around.rb +0 -34
  54. data/lib/rubocop/rspec/language/node_pattern.rb +0 -48
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # Checks for consistent method usage in feature specs.
8
- #
9
- # By default, the cop disables all Capybara-specific methods that have
10
- # the same native RSpec method (e.g. are just aliases). Some teams
11
- # however may prefer using some of the Capybara methods (like `feature`)
12
- # to make it obvious that the test uses Capybara, while still disable
13
- # the rest of the methods, like `given` (alias for `let`), `background`
14
- # (alias for `before`), etc. You can configure which of the methods to
15
- # be enabled by using the EnabledMethods configuration option.
16
- #
17
- # @example
18
- # # bad
19
- # feature 'User logs in' do
20
- # given(:user) { User.new }
21
- #
22
- # background do
23
- # visit new_session_path
24
- # end
25
- #
26
- # scenario 'with OAuth' do
27
- # # ...
28
- # end
29
- # end
30
- #
31
- # # good
32
- # describe 'User logs in' do
33
- # let(:user) { User.new }
34
- #
35
- # before do
36
- # visit new_session_path
37
- # end
38
- #
39
- # it 'with OAuth' do
40
- # # ...
41
- # end
42
- # end
43
- #
44
- class FeatureMethods < Base
45
- extend AutoCorrector
46
- include InsideExampleGroup
47
-
48
- MSG = 'Use `%<replacement>s` instead of `%<method>s`.'
49
-
50
- # https://github.com/teamcapybara/capybara/blob/e283c1aeaa72441f5403963577e16333bf111a81/lib/capybara/rspec/features.rb#L31-L36
51
- MAP = {
52
- background: :before,
53
- scenario: :it,
54
- xscenario: :xit,
55
- given: :let,
56
- given!: :let!,
57
- feature: :describe
58
- }.freeze
59
-
60
- # @!method capybara_speak(node)
61
- def_node_matcher :capybara_speak, <<~PATTERN
62
- {#{MAP.keys.map(&:inspect).join(' ')}}
63
- PATTERN
64
-
65
- # @!method feature_method(node)
66
- def_node_matcher :feature_method, <<~PATTERN
67
- (block
68
- $(send #rspec? $#capybara_speak ...)
69
- ...)
70
- PATTERN
71
-
72
- def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
73
- return unless inside_example_group?(node)
74
-
75
- feature_method(node) do |send_node, match|
76
- next if enabled?(match)
77
-
78
- add_offense(send_node.loc.selector) do |corrector|
79
- corrector.replace(send_node.loc.selector, MAP[match].to_s)
80
- end
81
- end
82
- end
83
-
84
- def message(range)
85
- name = range.source.to_sym
86
- format(MSG, method: name, replacement: MAP[name])
87
- end
88
-
89
- private
90
-
91
- def enabled?(method_name)
92
- enabled_methods.include?(method_name)
93
- end
94
-
95
- def enabled_methods
96
- cop_config
97
- .fetch('EnabledMethods', [])
98
- .map(&:to_sym)
99
- end
100
- end
101
- end
102
- end
103
- end
104
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Checks for usage of deprecated style methods.
9
- # #
10
- # # @example when using `assert_style`
11
- # # # bad
12
- # # page.find(:css, '#first').assert_style(display: 'block')
13
- # #
14
- # # # good
15
- # # page.find(:css, '#first').assert_matches_style(display: 'block')
16
- # #
17
- # # @example when using `has_style?`
18
- # # # bad
19
- # # expect(page.find(:css, 'first')
20
- # # .has_style?(display: 'block')).to be true
21
- # #
22
- # # # good
23
- # # expect(page.find(:css, 'first')
24
- # # .matches_style?(display: 'block')).to be true
25
- # #
26
- # # @example when using `have_style`
27
- # # # bad
28
- # # expect(page).to have_style(display: 'block')
29
- # #
30
- # # # good
31
- # # expect(page).to match_style(display: 'block')
32
- # #
33
- # class MatchStyle < ::RuboCop::Cop::Base; end
34
- MatchStyle = ::RuboCop::Cop::Capybara::MatchStyle
35
- end
36
- end
37
- end
38
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Enforces use of `have_no_*` or `not_to` for negated expectations.
9
- # #
10
- # # @example EnforcedStyle: not_to (default)
11
- # # # bad
12
- # # expect(page).to have_no_selector
13
- # # expect(page).to have_no_css('a')
14
- # #
15
- # # # good
16
- # # expect(page).not_to have_selector
17
- # # expect(page).not_to have_css('a')
18
- # #
19
- # # @example EnforcedStyle: have_no
20
- # # # bad
21
- # # expect(page).not_to have_selector
22
- # # expect(page).not_to have_css('a')
23
- # #
24
- # # # good
25
- # # expect(page).to have_no_selector
26
- # # expect(page).to have_no_css('a')
27
- # #
28
- # class NegationMatcher < ::RuboCop::Cop::Base; end
29
- NegationMatcher = ::RuboCop::Cop::Capybara::NegationMatcher
30
- end
31
- end
32
- end
33
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Checks for there is a more specific actions offered by Capybara.
9
- # #
10
- # # @example
11
- # #
12
- # # # bad
13
- # # find('a').click
14
- # # find('button.cls').click
15
- # # find('a', exact_text: 'foo').click
16
- # # find('div button').click
17
- # #
18
- # # # good
19
- # # click_link
20
- # # click_button(class: 'cls')
21
- # # click_link(exact_text: 'foo')
22
- # # find('div').click_button
23
- # #
24
- # class SpecificActions < ::RuboCop::Cop::Base; end
25
- SpecificActions = ::RuboCop::Cop::Capybara::SpecificActions
26
- end
27
- end
28
- end
29
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Checks if there is a more specific finder offered by Capybara.
9
- # #
10
- # # @example
11
- # # # bad
12
- # # find('#some-id')
13
- # # find('[visible][id=some-id]')
14
- # #
15
- # # # good
16
- # # find_by_id('some-id')
17
- # # find_by_id('some-id', visible: true)
18
- # #
19
- # class SpecificFinders < ::RuboCop::Cop::Base; end
20
- SpecificFinders = ::RuboCop::Cop::Capybara::SpecificFinders
21
- end
22
- end
23
- end
24
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Checks for there is a more specific matcher offered by Capybara.
9
- # #
10
- # # @example
11
- # #
12
- # # # bad
13
- # # expect(page).to have_selector('button')
14
- # # expect(page).to have_no_selector('button.cls')
15
- # # expect(page).to have_css('button')
16
- # # expect(page).to have_no_css('a.cls', href: 'http://example.com')
17
- # # expect(page).to have_css('table.cls')
18
- # # expect(page).to have_css('select')
19
- # # expect(page).to have_css('input', exact_text: 'foo')
20
- # #
21
- # # # good
22
- # # expect(page).to have_button
23
- # # expect(page).to have_no_button(class: 'cls')
24
- # # expect(page).to have_button
25
- # # expect(page).to have_no_link('foo', class: 'cls', href: 'http://example.com')
26
- # # expect(page).to have_table(class: 'cls')
27
- # # expect(page).to have_select
28
- # # expect(page).to have_field('foo')
29
- # #
30
- # class SpecificMatcher < ::RuboCop::Cop::Base; end
31
- SpecificMatcher = ::RuboCop::Cop::Capybara::SpecificMatcher
32
- end
33
- end
34
- end
35
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Capybara
7
- # @!parse
8
- # # Checks for boolean visibility in Capybara finders.
9
- # #
10
- # # Capybara lets you find elements that match a certain visibility
11
- # # using the `:visible` option. `:visible` accepts both boolean and
12
- # # symbols as values, however using booleans can have unwanted
13
- # # effects. `visible: false` does not find just invisible elements,
14
- # # but both visible and invisible elements. For expressiveness and
15
- # # clarity, use one of the # symbol values, `:all`, `:hidden` or
16
- # # `:visible`.
17
- # # Read more in
18
- # # https://www.rubydoc.info/gems/capybara/Capybara%2FNode%2FFinders:all[the documentation].
19
- # #
20
- # # @example
21
- # # # bad
22
- # # expect(page).to have_selector('.foo', visible: false)
23
- # # expect(page).to have_css('.foo', visible: true)
24
- # # expect(page).to have_link('my link', visible: false)
25
- # #
26
- # # # good
27
- # # expect(page).to have_selector('.foo', visible: :visible)
28
- # # expect(page).to have_css('.foo', visible: :all)
29
- # # expect(page).to have_link('my link', visible: :hidden)
30
- # #
31
- # class VisibilityMatcher < ::RuboCop::Cop::Base; end
32
- VisibilityMatcher = ::RuboCop::Cop::Capybara::VisibilityMatcher
33
- end
34
- end
35
- end
36
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Always declare attribute values as blocks.
9
- # #
10
- # # @example
11
- # # # bad
12
- # # kind [:active, :rejected].sample
13
- # #
14
- # # # good
15
- # # kind { [:active, :rejected].sample }
16
- # #
17
- # # # bad
18
- # # closed_at 1.day.from_now
19
- # #
20
- # # # good
21
- # # closed_at { 1.day.from_now }
22
- # #
23
- # # # bad
24
- # # count 1
25
- # #
26
- # # # good
27
- # # count { 1 }
28
- # #
29
- # class AttributeDefinedStatically < ::RuboCop::Cop::Base; end
30
- AttributeDefinedStatically =
31
- ::RuboCop::Cop::FactoryBot::AttributeDefinedStatically
32
- end
33
- end
34
- end
35
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Use a consistent style for parentheses in factory bot calls.
9
- # #
10
- # # @example
11
- # #
12
- # # # bad
13
- # # create :user
14
- # # build(:user)
15
- # # create(:login)
16
- # # create :login
17
- # #
18
- # # @example `EnforcedStyle: require_parentheses` (default)
19
- # #
20
- # # # good
21
- # # create(:user)
22
- # # create(:user)
23
- # # create(:login)
24
- # # build(:login)
25
- # #
26
- # # @example `EnforcedStyle: omit_parentheses`
27
- # #
28
- # # # good
29
- # # create :user
30
- # # build :user
31
- # # create :login
32
- # # create :login
33
- # #
34
- # # # also good
35
- # # # when method name and first argument are not on same line
36
- # # create(
37
- # # :user
38
- # # )
39
- # # build(
40
- # # :user,
41
- # # name: 'foo'
42
- # # )
43
- # #
44
- # class ConsistentParenthesesStyle < ::RuboCop::Cop::Base; end
45
- ConsistentParenthesesStyle =
46
- ::RuboCop::Cop::FactoryBot::ConsistentParenthesesStyle
47
- end
48
- end
49
- end
50
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Checks for create_list usage.
9
- # #
10
- # # This cop can be configured using the `EnforcedStyle` option
11
- # #
12
- # # @example `EnforcedStyle: create_list` (default)
13
- # # # bad
14
- # # 3.times { create :user }
15
- # #
16
- # # # good
17
- # # create_list :user, 3
18
- # #
19
- # # # bad
20
- # # 3.times { create :user, age: 18 }
21
- # #
22
- # # # good - index is used to alter the created models attributes
23
- # # 3.times { |n| create :user, age: n }
24
- # #
25
- # # # good - contains a method call, may return different values
26
- # # 3.times { create :user, age: rand }
27
- # #
28
- # # @example `EnforcedStyle: n_times`
29
- # # # bad
30
- # # create_list :user, 3
31
- # #
32
- # # # good
33
- # # 3.times { create :user }
34
- # #
35
- # class CreateList < ::RuboCop::Cop::Base; end
36
- CreateList = ::RuboCop::Cop::FactoryBot::CreateList
37
- end
38
- end
39
- end
40
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Use string value when setting the class attribute explicitly.
9
- # #
10
- # # This cop would promote faster tests by lazy-loading of
11
- # # application files. Also, this could help you suppress potential
12
- # # bugs in combination with external libraries by avoiding a preload
13
- # # of application files from the factory files.
14
- # #
15
- # # @example
16
- # # # bad
17
- # # factory :foo, class: Foo do
18
- # # end
19
- # #
20
- # # # good
21
- # # factory :foo, class: 'Foo' do
22
- # # end
23
- # #
24
- # class FactoryClassName < ::RuboCop::Cop::Base; end
25
- FactoryClassName = ::RuboCop::Cop::FactoryBot::FactoryClassName
26
- end
27
- end
28
- end
29
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Checks for name style for argument of FactoryBot::Syntax::Methods.
9
- # #
10
- # # @example EnforcedStyle: symbol (default)
11
- # # # bad
12
- # # create('user')
13
- # # build "user", username: "NAME"
14
- # #
15
- # # # good
16
- # # create(:user)
17
- # # build :user, username: "NAME"
18
- # #
19
- # # @example EnforcedStyle: string
20
- # # # bad
21
- # # create(:user)
22
- # # build :user, username: "NAME"
23
- # #
24
- # # # good
25
- # # create('user')
26
- # # build "user", username: "NAME"
27
- # #
28
- # class FactoryNameStyle < ::RuboCop::Cop::Base; end
29
- FactoryNameStyle = ::RuboCop::Cop::FactoryBot::FactoryNameStyle
30
- end
31
- end
32
- end
33
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module FactoryBot
7
- # @!parse
8
- # # Use shorthands from `FactoryBot::Syntax::Methods` in your specs.
9
- # #
10
- # # @safety
11
- # # The autocorrection is marked as unsafe because the cop
12
- # # cannot verify whether you already include
13
- # # `FactoryBot::Syntax::Methods` in your test suite.
14
- # #
15
- # # If you're using Rails, add the following configuration to
16
- # # `spec/support/factory_bot.rb` and be sure to require that file
17
- # # in `rails_helper.rb`:
18
- # #
19
- # # [source,ruby]
20
- # # ----
21
- # # RSpec.configure do |config|
22
- # # config.include FactoryBot::Syntax::Methods
23
- # # end
24
- # # ----
25
- # #
26
- # # If you're not using Rails:
27
- # #
28
- # # [source,ruby]
29
- # # ----
30
- # # RSpec.configure do |config|
31
- # # config.include FactoryBot::Syntax::Methods
32
- # #
33
- # # config.before(:suite) do
34
- # # FactoryBot.find_definitions
35
- # # end
36
- # # end
37
- # # ----
38
- # #
39
- # # @example
40
- # # # bad
41
- # # FactoryBot.create(:bar)
42
- # # FactoryBot.build(:bar)
43
- # # FactoryBot.attributes_for(:bar)
44
- # #
45
- # # # good
46
- # # create(:bar)
47
- # # build(:bar)
48
- # # attributes_for(:bar)
49
- # #
50
- # class SyntaxMethods < ::RuboCop::Cop::Base; end
51
- SyntaxMethods = ::RuboCop::Cop::FactoryBot::SyntaxMethods
52
- end
53
- end
54
- end
55
- end