Skip to content

Commit

Permalink
Complete branch coverage for more files
Browse files Browse the repository at this point in the history
  • Loading branch information
corsonknowles committed Nov 2, 2024
1 parent e80d28c commit 664b1f5
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 7 deletions.
7 changes: 4 additions & 3 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
# This configuration was generated by
# `rubocop --auto-gen-config --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.63.4.
# using RuboCop version 1.66.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

Lint/ToEnumArguments:
# This cop supports safe autocorrection (--autocorrect).
InternalAffairs/RedundantMessageArgument:
Exclude:
- 'lib/rubocop/cop/rspec/multiple_expectations.rb'
- 'lib/rubocop/cop/rspec/context_wording.rb'

Rake/MethodDefinitionInTask:
Exclude:
Expand Down
2 changes: 1 addition & 1 deletion .simplecov
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

SimpleCov.start do
enable_coverage :branch
minimum_coverage line: 100, branch: 97.43
minimum_coverage line: 100, branch: 98.19
add_filter '/spec/'
add_filter '/vendor/bundle/'
end
2 changes: 1 addition & 1 deletion lib/rubocop/rspec/hook.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def metadata
private

def valid_scope?(node)
node&.sym_type? && Language::HookScopes.all(node.value)
node.sym_type? && Language::HookScopes.all(node.value)
end

def transform_metadata(meta)
Expand Down
10 changes: 10 additions & 0 deletions spec/rubocop/cop/rspec/instance_spy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@
end
RUBY
end

it 'ignores instance_double when expect is called on another variable' do
expect_no_offenses(<<~RUBY)
it do
foo = instance_double(Foo).as_null_object
bar = instance_spy(Bar).as_null_object
expect(bar).to have_received(:baz)
end
RUBY
end
end

context 'when not used with `have_received`' do
Expand Down
19 changes: 19 additions & 0 deletions spec/rubocop/cop/rspec/stubbed_mock_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,23 @@
.with(bar).and_return baz
RUBY
end

describe '#replacement', :config do
it 'returns "allow" for :expect' do
expect(cop.send(:replacement, :expect)).to eq(:allow)
end

it 'returns "allow(subject)" for :is_expected' do
expect(cop.send(:replacement, :is_expected)).to eq('allow(subject)')
end

it 'returns "allow_any_instance_of" for :expect_any_instance_of' do
expect(cop.send(:replacement,
:expect_any_instance_of)).to eq(:allow_any_instance_of)
end

it 'falls through silently and returns nil for unknown methods' do
expect(cop.send(:replacement, :unknown_method)).to be_nil
end
end
end
25 changes: 25 additions & 0 deletions spec/rubocop/rspec/config_formatter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,29 @@
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Baz
YAML
end

describe '#unified_config' do
context 'when cop is in SUBDEPARTMENTS or AMENDMENTS' do
let(:config) do
{ 'RSpec/SubDepartment' => {}, 'Metrics/BlockLength' => {} }
end
let(:descriptions) do
{ 'RSpec/SubDepartment' => {}, 'Metrics/BlockLength' => {} }
end

before do
stub_const('RuboCop::RSpec::ConfigFormatter::SUBDEPARTMENTS',
['RSpec/SubDepartment'])
stub_const('RuboCop::RSpec::ConfigFormatter::AMENDMENTS',
['Metrics/BlockLength'])
end

it 'skips processing for those cops' do
formatter = described_class.new(config, descriptions)
unified_config = formatter.send(:unified_config)
expect(unified_config['RSpec/SubDepartment']).to eq({})
expect(unified_config['Metrics/BlockLength']).to eq({})
end
end
end
end
34 changes: 32 additions & 2 deletions spec/rubocop/rspec/hook_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ def hook(source)
.to be(:each)
end

it 'ignores invalid hooks' do
expect(hook('before(:invalid) { example_setup }').scope)
.to be_nil
end

it 'classifies :each as an example hook' do
expect(hook('before(:each) { }').example?).to be(true)
end
Expand Down Expand Up @@ -75,9 +80,13 @@ def metadata(source)
end

if RUBY_VERSION >= '3.4'
let(:expected_focus) { 's(:sym, :focus) => true' }
let(:expected_invalid) { '{s(:sym, :invalid) => true}' }
let(:expected_special) { 's(:sym, :special) => true' }
let(:expected_symbol) { 's(:sym, :symbol) => true' }
else
let(:expected_focus) { 's(:sym, :focus)=>true' }
let(:expected_invalid) { '{s(:sym, :invalid)=>true}' }
let(:expected_special) { 's(:sym, :special)=>true' }
let(:expected_symbol) { 's(:sym, :symbol)=>true' }
end
Expand All @@ -103,8 +112,29 @@ def metadata(source)
end

it 'withstands no arguments' do
expect(metadata('before { foo }'))
.to be_empty
expect(metadata('before { foo }')).to be_empty
end

it 'returns the symbol even when an invalid symbol scope is provided' do
expect(metadata('before(:invalid) { foo }')).to eq(expected_invalid)
end

it 'extracts multiple symbol metadata' do
expect(metadata('before(:example, :special, :focus) { foo }'))
.to eq("{#{expected_special}, #{expected_focus}}")
end

it 'extracts multiple hash metadata' do
expect(metadata('before(:example, special: true, focus: true) { foo }'))
.to eq("{#{expected_special}, #{expected_focus}}")
end

it 'combines multiple symbol and hash metadata' do
expect(
metadata(
'before(:example, :symbol, special: true, focus: true) { foo }'
)
).to eq("{#{expected_symbol}, #{expected_special}, #{expected_focus}}")
end
end
end
40 changes: 40 additions & 0 deletions spec/rubocop/rspec/inject_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# frozen_string_literal: true

RSpec.describe RuboCop::RSpec::Inject do
describe '.defaults!' do
let(:config_loader) { class_double(RuboCop::ConfigLoader).as_stubbed_const }
let(:rubocop_config) { instance_double(RuboCop::Config) }

before do
allow(config_loader).to receive(:send)
.with(:load_yaml_configuration, any_args)
.and_return({})
allow(RuboCop::Config).to receive(:new).and_return(rubocop_config)
allow(config_loader).to receive(:merge_with_default)
.and_return(rubocop_config)
allow(config_loader).to receive(:instance_variable_set)
end

context 'when ConfigLoader.debug? is true' do
before do
allow(config_loader).to receive(:debug?).and_return(true)
end

it 'puts the configuration path' do
expect { described_class.defaults! }.to output(
%r{configuration from .*rubocop-rspec/config/default.yml}
).to_stdout
end
end

context 'when ConfigLoader.debug? is false' do
before do
allow(config_loader).to receive(:debug?).and_return(false)
end

it 'does not put the configuration path' do
expect { described_class.defaults! }.not_to output.to_stdout
end
end
end
end

0 comments on commit 664b1f5

Please sign in to comment.