Skip to content

Commit

Permalink
Add auto correct multiple expectations (#74)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bhacaz authored Dec 19, 2023
1 parent 114862f commit 8564ab6
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 1 deletion.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

# main

* Added autocorrection for `RSpec/MultipleExpectations`.
(Fix [#59](https://github.com/petalmd/rubocop-petal/issues/59)). ([#74](https://github.com/petalmd/rubocop-petal/pull/74))
* Update rubocop dependencies and minimum Ruby version. (Fix [#68](https://github.com/petalmd/rubocop-petal/issues/68)). ([#75](https://github.com/petalmd/rubocop-petal/pull/75))
* Enabled `RSpec/MultipleExpectations`. ([#73](https://github.com/petalmd/rubocop-petal/pull/73))
* Added new cops from test-prod RSpec/AggregateExamples (Fix [#59](https://github.com/petalmd/rubocop-petal/issues/59)). ([#72](https://github.com/petalmd/rubocop-petal/pull/72))
* Added new cops from test-prod RSpec/AggregateExamples. ([#72](https://github.com/petalmd/rubocop-petal/pull/72))

# v1.2.0 (2023-09-28)

Expand Down
41 changes: 41 additions & 0 deletions lib/rubocop/cop/rspec/multiple_expectations_auto_correct.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# frozen_string_literal: true

require 'rubocop-rspec'

module RuboCop
module Cop
module RSpec
module MultipleExpectationsAutoCorrect
def self.prepended(base)
base.extend(AutoCorrector)
end

private

def flag_example(node, expectation_count:)
add_offense(
node.send_node,
message: format(
MultipleExpectations::MSG,
total: expectation_count,
max: max_expectations
)
) do |corrector|
autocorrect(node, corrector)
end
end

def autocorrect(node, corrector)
if (args = node.children.first.arguments.first)
corrector.insert_after(args, ', :aggregate_failures')
else
corrector.insert_after(node.children.first, ' :aggregate_failures')
end
end
end
end
end
end

RuboCop::Cop::RSpec::MultipleExpectations
.prepend(RuboCop::Cop::RSpec::MultipleExpectationsAutoCorrect)
101 changes: 101 additions & 0 deletions spec/rubocop/cop/rspec/multiple_expectations_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# frozen_string_literal: true

# Test the cop directly
RSpec.describe RuboCop::Cop::RSpec::MultipleExpectations, :config do
it 'autocorrects multiple expectations with aggregate_failures' do
expect_offense(<<~RUBY)
describe Foo do
it 'uses expect twice' do
^^^^^^^^^^^^^^^^^^^^^^ Example has too many expectations [2/1].
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_correction(<<~RUBY)
describe Foo do
it 'uses expect twice', :aggregate_failures do
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_offense(<<~RUBY)
describe Foo do
it do
^^ Example has too many expectations [2/1].
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_correction(<<~RUBY)
describe Foo do
it :aggregate_failures do
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_offense(<<~RUBY)
describe Foo do
it('uses expect twice') do
^^^^^^^^^^^^^^^^^^^^^^^ Example has too many expectations [2/1].
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_correction(<<~RUBY)
describe Foo do
it('uses expect twice', :aggregate_failures) do
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_offense(<<~RUBY)
describe Foo do
it 'uses expect twice', timecop: true do
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Example has too many expectations [2/1].
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_correction(<<~RUBY)
describe Foo do
it 'uses expect twice', :aggregate_failures, timecop: true do
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_offense(<<~RUBY)
describe Foo do
it('uses expect twice', timecop: true) do
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Example has too many expectations [2/1].
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY

expect_correction(<<~RUBY)
describe Foo do
it('uses expect twice', :aggregate_failures, timecop: true) do
expect(foo).to eq(bar)
expect(baz).to eq(bar)
end
end
RUBY
end
end
7 changes: 7 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require 'rubocop-petal'
require 'rubocop/rspec/support'
require 'rubocop/rspec/shared_contexts/default_rspec_language_config_context'

RSpec.configure do |config|
config.include RuboCop::RSpec::ExpectOffense
Expand All @@ -13,4 +14,10 @@

config.order = :random
Kernel.srand config.seed

config.define_derived_metadata(file_path: %r{/spec/rubocop/cop/rspec/}) do |metadata|
metadata[:type] = :rspec_cops
end

config.include_context 'with default RSpec/Language config', type: :rspec_cops
end

0 comments on commit 8564ab6

Please sign in to comment.