80 lines
2.2 KiB
Ruby
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
|