diff --git a/app/services/twilio_service.rb b/app/services/twilio_service.rb index 5aae137faf9..cf56e9c60b7 100644 --- a/app/services/twilio_service.rb +++ b/app/services/twilio_service.rb @@ -58,7 +58,7 @@ def sanitize_errors rescue Twilio::REST::RestError => error sanitize_phone_number(error.message) raise - rescue Faraday::TimeoutError + rescue Faraday::TimeoutError, Faraday::ConnectionFailed retry unless (tries -= 1).zero? raise_custom_timeout_error end diff --git a/spec/services/twilio_service_spec.rb b/spec/services/twilio_service_spec.rb index 0623528e101..8a7a0c5976a 100644 --- a/spec/services/twilio_service_spec.rb +++ b/spec/services/twilio_service_spec.rb @@ -115,6 +115,21 @@ expect { service.place_call(to: '+123456789012', url: 'https://twimlet.com') }. to raise_error(Twilio::REST::RestError, message) end + + it 'rescues failed connection errors, retries, then raises a custom Twilio error' do + TwilioService::Utils.telephony_service = FakeVoiceCall + error_code = 4_815_162_342 + status_code = 4_815_162_342 + + message = "[HTTP #{status_code}] #{error_code} : timeout\n\n" + service = TwilioService::Utils.new + + expect(service.send(:client).calls).to receive(:create).twice. + and_raise(Faraday::ConnectionFailed.new('error')) + + expect { service.place_call(to: '+123456789012', url: 'https://twimlet.com') }. + to raise_error(Twilio::REST::RestError, message) + end end describe '#send_sms' do @@ -182,5 +197,20 @@ expect { service.send_sms(to: '+123456789012', body: 'test') }. to raise_error(Twilio::REST::RestError, message) end + + it 'rescues failed connection errors, retries, then raises a custom Twilio error' do + TwilioService::Utils.telephony_service = FakeSms + error_code = 4_815_162_342 + status_code = 4_815_162_342 + + message = "[HTTP #{status_code}] #{error_code} : timeout\n\n" + service = TwilioService::Utils.new + + expect(service.send(:client).messages).to receive(:create).twice. + and_raise(Faraday::ConnectionFailed.new('error')) + + expect { service.send_sms(to: '+123456789012', body: 'test') }. + to raise_error(Twilio::REST::RestError, message) + end end end