metasploit-framework/spec/tools/dev/rubocop_runner_spec.rb

80 lines
2.2 KiB
Ruby

require 'spec_helper'
require Metasploit::Framework.root.join('tools/dev/msftidy.rb').to_path
RSpec.describe RuboCopRunner do
# Metasploit globally sets `::Encoding.default_internal`, which
# breaks reading Rubocop's ability to load its default config file
# as UTF-8.
#
# Note that this is a test only issue, as msftidy runs in its own
# Ruby process and doesn't load Metasploit which causes this issue
def patch_io_read_encoding
original_read = IO.method(:read)
allow(IO).to receive(:read) do |absolute_path, **kwargs|
original_read.call(absolute_path, **kwargs.merge(encoding: ::Encoding.default_internal))
end
end
before(:each) do
patch_io_read_encoding
end
context 'with a tidy module' do
let(:file) { File.expand_path('modules/auxiliary/auxiliary_rubocopped.rb', FILE_FIXTURES_PATH) }
before(:each) do
allow(subject).to receive(:requires_rubocop?).and_return(true)
@stdout = get_stdout do
@status = subject.run(file)
end
end
it 'returns zero (no warnings or errors)' do
expect(@status).to be_zero
end
it 'contains no warnings' do
expect(@stdout).to match 'no offenses detected'
end
end
context 'with an untidy tidy module' do
let(:file) { File.expand_path('modules/exploits/existing_auto_target.rb', FILE_FIXTURES_PATH) }
before(:each) do
allow(subject).to receive(:requires_rubocop?).and_return(true)
@stdout = get_stdout do
@status = subject.run(file)
end
end
it 'returns zero (no warnings or errors)' do
expect(@status).to_not be_zero
end
it 'contains no warnings' do
expect(@stdout).to match 'Rubocop failed'
end
end
context 'with an untidy module that is marked as too old for requiring linting' do
let(:file) { File.expand_path('modules/exploits/existing_auto_target.rb', FILE_FIXTURES_PATH) }
before(:each) do
allow(subject).to receive(:requires_rubocop?).and_return(false)
@stdout = get_stdout do
@status = subject.run(file)
end
end
it 'returns zero (no warnings or errors)' do
expect(@status).to be_zero
end
it 'contains no warnings' do
expect(@stdout).to be_empty
end
end
end