Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions app/jobs/voice_otp_sender_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,37 @@ def send_otp(twilio_service, code, phone)
)
end

def twimlet_url(code)
"https://twimlets.com/message?#{twimlet_query_string(code)}"
def twimlet_url(code) # rubocop:disable Metrics/MethodLength
Copy link
Copy Markdown
Contributor Author

@zachmargolis zachmargolis Nov 23, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if I inline the repeat = message_repeat(code) part to shorten the method and get under the line length limit, reek gets mad about repeat statements, this seemed like a decent compromise to me

repeat = message_repeat(code)

twimlet_menu(
repeat,
1 => twimlet_menu(
repeat,
1 => twimlet_menu(
repeat,
1 => twimlet_menu(repeat, 1 => twimlet_message(message_final(code)))
)
)
)
end

def message_repeat(code)
I18n.t('jobs.voice_otp_sender_job.message_repeat', code: code)
end

def message_final(code)
I18n.t('jobs.voice_otp_sender_job.message_final', code: code)
end

def twimlet_query_string(code)
"Message%5B0%5D=#{URI.escape(otp_message(code))}"
def twimlet_message(message)
'https://twimlets.com/message?' + { Message: { 0 => message } }.to_query
end

def otp_message(code)
I18n.t('jobs.voice_otp_sender_job.message', code: code)
def twimlet_menu(message, options)
'https://twimlets.com/menu?' + {
Message: message,
Options: options.to_h
}.to_query
end
end
5 changes: 4 additions & 1 deletion config/locales/jobs/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ en:

If you did not request this change, please contact %{app} at %{support_url}
voice_otp_sender_job:
message: >
message_repeat: >
Hello! Your login.gov one time passcode is, %{code},
again, your passcode is, %{code}. Press 1 to repeat your code.
message_final: >
Hello! Your login.gov one time passcode is, %{code},
again, your passcode is, %{code}, goodbye!
17 changes: 12 additions & 5 deletions spec/jobs/voice_otp_sender_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,22 @@

calls = FakeVoiceCall.calls

code = '1234'.scan(/\d/).join(', ')
message = t('jobs.voice_otp_sender_job.message', code: code)
url_message = URI.escape(message)

expect(calls.size).to eq(1)
call = calls.first
expect(call.to).to eq('555-5555')
expect(call.url).to include(url_message)
expect(call.from).to match(/(\+19999999999|\+12222222222)/)

code = '1234'.scan(/\d/).join(', ')
query = Rack::Utils.parse_nested_query(URI(call.url).query)
expect(query['Message']).to eq(t('jobs.voice_otp_sender_job.message_repeat', code: code))

nested_query = query
while nested_query['Options']
nested_url = URI(nested_query['Options']['1'])
nested_query = Rack::Utils.parse_nested_query(nested_url.query)
end
expect(nested_query['Message']['0']).
to eq(t('jobs.voice_otp_sender_job.message_final', code: code))
end

it 'does not send if the OTP code is expired' do
Expand Down