Skip to content

Commit

Permalink
Merge pull request #184 from nevir/refactor/reduce-MultipleExpectatio…
Browse files Browse the repository at this point in the history
…ns_Max

Fix MultipleExpectations violations
  • Loading branch information
backus authored Aug 14, 2016
2 parents c7c919a + 6277093 commit 6369553
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 112 deletions.
2 changes: 0 additions & 2 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
require: rubocop-rspec

inherit_from: .rubocop_todo.yml

AllCops:
DisplayCopNames: true
TargetRubyVersion: 2.2
Expand Down
11 changes: 0 additions & 11 deletions .rubocop_todo.yml

This file was deleted.

67 changes: 39 additions & 28 deletions spec/rubocop/cop/rspec/example_length_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,60 +47,71 @@
expect(cop.offenses).to be_empty
end

it "doesn't allow a long example" do
it 'ignores comments' do
inspect_source(
cop,
[
'it do',
' line 1',
' line 2',
' # comment',
' line 3',
' line 4',
'end'
],
'spec/foo_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages).to eq(['Example has too many lines. [4/3]'])
expect(cop.offenses).to be_empty
end

it 'ignores comments' do
inspect_source(
cop,
shared_examples 'large example violation' do
before do
inspect_source(cop, source, 'spec/foo_spec.rb')
end

it 'flags an offense' do
expect(cop.offenses.size).to eq(1)
end

it 'registers the offense on line 1' do
expect(cop.offenses.map(&:line)).to eq([1])
end

it 'adds a message saying the example has too many lines' do
expect(cop.messages).to eq(['Example has too many lines. [4/3]'])
end
end

context 'when inspecting large examples' do
let(:source) do
[
'it do',
' line 1',
' line 2',
' # comment',
' line 3',
' line 4',
'end'
],
'spec/foo_spec.rb'
)
expect(cop.offenses).to be_empty
]
end

include_examples 'large example violation'
end

context 'with CountComments enabled' do
let(:cop_config) do
{ 'Max' => 3, 'CountComments' => true }
end

it 'counts comments' do
inspect_source(
cop, [
'it do',
' line 1',
' line 2',
' # comment',
' line 3',
'end'
],
'spec/foo_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages).to eq(['Example has too many lines. [4/3]'])
let(:source) do
[
'it do',
' line 1',
' line 2',
' # comment',
' line 3',
'end'
]
end

include_examples 'large example violation'
end
end
119 changes: 48 additions & 71 deletions spec/rubocop/cop/rspec/file_path_spec.rb
Original file line number Diff line number Diff line change
@@ -1,71 +1,60 @@
describe RuboCop::Cop::RSpec::FilePath, :config do
subject(:cop) { described_class.new(config) }

it 'checks the path' do
inspect_source(
cop,
"describe MyClass, 'foo' do; end",
'wrong_path_foo_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages)
.to eq(['Spec path should end with `my_class*foo*_spec.rb`'])
shared_examples 'invalid spec path' do |source, expected:, actual:|
context "when `#{source}` is defined in #{actual}" do
before do
inspect_source(cop, source, actual)
end

it 'flags an offense' do
expect(cop.offenses.size).to eq(1)
end

it 'registers the offense on line 1' do
expect(cop.offenses.map(&:line)).to eq([1])
end

it 'adds a message saying what the path should end with' do
expect(cop.messages).to eql(["Spec path should end with `#{expected}`"])
end
end
end

it 'checks the path' do
inspect_source(
cop,
"describe MyClass, '#foo' do; end",
'wrong_class_foo_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages)
.to eq(['Spec path should end with `my_class*foo*_spec.rb`'])
end
include_examples 'invalid spec path',
"describe MyClass, 'foo' do; end",
expected: 'my_class*foo*_spec.rb',
actual: 'wrong_path_foo_spec.rb'

it 'flags foo_spec.rb.rb' do
inspect_source(
cop,
"describe MyClass, '#foo' do; end",
'my_class/foo_spec.rb.rb'
)
expect(cop.offenses.size).to eq(1)
end
include_examples 'invalid spec path',
"describe MyClass, '#foo' do; end",
expected: 'my_class*foo*_spec.rb',
actual: 'wrong_class_foo_spec.rb'

it 'flags foo_specorb' do
inspect_source(
cop,
"describe MyClass, '#foo' do; end",
'my_class/foo_specorb'
)
expect(cop.offenses.size).to eq(1)
end
include_examples 'invalid spec path',
"describe MyClass, '#foo' do; end",
expected: 'my_class*foo*_spec.rb',
actual: 'my_class/foo_spec.rb.rb'

it 'checks path even when metadata is included' do
inspect_source(
cop,
"describe MyClass, '#foo', blah: :blah do; end",
'wrong_class_foo_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages)
.to eq(['Spec path should end with `my_class*foo*_spec.rb`'])
end
include_examples 'invalid spec path',
"describe MyClass, '#foo' do; end",
expected: 'my_class*foo*_spec.rb',
actual: 'my_class/foo_specorb'

it 'checks class spec paths' do
inspect_source(
cop,
'describe MyClass do; end',
'wrong_class_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages)
.to eq(['Spec path should end with `my_class*_spec.rb`'])
end
include_examples 'invalid spec path',
"describe MyClass, '#foo', blah: :blah do; end",
expected: 'my_class*foo*_spec.rb',
actual: 'wrong_class_foo_spec.rb'

include_examples 'invalid spec path',
'describe MyClass do; end',
expected: 'my_class*_spec.rb',
actual: 'wrong_class_spec.rb'

include_examples 'invalid spec path',
'describe MyClass, :foo do; end',
expected: 'my_class*_spec.rb',
actual: 'wrong_class_spec.rb'

it 'skips specs that do not describe a class / method' do
inspect_source(
Expand All @@ -88,18 +77,6 @@
expect(cop.offenses).to be_empty
end

it 'ignores second argument if is not a string' do
inspect_source(
cop,
'describe MyClass, :foo do; end',
'wrong_class_spec.rb'
)
expect(cop.offenses.size).to eq(1)
expect(cop.offenses.map(&:line).sort).to eq([1])
expect(cop.messages)
.to eq(['Spec path should end with `my_class*_spec.rb`'])
end

it 'checks class specs' do
inspect_source(
cop,
Expand Down

0 comments on commit 6369553

Please sign in to comment.