94 lines
2.8 KiB
Ruby
94 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe WPScan::Controller::VulnApi do
|
|
subject(:controller) { described_class.new }
|
|
let(:target_url) { 'http://ex.lo/' }
|
|
let(:cli_args) { "--url #{target_url}" }
|
|
|
|
before do
|
|
WPScan::ParsedCli.options = rspec_parsed_options(cli_args)
|
|
end
|
|
|
|
describe '#cli_options' do
|
|
its(:cli_options) { should_not be_empty }
|
|
its(:cli_options) { should be_a Array }
|
|
|
|
it 'contains to correct options' do
|
|
expect(controller.cli_options.map(&:to_sym)).to eq %i[api_token]
|
|
end
|
|
end
|
|
|
|
describe '#before_scan' do
|
|
context 'when no --api-token provided' do
|
|
its(:before_scan) { should be nil }
|
|
end
|
|
|
|
context 'when --api-token given' do
|
|
let(:cli_args) { "#{super()} --api-token token" }
|
|
|
|
context 'when the token is invalid' do
|
|
before { expect(WPScan::DB::VulnApi).to receive(:status).and_return('error' => 'HTTP Token: Access denied.') }
|
|
|
|
it 'raise an InvalidApiToken error' do
|
|
expect { controller.before_scan }.to raise_error(WPScan::Error::InvalidApiToken)
|
|
end
|
|
end
|
|
|
|
context 'when the token is valid' do
|
|
context 'when the limit has been reached' do
|
|
before do
|
|
expect(WPScan::DB::VulnApi)
|
|
.to receive(:status)
|
|
.and_return('success' => true, 'plan' => 'free', 'requests_remaining' => 0)
|
|
end
|
|
|
|
it 'raises an ApiLimitReached error' do
|
|
expect { controller.before_scan }.to raise_error(WPScan::Error::ApiLimitReached)
|
|
end
|
|
end
|
|
|
|
context 'when a HTTP error, like a timeout' do
|
|
before do
|
|
expect(WPScan::DB::VulnApi)
|
|
.to receive(:status)
|
|
.and_return(
|
|
'http_error' => WPScan::Error::HTTP.new(
|
|
Typhoeus::Response.new(effective_url: 'mock-url', return_code: 28)
|
|
)
|
|
)
|
|
end
|
|
|
|
it 'raises an HTTP error' do
|
|
expect { controller.before_scan }
|
|
.to raise_error(WPScan::Error::HTTP, 'HTTP Error: mock-url (Timeout was reached)')
|
|
end
|
|
end
|
|
|
|
context 'when the token is valid and no HTTP error' do
|
|
before do
|
|
expect(WPScan::DB::VulnApi)
|
|
.to receive(:status)
|
|
.and_return('success' => true, 'plan' => 'free', 'requests_remaining' => requests)
|
|
end
|
|
|
|
context 'when limited requests' do
|
|
let(:requests) { 100 }
|
|
|
|
it 'does not raise an error' do
|
|
expect { controller.before_scan }.to_not raise_error
|
|
end
|
|
|
|
context 'when unlimited requests' do
|
|
let(:requests) { 'Unlimited' }
|
|
|
|
it 'does not raise an error' do
|
|
expect { controller.before_scan }.to_not raise_error
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|