diff --git a/CHANGELOG.md b/CHANGELOG.md index cad75145..8f9153da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Master (Unreleased) +- Add `RSpecRails/PendingOnlyExampleGroup` cop. ([@r7kamura]) + ## 2.30.0 (2024-06-12) - Fix an runtime error for rubocop-rspec +3.0. ([@bquorning]) diff --git a/config/default.yml b/config/default.yml index 51ec8889..4c27e95b 100644 --- a/config/default.yml +++ b/config/default.yml @@ -77,6 +77,12 @@ RSpecRails/NegationBeValid: VersionChanged: '2.29' Reference: https://www.rubydoc.info/gems/rubocop-rspec_rails/RuboCop/Cop/RSpecRails/NegationBeValid +RSpecRails/PendingOnlyExampleGroup: + Description: Remove pending-only test files. + Enabled: pending + VersionAdded: "<>" + Reference: https://www.rubydoc.info/gems/rubocop-rspec_rails/RuboCop/Cop/RSpecRails/PendingOnlyExampleGroup + RSpecRails/TravelAround: Description: Prefer to travel in `before` rather than `around`. Enabled: pending diff --git a/docs/modules/ROOT/pages/cops.adoc b/docs/modules/ROOT/pages/cops.adoc index b4fc11c6..c90ddfb7 100644 --- a/docs/modules/ROOT/pages/cops.adoc +++ b/docs/modules/ROOT/pages/cops.adoc @@ -8,6 +8,7 @@ * xref:cops_rspecrails.adoc#rspecrailsinferredspectype[RSpecRails/InferredSpecType] * xref:cops_rspecrails.adoc#rspecrailsminitestassertions[RSpecRails/MinitestAssertions] * xref:cops_rspecrails.adoc#rspecrailsnegationbevalid[RSpecRails/NegationBeValid] +* xref:cops_rspecrails.adoc#rspecrailspendingonlyexamplegroup[RSpecRails/PendingOnlyExampleGroup] * xref:cops_rspecrails.adoc#rspecrailstravelaround[RSpecRails/TravelAround] // END_COP_LIST diff --git a/docs/modules/ROOT/pages/cops_rspecrails.adoc b/docs/modules/ROOT/pages/cops_rspecrails.adoc index 685e6b6c..5563e01c 100644 --- a/docs/modules/ROOT/pages/cops_rspecrails.adoc +++ b/docs/modules/ROOT/pages/cops_rspecrails.adoc @@ -377,6 +377,34 @@ expect(foo).to be_invalid.or be_even * https://www.rubydoc.info/gems/rubocop-rspec_rails/RuboCop/Cop/RSpecRails/NegationBeValid +== RSpecRails/PendingOnlyExampleGroup + +|=== +| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed + +| Pending +| Yes +| No +| <> +| - +|=== + +Remove pending-only test files. + +=== Examples + +[source,ruby] +---- +# bad +RSpec.describe Post do + pending "add some examples to (or delete) #{__FILE__}" +end +---- + +=== References + +* https://www.rubydoc.info/gems/rubocop-rspec_rails/RuboCop/Cop/RSpecRails/PendingOnlyExampleGroup + == RSpecRails/TravelAround |=== diff --git a/lib/rubocop/cop/rspec_rails/pending_only_example_group.rb b/lib/rubocop/cop/rspec_rails/pending_only_example_group.rb new file mode 100644 index 00000000..d9c8202a --- /dev/null +++ b/lib/rubocop/cop/rspec_rails/pending_only_example_group.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module RSpecRails + # Remove pending-only test files. + # + # @example + # # bad + # RSpec.describe Post do + # pending "add some examples to (or delete) #{__FILE__}" + # end + class PendingOnlyExampleGroup < ::RuboCop::Cop::Base + MSG = 'Remove pending-only test files.' + + RESTRICT_ON_SEND = %i[ + describe + ].freeze + + # @!method pending_only_example_group?(node) + def_node_matcher :pending_only_example_group?, <<~PATTERN + (block + (send (const nil? :RSpec) :describe ...) + (args) + (send nil? :pending ...) + ) + PATTERN + + def on_send(node) + block_node = node.parent + return unless pending_only_example_group?(block_node) + + add_offense(block_node) + end + end + end + end +end diff --git a/lib/rubocop/cop/rspec_rails_cops.rb b/lib/rubocop/cop/rspec_rails_cops.rb index 1a101b34..64b9e0e1 100644 --- a/lib/rubocop/cop/rspec_rails_cops.rb +++ b/lib/rubocop/cop/rspec_rails_cops.rb @@ -6,4 +6,5 @@ require_relative 'rspec_rails/inferred_spec_type' require_relative 'rspec_rails/minitest_assertions' require_relative 'rspec_rails/negation_be_valid' +require_relative 'rspec_rails/pending_only_example_group' require_relative 'rspec_rails/travel_around' diff --git a/spec/rubocop/cop/rspec_rails/pending_only_example_group_spec.rb b/spec/rubocop/cop/rspec_rails/pending_only_example_group_spec.rb new file mode 100644 index 00000000..baea7336 --- /dev/null +++ b/spec/rubocop/cop/rspec_rails/pending_only_example_group_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +RSpec.describe RuboCop::Cop::RSpecRails::PendingOnlyExampleGroup do + context 'with pending only example group' do + it 'registers offense' do + expect_offense(<<~RUBY) + RSpec.describe Post do + ^^^^^^^^^^^^^^^^^^^^^^ Remove pending-only test files. + pending "add some examples to (or delete) \#{__FILE__}" + end + RUBY + end + end + + context 'with some examples' do + it 'registers no offense' do + expect_no_offenses(<<~RUBY) + RSpec.describe Post do + pending "TODO" + + it 'does something' do + expect(foo).to eq(1) + end + end + RUBY + end + end +end