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,179 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- # Checks that spec file paths are consistent and well-formed.
7
- #
8
- # This cop is deprecated.
9
- # We plan to remove it in the next major version update to 3.0.
10
- # The migration targets are `RSpec/SpecFilePathSuffix`
11
- # and `RSpec/SpecFilePathFormat`.
12
- # If you are using this cop, please plan for migration.
13
- #
14
- # By default, this checks that spec file paths are consistent with the
15
- # test subject and enforces that it reflects the described
16
- # class/module and its optionally called out method.
17
- #
18
- # With the configuration option `IgnoreMethods` the called out method will
19
- # be ignored when determining the enforced path.
20
- #
21
- # With the configuration option `CustomTransform` modules or classes can
22
- # be specified that should not as usual be transformed from CamelCase to
23
- # snake_case (e.g. 'RuboCop' => 'rubocop' ).
24
- #
25
- # With the configuration option `SpecSuffixOnly` test files will only
26
- # be checked to ensure they end in '_spec.rb'. This option disables
27
- # checking for consistency in the test subject or test methods.
28
- #
29
- # @example
30
- # # bad
31
- # whatever_spec.rb # describe MyClass
32
- #
33
- # # bad
34
- # my_class_spec.rb # describe MyClass, '#method'
35
- #
36
- # # good
37
- # my_class_spec.rb # describe MyClass
38
- #
39
- # # good
40
- # my_class_method_spec.rb # describe MyClass, '#method'
41
- #
42
- # # good
43
- # my_class/method_spec.rb # describe MyClass, '#method'
44
- #
45
- # @example when configuration is `IgnoreMethods: true`
46
- # # bad
47
- # whatever_spec.rb # describe MyClass
48
- #
49
- # # good
50
- # my_class_spec.rb # describe MyClass
51
- #
52
- # # good
53
- # my_class_spec.rb # describe MyClass, '#method'
54
- #
55
- # @example when configuration is `SpecSuffixOnly: true`
56
- # # good
57
- # whatever_spec.rb # describe MyClass
58
- #
59
- # # good
60
- # my_class_spec.rb # describe MyClass
61
- #
62
- # # good
63
- # my_class_spec.rb # describe MyClass, '#method'
64
- #
65
- class FilePath < Base
66
- include TopLevelGroup
67
- include Namespace
68
-
69
- MSG = 'Spec path should end with `%<suffix>s`.'
70
-
71
- # @!method example_group(node)
72
- def_node_matcher :example_group, <<~PATTERN
73
- (block
74
- $(send #rspec? _example_group $_ $...) ...
75
- )
76
- PATTERN
77
-
78
- # @!method routing_metadata?(node)
79
- def_node_search :routing_metadata?, '(pair (sym :type) (sym :routing))'
80
-
81
- def on_top_level_example_group(node)
82
- return unless top_level_groups.one?
83
-
84
- example_group(node) do |send_node, example_group, arguments|
85
- ensure_correct_file_path(send_node, example_group, arguments)
86
- end
87
- end
88
-
89
- private
90
-
91
- def ensure_correct_file_path(send_node, example_group, arguments)
92
- pattern = pattern_for(example_group, arguments)
93
- return if filename_ends_with?(pattern)
94
-
95
- # For the suffix shown in the offense message, modify the regular
96
- # expression pattern to resemble a glob pattern for clearer error
97
- # messages.
98
- offense_suffix = pattern.gsub('.*', '*').sub('[^/]', '')
99
- .sub('\.', '.')
100
- add_offense(send_node, message: format(MSG, suffix: offense_suffix))
101
- end
102
-
103
- def routing_spec?(args)
104
- args.any?(&method(:routing_metadata?)) || routing_spec_path?
105
- end
106
-
107
- def pattern_for(example_group, arguments)
108
- method_name = arguments.first
109
- if spec_suffix_only? || !example_group.const_type? ||
110
- routing_spec?(arguments)
111
- return pattern_for_spec_suffix_only
112
- end
113
-
114
- [
115
- expected_path(example_group),
116
- name_pattern(method_name),
117
- '[^/]*_spec\.rb'
118
- ].join
119
- end
120
-
121
- def pattern_for_spec_suffix_only
122
- '.*_spec\.rb'
123
- end
124
-
125
- def name_pattern(method_name)
126
- return unless method_name&.str_type?
127
- return if ignore_methods?
128
-
129
- ".*#{method_name.str_content.gsub(/\s/, '_').gsub(/\W/, '')}"
130
- end
131
-
132
- def expected_path(constant)
133
- constants = namespace(constant) + constant.const_name.split('::')
134
-
135
- File.join(
136
- constants.map do |name|
137
- custom_transform.fetch(name) { camel_to_snake_case(name) }
138
- end
139
- )
140
- end
141
-
142
- def camel_to_snake_case(string)
143
- string
144
- .gsub(/([^A-Z])([A-Z]+)/, '\1_\2')
145
- .gsub(/([A-Z])([A-Z][^A-Z\d]+)/, '\1_\2')
146
- .downcase
147
- end
148
-
149
- def custom_transform
150
- cop_config.fetch('CustomTransform', {})
151
- end
152
-
153
- def ignore_methods?
154
- cop_config['IgnoreMethods']
155
- end
156
-
157
- def filename_ends_with?(pattern)
158
- expanded_file_path.match?("#{pattern}$")
159
- end
160
-
161
- def relevant_rubocop_rspec_file?(_file)
162
- true
163
- end
164
-
165
- def spec_suffix_only?
166
- cop_config['SpecSuffixOnly']
167
- end
168
-
169
- def routing_spec_path?
170
- expanded_file_path.include?('spec/routing/')
171
- end
172
-
173
- def expanded_file_path
174
- File.expand_path(processed_source.file_path)
175
- end
176
- end
177
- end
178
- end
179
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Checks that tests use RSpec `before` hook over Rails `setup`
9
- # # method.
10
- # #
11
- # # @example
12
- # # # bad
13
- # # setup do
14
- # # allow(foo).to receive(:bar)
15
- # # end
16
- # #
17
- # # # good
18
- # # before do
19
- # # allow(foo).to receive(:bar)
20
- # # end
21
- # #
22
- # class AvoidSetupHook < RuboCop::Cop::RSpec::Base; end
23
- AvoidSetupHook = ::RuboCop::Cop::RSpecRails::AvoidSetupHook
24
- end
25
- end
26
- end
27
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Checks that tests use `have_http_status` instead of equality matchers.
9
- # #
10
- # # @example ResponseMethods: ['response', 'last_response'] (default)
11
- # # # bad
12
- # # expect(response.status).to be(200)
13
- # # expect(last_response.code).to eq("200")
14
- # #
15
- # # # good
16
- # # expect(response).to have_http_status(200)
17
- # # expect(last_response).to have_http_status(200)
18
- # #
19
- # # @example ResponseMethods: ['foo_response']
20
- # # # bad
21
- # # expect(foo_response.status).to be(200)
22
- # #
23
- # # # good
24
- # # expect(foo_response).to have_http_status(200)
25
- # #
26
- # # # also good
27
- # # expect(response).to have_http_status(200)
28
- # # expect(last_response).to have_http_status(200)
29
- # #
30
- # class HaveHttpStatus < ::RuboCop::Cop::Base; end
31
- HaveHttpStatus = ::RuboCop::Cop::RSpecRails::HaveHttpStatus
32
- end
33
- end
34
- end
35
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Enforces use of symbolic or numeric value to describe HTTP status.
9
- # #
10
- # # This cop inspects only `have_http_status` calls.
11
- # # So, this cop does not check if a method starting with `be_*` is
12
- # # used when setting for `EnforcedStyle: symbolic` or
13
- # # `EnforcedStyle: numeric`.
14
- # #
15
- # # @example `EnforcedStyle: symbolic` (default)
16
- # # # bad
17
- # # it { is_expected.to have_http_status 200 }
18
- # # it { is_expected.to have_http_status 404 }
19
- # # it { is_expected.to have_http_status "403" }
20
- # #
21
- # # # good
22
- # # it { is_expected.to have_http_status :ok }
23
- # # it { is_expected.to have_http_status :not_found }
24
- # # it { is_expected.to have_http_status :forbidden }
25
- # # it { is_expected.to have_http_status :success }
26
- # # it { is_expected.to have_http_status :error }
27
- # #
28
- # # @example `EnforcedStyle: numeric`
29
- # # # bad
30
- # # it { is_expected.to have_http_status :ok }
31
- # # it { is_expected.to have_http_status :not_found }
32
- # # it { is_expected.to have_http_status "forbidden" }
33
- # #
34
- # # # good
35
- # # it { is_expected.to have_http_status 200 }
36
- # # it { is_expected.to have_http_status 404 }
37
- # # it { is_expected.to have_http_status 403 }
38
- # # it { is_expected.to have_http_status :success }
39
- # # it { is_expected.to have_http_status :error }
40
- # #
41
- # # @example `EnforcedStyle: be_status`
42
- # # # bad
43
- # # it { is_expected.to have_http_status :ok }
44
- # # it { is_expected.to have_http_status :not_found }
45
- # # it { is_expected.to have_http_status "forbidden" }
46
- # # it { is_expected.to have_http_status 200 }
47
- # # it { is_expected.to have_http_status 404 }
48
- # # it { is_expected.to have_http_status "403" }
49
- # #
50
- # # # good
51
- # # it { is_expected.to be_ok }
52
- # # it { is_expected.to be_not_found }
53
- # # it { is_expected.to have_http_status :success }
54
- # # it { is_expected.to have_http_status :error }
55
- # #
56
- # class HttpStatus < RuboCop::Cop::RSpec::Base; end
57
- HttpStatus = ::RuboCop::Cop::RSpecRails::HttpStatus
58
- end
59
- end
60
- end
61
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Identifies redundant spec type.
9
- # #
10
- # # After setting up rspec-rails, you will have enabled
11
- # # `config.infer_spec_type_from_file_location!` by default in
12
- # # spec/rails_helper.rb. This cop works in conjunction with
13
- # # this config.
14
- # # If you disable this config, disable this cop as well.
15
- # #
16
- # # @safety
17
- # # This cop is marked as unsafe because
18
- # # `config.infer_spec_type_from_file_location!` may not be enabled.
19
- # #
20
- # # @example
21
- # # # bad
22
- # # # spec/models/user_spec.rb
23
- # # RSpec.describe User, type: :model do
24
- # # end
25
- # #
26
- # # # good
27
- # # # spec/models/user_spec.rb
28
- # # RSpec.describe User do
29
- # # end
30
- # #
31
- # # # good
32
- # # # spec/models/user_spec.rb
33
- # # RSpec.describe User, type: :common do
34
- # # end
35
- # #
36
- # # @example `Inferences` configuration
37
- # # # .rubocop.yml
38
- # # # RSpec/Rails/InferredSpecType:
39
- # # # Inferences:
40
- # # # services: service
41
- # #
42
- # # # bad
43
- # # # spec/services/user_spec.rb
44
- # # RSpec.describe User, type: :service do
45
- # # end
46
- # #
47
- # # # good
48
- # # # spec/services/user_spec.rb
49
- # # RSpec.describe User do
50
- # # end
51
- # #
52
- # # # good
53
- # # # spec/services/user_spec.rb
54
- # # RSpec.describe User, type: :common do
55
- # # end
56
- # #
57
- # class InferredSpecType < RuboCop::Cop::RSpec::Base; end
58
- InferredSpecType = ::RuboCop::Cop::RSpecRails::InferredSpecType
59
- end
60
- end
61
- end
62
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Check if using Minitest-like matchers.
9
- # #
10
- # # Check the use of minitest-like matchers
11
- # # starting with `assert_` or `refute_`.
12
- # #
13
- # # @example
14
- # # # bad
15
- # # assert_equal(a, b)
16
- # # assert_equal a, b, "must be equal"
17
- # # assert_not_includes a, b
18
- # # refute_equal(a, b)
19
- # # assert_nil a
20
- # # refute_empty(b)
21
- # # assert_true(a)
22
- # # assert_false(a)
23
- # #
24
- # # # good
25
- # # expect(b).to eq(a)
26
- # # expect(b).to(eq(a), "must be equal")
27
- # # expect(a).not_to include(b)
28
- # # expect(b).not_to eq(a)
29
- # # expect(a).to eq(nil)
30
- # # expect(a).not_to be_empty
31
- # # expect(a).to be(true)
32
- # # expect(a).to be(false)
33
- # #
34
- # class MinitestAssertions < RuboCop::Cop::RSpec::Base; end
35
- MinitestAssertions = ::RuboCop::Cop::RSpecRails::MinitestAssertions
36
- end
37
- end
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Enforces use of `be_invalid` or `not_to` for negated be_valid.
9
- # #
10
- # # @safety
11
- # # This cop is unsafe because it cannot guarantee that
12
- # # the test target is an instance of `ActiveModel::Validations``.
13
- # #
14
- # # @example EnforcedStyle: not_to (default)
15
- # # # bad
16
- # # expect(foo).to be_invalid
17
- # #
18
- # # # good
19
- # # expect(foo).not_to be_valid
20
- # #
21
- # # # good (with method chain)
22
- # # expect(foo).to be_invalid.and be_odd
23
- # #
24
- # # @example EnforcedStyle: be_invalid
25
- # # # bad
26
- # # expect(foo).not_to be_valid
27
- # #
28
- # # # good
29
- # # expect(foo).to be_invalid
30
- # #
31
- # # # good (with method chain)
32
- # # expect(foo).to be_invalid.or be_even
33
- # #
34
- # class NegationBeValid < RuboCop::Cop::RSpec::Base; end
35
- NegationBeValid = ::RuboCop::Cop::RSpecRails::NegationBeValid
36
- end
37
- end
38
- end
39
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module RSpec
6
- module Rails
7
- # @!parse
8
- # # Prefer to travel in `before` rather than `around`.
9
- # #
10
- # # @safety
11
- # # This cop is unsafe because the automatic `travel_back` is only
12
- # # run on test cases that are considered as Rails related.
13
- # #
14
- # # And also, this cop's autocorrection is unsafe because the order
15
- # # of execution will change if other steps exist before traveling
16
- # # in `around`.
17
- # #
18
- # # @example
19
- # # # bad
20
- # # around do |example|
21
- # # freeze_time do
22
- # # example.run
23
- # # end
24
- # # end
25
- # #
26
- # # # good
27
- # # before { freeze_time }
28
- # #
29
- # class TravelAround < RuboCop::Cop::RSpec::Base; end
30
- TravelAround = ::RuboCop::Cop::RSpecRails::TravelAround
31
- end
32
- end
33
- end
34
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module RSpec
5
- module Language
6
- # Helper methods to detect RSpec DSL used with send and block
7
- # @deprecated Prefer using Node Pattern directly
8
- # Use `'(block (send nil? #Example.all ...) ...)'` instead of
9
- # `block_pattern('#Example.all')`
10
- module NodePattern
11
- # @deprecated Prefer using Node Pattern directly
12
- def send_pattern(string)
13
- deprecation_warning __method__
14
- "(send #rspec? #{string} ...)"
15
- end
16
-
17
- # @deprecated Prefer using Node Pattern directly
18
- def block_pattern(string)
19
- deprecation_warning __method__
20
- "(block #{send_pattern(string)} ...)"
21
- end
22
-
23
- # @deprecated Prefer using Node Pattern directly
24
- def numblock_pattern(string)
25
- deprecation_warning __method__
26
- "(numblock #{send_pattern(string)} ...)"
27
- end
28
-
29
- # @deprecated Prefer using Node Pattern directly
30
- def block_or_numblock_pattern(string)
31
- deprecation_warning __method__
32
- "{#{block_pattern(string)} #{numblock_pattern(string)}}"
33
- end
34
-
35
- private
36
-
37
- def deprecation_warning(method)
38
- # Only warn in derived extensions' specs
39
- return unless defined?(::RSpec)
40
-
41
- Kernel.warn <<~MESSAGE, uplevel: 2
42
- Usage of #{method} is deprecated. Use node pattern explicitly.
43
- MESSAGE
44
- end
45
- end
46
- end
47
- end
48
- end