From 1ec40e312d9f110da80f89bf3403c314e620b80f Mon Sep 17 00:00:00 2001 From: Thomas Noe <2mas@hey.com> Date: Sat, 19 Mar 2022 18:52:46 -0600 Subject: [PATCH] Add VerifiedDoubleReference cop --- CHANGELOG.md | 2 + config/default.yml | 10 ++ docs/modules/ROOT/pages/cops.adoc | 1 + docs/modules/ROOT/pages/cops_rspec.adoc | 75 ++++++++++++ .../cop/rspec/verified_double_reference.rb | 111 ++++++++++++++++++ lib/rubocop/cop/rspec_cops.rb | 1 + .../rspec/verified_double_reference_spec.rb | 82 +++++++++++++ 7 files changed, 282 insertions(+) create mode 100644 lib/rubocop/cop/rspec/verified_double_reference.rb create mode 100644 spec/rubocop/cop/rspec/verified_double_reference_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 8035553f0..562474353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Master (Unreleased) +* Add `RSpec/VerifiedDoubleReference` cop. ([@t3h2mas][]) * Fix a false positive for `RSpec/EmptyExampleGroup` when expectations in case statement. ([@ydah][]) @@ -675,3 +676,4 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features. [@harry-graham]: https://github.com/harry-graham [@oshiro3]: https://github.com/oshiro3 [@ydah]: https://github.com/ydah +[@t3h2mas]: https://github.com/t3h2mas diff --git a/config/default.yml b/config/default.yml index 4db941ebc..89a507887 100644 --- a/config/default.yml +++ b/config/default.yml @@ -761,6 +761,16 @@ RSpec/VariableName: VersionChanged: '1.43' Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VariableName +RSpec/VerifiedDoubleReference: + Description: Checks for consistent verified double reference style. + Enabled: pending + EnforcedStyle: constant + SupportedStyles: + - constant + - string + VersionAdded: 2.10.0 + Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VerifiedDoubleReference + RSpec/VerifiedDoubles: Description: Prefer using verifying doubles over normal doubles. Enabled: true diff --git a/docs/modules/ROOT/pages/cops.adoc b/docs/modules/ROOT/pages/cops.adoc index 1b978708e..05a4127e8 100644 --- a/docs/modules/ROOT/pages/cops.adoc +++ b/docs/modules/ROOT/pages/cops.adoc @@ -83,6 +83,7 @@ * xref:cops_rspec.adoc#rspecunspecifiedexception[RSpec/UnspecifiedException] * xref:cops_rspec.adoc#rspecvariabledefinition[RSpec/VariableDefinition] * xref:cops_rspec.adoc#rspecvariablename[RSpec/VariableName] +* xref:cops_rspec.adoc#rspecverifieddoublereference[RSpec/VerifiedDoubleReference] * xref:cops_rspec.adoc#rspecverifieddoubles[RSpec/VerifiedDoubles] * xref:cops_rspec.adoc#rspecvoidexpect[RSpec/VoidExpect] * xref:cops_rspec.adoc#rspecyield[RSpec/Yield] diff --git a/docs/modules/ROOT/pages/cops_rspec.adoc b/docs/modules/ROOT/pages/cops_rspec.adoc index fc4be0231..fb19a5fd0 100644 --- a/docs/modules/ROOT/pages/cops_rspec.adoc +++ b/docs/modules/ROOT/pages/cops_rspec.adoc @@ -4300,6 +4300,81 @@ let(:userFood_2) { 'fettuccine' } * https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VariableName +== RSpec/VerifiedDoubleReference + +|=== +| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed + +| Pending +| Yes +| Yes +| 2.10.0 +| - +|=== + +Checks for consistent verified double reference style. + +Only investigates references that are one of the supported styles. + +This cop can be configured in your configuration using the +`EnforcedStyle` option and supports `--auto-gen-config`. + +=== Examples + +==== `EnforcedStyle: constant` (default) + +[source,ruby] +---- +# bad +let(:foo) do + instance_double('ClassName', method_name: 'returned_value') +end + +# good +let(:foo) do + instance_double(ClassName, method_name: 'returned_value') +end +---- + +==== `EnforcedStyle: string` + +[source,ruby] +---- +# bad +let(:foo) do + instance_double(ClassName, method_name: 'returned_value') +end + +# good +let(:foo) do + instance_double('ClassName', method_name: 'returned_value') +end +---- + +==== Reference is not in the supported style list. No enforcement + +[source,ruby] +---- +# good +let(:foo) do + instance_double(@klass, method_name: 'returned_value') +end +---- + +=== Configurable attributes + +|=== +| Name | Default value | Configurable values + +| EnforcedStyle +| `constant` +| `constant`, `string` +|=== + +=== References + +* https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VerifiedDoubleReference + == RSpec/VerifiedDoubles |=== diff --git a/lib/rubocop/cop/rspec/verified_double_reference.rb b/lib/rubocop/cop/rspec/verified_double_reference.rb new file mode 100644 index 000000000..7d15199f5 --- /dev/null +++ b/lib/rubocop/cop/rspec/verified_double_reference.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module RSpec + # Checks for consistent verified double reference style. + # + # Only investigates references that are one of the supported styles. + # + # @see https://relishapp.com/rspec/rspec-mocks/docs/verifying-doubles + # + # This cop can be configured in your configuration using the + # `EnforcedStyle` option and supports `--auto-gen-config`. + # + # @example `EnforcedStyle: constant` (default) + # # bad + # let(:foo) do + # instance_double('ClassName', method_name: 'returned_value') + # end + # + # # good + # let(:foo) do + # instance_double(ClassName, method_name: 'returned_value') + # end + # + # @example `EnforcedStyle: string` + # # bad + # let(:foo) do + # instance_double(ClassName, method_name: 'returned_value') + # end + # + # # good + # let(:foo) do + # instance_double('ClassName', method_name: 'returned_value') + # end + # + # @example Reference is not in the supported style list. No enforcement + # + # # good + # let(:foo) do + # instance_double(@klass, method_name: 'returned_value') + # end + class VerifiedDoubleReference < Base + extend AutoCorrector + include ConfigurableEnforcedStyle + + MSG = 'Use a %