spec/routemaster/api_client_spec.rb in routemaster-drain-2.3.0 vs spec/routemaster/api_client_spec.rb in routemaster-drain-2.4.0
- old
+ new
@@ -8,65 +8,30 @@
describe Routemaster::APIClient do
uses_dotenv
uses_redis
uses_webmock
- describe '.get' do
- let(:url) { 'https://example.com/widgets/132' }
- let(:headers) {{}}
- let(:fetcher) { described_class.new }
- subject { fetcher.get(url, headers: headers) }
+ let(:url) { 'https://example.com/widgets/132' }
+ let(:headers) {{}}
+ let(:fetcher) { described_class.new }
+ shared_examples 'a GET requester' do
before do
@req = stub_request(:get, /example\.com/).to_return(
status: 200,
body: { id: 132, type: 'widget' }.to_json,
headers: {
'content-type' => 'application/json;v=1'
}
)
-
- @post_req = stub_request(:post, /example\.com/).to_return(
- status: 200,
- body: { id: 132, type: 'widget' }.to_json,
- headers: {
- 'content-type' => 'application/json;v=1'
- }
- )
-
- @patch_req = stub_request(:patch, /example\.com/).to_return(
- status: 200,
- body: { id: 132, type: 'widget' }.to_json,
- headers: {
- 'content-type' => 'application/json;v=1'
- }
- )
end
it 'GETs from the URL' do
- subject
+ subject.status
expect(@req).to have_been_requested
end
- context 'POST request' do
- subject { fetcher.post(url, body: {}, headers: headers) }
-
- it 'POSTs from the URL' do
- subject
- expect(@post_req).to have_been_requested
- end
- end
-
- context 'PATCH request' do
- subject { fetcher.patch(url, body: {}, headers: headers) }
-
- it 'PATCH from the URL' do
- subject
- expect(@patch_req).to have_been_requested
- end
- end
-
it 'has :status, :headers, :body' do
expect(subject.status).to eq(200)
expect(subject.headers).to have_key('content-type')
expect(subject.body).not_to be_nil
end
@@ -74,35 +39,144 @@
it 'mashifies body' do
expect(subject.body.id).to eq(132)
end
it 'uses auth' do
- subject
+ subject.status
assert_requested(:get, /example/) do |req|
credentials = Base64.strict_encode64('username:s3cr3t')
expect(req.headers['Authorization']).to eq("Basic #{credentials}")
end
end
it 'passes headers' do
headers['x-custom-header'] = 'why do you even'
- subject
+ subject.status
assert_requested(:get, /example/) do |req|
expect(req.headers).to include('X-Custom-Header')
end
end
context 'when response_class is present' do
before do
class DummyResponse
def initialize(res, client: nil); end
+ def dummy; true; end
end
end
let(:fetcher) { described_class.new(response_class: DummyResponse) }
- it 'returns a response_class instance as a response' do
- expect(subject).to be_an_instance_of(DummyResponse)
+ it 'wraps the response in the response class' do
+ expect(subject.dummy).to be_truthy
end
+ end
+ end
+
+ describe '#get' do
+ subject { fetcher.get(url, headers: headers) }
+ it_behaves_like 'a GET requester'
+ end
+
+ describe '#fget' do
+ subject { fetcher.fget(url, headers: headers) }
+ it_behaves_like 'a GET requester'
+ end
+
+ describe '#post' do
+ subject { fetcher.post(url, body: {}, headers: headers) }
+
+ before do
+ @post_req = stub_request(:post, /example\.com/).to_return(
+ status: 200,
+ body: { id: 132, type: 'widget' }.to_json,
+ headers: {
+ 'content-type' => 'application/json;v=1'
+ }
+ )
+ end
+
+ it 'POSTs from the URL' do
+ subject
+ expect(@post_req).to have_been_requested
+ end
+ end
+
+ describe '#patch' do
+ subject { fetcher.patch(url, body: {}, headers: headers) }
+
+ before do
+ @patch_req = stub_request(:patch, /example\.com/).to_return(
+ status: 200,
+ body: { id: 132, type: 'widget' }.to_json,
+ headers: {
+ 'content-type' => 'application/json;v=1'
+ }
+ )
+ end
+
+ it 'PATCH from the URL' do
+ subject
+ expect(@patch_req).to have_been_requested
+ end
+ end
+
+ describe '#delete' do
+ subject { fetcher.delete(url, headers: headers) }
+
+ before do
+ @delete_req = stub_request(:delete, /example\.com/).to_return(
+ status: 204,
+ )
+ end
+
+ it 'DELETES from the URL' do
+ subject
+ expect(@delete_req).to have_been_requested
+ end
+ end
+
+ describe '#discover' do
+ before do
+ @req = stub_request(:get, /example\.com/).to_return(
+ status: 200,
+ body: { id: 132, type: 'widget' }.to_json,
+ headers: {
+ 'content-type' => 'application/json;v=1'
+ }
+ )
+ end
+
+ it 'GETs from the URL' do
+ subject.discover('https://example.com')
+ expect(@req).to have_been_requested
+ end
+ end
+
+ describe '#with_response' do
+ before { stub_request(:any, //).to_return(status: 200) }
+
+ class DummyResponseA
+ def initialize(res, client: nil); end
+ def dummy_a; true; end
+ end
+
+ class DummyResponseB
+ def initialize(res, client: nil); end
+ def dummy_b; true; end
+ end
+
+ subject { described_class.new(response_class: DummyResponseA) }
+ let(:response) { subject.get('https://example.com') }
+
+ it 'changes the response wrapper during the block' do
+ subject.with_response(DummyResponseB) do
+ expect(response).to respond_to(:dummy_b)
+ end
+ end
+
+ it 'restores the original response wrapper after the block' do
+ subject.with_response(DummyResponseB) {}
+ expect(response).to respond_to(:dummy_a)
end
end
end