Skip to content

Commit

Permalink
[Fix #2001] Add new RedundantContext cop
Browse files Browse the repository at this point in the history
To check context with single example.

Closes #2001
  • Loading branch information
tejasbubane committed Jan 8, 2025
1 parent 162d91a commit b5295a5
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,5 @@ Style/YAMLFileRead: {Enabled: true}
#
RSpec/StringAsInstanceDoubleConstant:
Enabled: true
RSpec/RedundantContext:
Enabled: true
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Master (Unreleased)

* Add new `RSpec/RedundantContext` cop. ([@tejasbubane])

## 3.3.0 (2024-12-12)

- Deprecate `top_level_group?` method from `TopLevelGroup` mixin as all of its callers were intentionally removed from `Rubocop/RSpec`. ([@corsonknowles])
Expand Down
6 changes: 6 additions & 0 deletions config/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,12 @@ RSpec/RedundantAround:
VersionAdded: '2.19'
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/RedundantAround

RSpec/RedundantContext:
Description: Detect redundant `context` hook.
Enabled: pending
VersionAdded: "<<next>>"
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/RedundantContext

RSpec/RedundantPredicateMatcher:
Description: Checks for redundant predicate matcher.
Enabled: true
Expand Down
39 changes: 39 additions & 0 deletions lib/rubocop/cop/rspec/redundant_context.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# frozen_string_literal: true

module RuboCop
module Cop
module RSpec
# Detect redundant `context` hook.
#
# @example
# # bad
# context 'when condition' do
# it 'tests something' do
# end
# end
#
# # good
# it 'tests something when condition' do
# end
#
class RedundantContext < Base
MSG = 'Redundant context with single example.'

# @!method redundant_context?(node)
def_node_matcher :redundant_context?, <<~PATTERN
(block
(send #rspec? :context _)
_
(block (send _ :it ...) ...))
PATTERN

def on_block(node)
return unless redundant_context?(node)

add_offense(node)
end
alias on_numblock on_block
end
end
end
end
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec_cops.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
require_relative 'rspec/receive_messages'
require_relative 'rspec/receive_never'
require_relative 'rspec/redundant_around'
require_relative 'rspec/redundant_context'
require_relative 'rspec/redundant_predicate_matcher'
require_relative 'rspec/remove_const'
require_relative 'rspec/repeated_description'
Expand Down
25 changes: 25 additions & 0 deletions spec/rubocop/cop/rspec/redundant_context_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

RSpec.describe RuboCop::Cop::RSpec::RedundantContext do
it 'registers an offense when single example inside context' do
expect_offense(<<~RUBY)
context 'when condition' do
^^^^^^^^^^^^^^^^^^^^^^^^^^^ Redundant context with single example.
it 'does something' do
end
end
RUBY
end

it 'does not register offense when multiple examples inside context' do
expect_no_offenses(<<~RUBY)
context 'when condition' do
it 'does something' do
end
it 'does something else' do
end
end
RUBY
end
end

0 comments on commit b5295a5

Please sign in to comment.