spec/connectors/base/custom_client_spec.rb (83 lines of code) (raw):

# # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one # or more contributor license agreements. Licensed under the Elastic License; # you may not use this file except in compliance with the Elastic License. # # frozen_string_literal: true require 'connectors/base/custom_client' describe Connectors::Base::CustomClient do let(:base_url) { 'http://localhost' } let(:client) { described_class.new(:base_url => base_url) } describe '#get' do it 'makes http request' do get_request = stub_request(:get, 'http://localhost').to_return(:status => 200) client.get('') expect(get_request).to have_been_requested.at_least_once end context 'retries' do it 'retries on timeout response' do stubbed_request = stub_request(:get, 'http://localhost') .to_timeout.then .to_return(:status => 200) client.get('') expect(stubbed_request).to have_been_requested.twice end it 'only retries MAX_RETRIES times' do max = Connectors::Base::CustomClient::MAX_RETRIES stubbed_request = (max + 5).times.each_with_object(stub_request(:get, 'http://localhost')) do |_, stub| stub.to_timeout.then end.to_return(:status => 200) expect { client.get('') }.to raise_error(Faraday::TimeoutError) expect(stubbed_request).to have_been_requested.times(max + 1) # original + "retries" end end context 'ensuring auth is fresh' do let(:refresh_lambda) { ->(_client) { refresh_double.the_big_red_button } } let(:refresh_double) { double(:the_big_red_button => :kaboom) } it 'does not require refresh logic' do expect(refresh_double).not_to receive(:the_big_red_button) stub_request(:get, 'http://localhost').to_return(:status => 200) client.get('') end context 'auth refresh logic is provided' do let(:client) { described_class.new(:base_url => base_url, :ensure_fresh_auth => refresh_lambda) } it 'will use refresh logic when supplied' do expect(refresh_double).to receive(:the_big_red_button) stub_request(:get, 'http://localhost').to_return(:status => 200) client.get('') end end end end describe '#post' do it 'makes http request' do post_request = stub_request(:post, 'http://localhost').to_return(:status => 200) client.post('', {}) expect(post_request).to have_been_requested.at_least_once end end describe '#put' do it 'makes http request' do put_request = stub_request(:put, 'http://localhost').to_return(:status => 200) client.put('', {}) expect(put_request).to have_been_requested.at_least_once end end describe '#delete' do it 'makes http request' do delete_request = stub_request(:delete, 'http://localhost').to_return(:status => 200) client.delete('') expect(delete_request).to have_been_requested.at_least_once end end describe '#request_with_throttling' do let(:url) { '/test' } context 'when request is successful' do it 'returns 200' do stub_request(:get, "#{base_url}#{url}").to_return(:status => 200) response = client.send(:request_with_throttling, :get, url) expect(response).to be_success end end context 'when rate limit is reached' do it 'raises ThrottlingError' do stub_request(:get, "#{base_url}#{url}").to_return(:status => 429, :headers => { 'Retry-After': 0 }) expect { client.send(:request_with_throttling, :get, url) }.to raise_error(Utility::ThrottlingError) end end end end