spec/lib/gdk/http_helper_spec.rb (122 lines of code) (raw):
# frozen_string_literal: true
require 'rack'
require 'spec_helper'
RSpec.describe GDK::HTTPHelper do
let(:uri) { GDK.config.__uri }
let(:path) { uri.path.empty? ? '/' : uri.path }
describe '.new' do
context 'when provided URI is not an instance of URI class' do
it 'raises error' do
expect { described_class.new('http://localhost:3000') }.to raise_error(/uri needs to be an instance of URI/)
end
end
end
subject { described_class.new(uri) }
describe '#up?' do
it 'calls #get_up?' do
expect(subject).to receive(:get_up?)
subject.up?
end
end
describe '#get_up?' do
context 'when URI is down because its not running' do
it 'returns false' do
http_client_double = stub_http
allow(http_client_double).to receive(:get).with(path).and_raise(Errno::ECONNREFUSED)
expect(subject.get_up?).to be(false)
expect(subject.last_response_reason).to eq('Connection refused')
end
end
context 'when URI is times out' do
it 'returns false' do
http_client_double = stub_http
allow(http_client_double).to receive(:get).with(path).and_raise(Net::ReadTimeout)
expect(subject.get_up?).to be(false)
expect(subject.last_response_reason).to eq('Request timed out')
end
end
context 'when URI is down because it returns a non successful HTTP code' do
it 'returns false' do
stub_http_get_with_code(502)
expect(subject.get_up?).to be(false)
expect(subject.last_response_reason).to eq('502 Bad Gateway')
end
end
context 'when URI is down initially, but then comes up' do
subject(:helper) { described_class.new(uri, cache_response: false) }
it 'returns true' do
stub_http_get_with_code(502)
expect(helper.get_up?).to be(false)
expect(helper.last_response_reason).to eq('502 Bad Gateway')
stub_http_get_with_code(200)
expect(helper.get_up?).to be(true)
expect(helper.last_response_reason).to eq('200 OK')
end
end
context 'when URI is up' do
it 'returns true' do
stub_http_get_with_code(200)
expect(subject.get_up?).to be(true)
expect(subject.last_response_reason).to eq('200 OK')
end
end
end
describe '#head_up?' do
context 'when URI is down because its not running' do
it 'returns false' do
http_client_double = stub_http
allow(http_client_double).to receive(:head).with(path).and_raise(Errno::ECONNREFUSED)
expect(subject.head_up?).to be(false)
expect(subject.last_response_reason).to eq('Connection refused')
end
end
context 'when URI is times out' do
it 'returns false' do
http_client_double = stub_http
allow(http_client_double).to receive(:head).with(path).and_raise(Net::ReadTimeout)
expect(subject.head_up?).to be(false)
expect(subject.last_response_reason).to eq('Request timed out')
end
end
context 'when URI is down because it returns a non successful HTTP code' do
it 'returns false' do
stub_http_head_with_code(502)
expect(subject.head_up?).to be(false)
expect(subject.last_response_reason).to eq('502 Bad Gateway')
end
end
context 'when URI is down initially, but then comes up' do
subject(:helper) { described_class.new(uri, cache_response: false) }
it 'returns true' do
stub_http_head_with_code(502)
expect(helper.head_up?).to be(false)
expect(helper.last_response_reason).to eq('502 Bad Gateway')
stub_http_head_with_code(200)
expect(helper.head_up?).to be(true)
expect(helper.last_response_reason).to eq('200 OK')
end
end
context 'when URI is up' do
it 'returns true' do
stub_http_head_with_code(200)
expect(subject.head_up?).to be(true)
expect(subject.last_response_reason).to eq('200 OK')
end
end
end
def stub_http
http_client_double = Net::HTTP.new(uri.host, uri.port)
allow(Net::HTTP).to receive(:new).with(uri.host, uri.port).and_return(http_client_double)
allow(http_client_double).to receive(:start).and_yield(http_client_double)
http_client_double
end
def stub_http_get_with_code(http_code)
http_client_double = stub_http
# rubocop:todo RSpec/VerifiedDoubles
http_response_double = double('Net::HTTPResponse', code: http_code.to_s, message: Rack::Utils::HTTP_STATUS_CODES[http_code])
# rubocop:enable RSpec/VerifiedDoubles
allow(http_client_double).to receive(:get).with(path).and_return(http_response_double)
end
def stub_http_head_with_code(http_code)
http_client_double = stub_http
# rubocop:todo RSpec/VerifiedDoubles
http_response_double = double('Net::HTTPResponse', code: http_code.to_s, message: Rack::Utils::HTTP_STATUS_CODES[http_code])
# rubocop:enable RSpec/VerifiedDoubles
allow(http_client_double).to receive(:head).with(path).and_return(http_response_double)
end
end