diff --git a/app/services/twitter_client/client.rb b/app/services/twitter_client/client.rb index fc03c6c4b..898431737 100644 --- a/app/services/twitter_client/client.rb +++ b/app/services/twitter_client/client.rb @@ -44,9 +44,10 @@ module TwitterClient error_class = "::TwitterClient::Errors::#{class_name}".safe_constantize raise error_class, exception.message if error_class - error_class = if exception.class < Twitter::Error::ClientError + error_class = case exception + when Twitter::Error::ClientError TwitterClient::Errors::ClientError - elsif exception.class < Twitter::Error::ServerError + when Twitter::Error::ServerError TwitterClient::Errors::ServerError else TwitterClient::Errors::Error diff --git a/spec/services/twitter_client/client_spec.rb b/spec/services/twitter_client/client_spec.rb index 371039998..e75e99739 100644 --- a/spec/services/twitter_client/client_spec.rb +++ b/spec/services/twitter_client/client_spec.rb @@ -27,4 +27,36 @@ RSpec.describe TwitterClient::Client, type: :service, vcr: true do end end end + + describe "handling underlying errors" do + let(:client) { instance_double(Twitter::REST::Client) } + + before do + allow(Twitter::REST::Client).to receive(:new).and_return(client) + end + + it "matches defined errors by name" do + allow(client).to receive(:status).and_raise(Twitter::Error::NotFound) + + expect { described_class.status(1) }.to raise_error(TwitterClient::Errors::NotFound) + end + + it "matches client errors" do + allow(client).to receive(:status).and_raise(Twitter::Error::BadRequest) + + expect { described_class.status(1) }.to raise_error(TwitterClient::Errors::ClientError) + end + + it "matches server errors" do + allow(client).to receive(:status).and_raise(Twitter::Error::ServiceUnavailable) + + expect { described_class.status(1) }.to raise_error(TwitterClient::Errors::ServerError) + end + + it "defaults to a generic error" do + allow(client).to receive(:status).and_raise(Twitter::Error) + + expect { described_class.status(1) }.to raise_error(TwitterClient::Errors::Error) + end + end end