Skip to content

Commit

Permalink
optimization: use calls/say endpoint for notifications
Browse files Browse the repository at this point in the history
Notification doesn't require user response, so we can skip the action
callback by using calls/say endpoint directly.
  • Loading branch information
Qingping Hou authored and jrgp committed Apr 21, 2017
1 parent c6c2e06 commit 3c744bc
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 7 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ test:
make e2e

e2e:
py.test ./test/e2etest.py
py.test -vv ./test/e2etest.py

unit:
py.test test
py.test -vv test

check:
flake8 src test setup.py
Expand Down
16 changes: 11 additions & 5 deletions src/iris/vendors/iris_twilio.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,29 +93,35 @@ def send_call(self, message):
client = self.get_twilio_client()
sender = client.calls.create
from_ = self.config['twilio_number']
calls_gather_url = self.config['relay_base_url'] + '/api/v0/twilio/calls/gather?'
status_callback_url = self.config['relay_base_url'] + '/api/v0/twilio/status'
content = self.generate_message_text(message)

payload = {
'content': content[:480],
'instruction': plugin.get_phone_menu_text(),
'loop': 3,
'source': message['application'],
}

# If message_id is None or 0, don't send it as it's likely OOB
# If message_id is None or 0, go through says as iris can't handle
# phone call response without the id
message_id = message.get('message_id')
if message_id:
payload['message_id'] = message_id
payload['instruction'] = plugin.get_phone_menu_text()
relay_cb_url = '%s/api/v0/twilio/calls/gather?%s' % (
self.config['relay_base_url'], urllib.urlencode(payload)
)
else:
relay_cb_url = '%s/api/v0/twilio/calls/say?%s' % (
self.config['relay_base_url'], urllib.urlencode(payload)
)

start = time.time()
qs = urllib.urlencode(payload)

result = sender(to=message['destination'],
from_=from_,
if_machine='Continue',
url=calls_gather_url + qs,
url=relay_cb_url,
status_callback=status_callback_url)

send_time = time.time() - start
Expand Down
68 changes: 68 additions & 0 deletions test/test_iris_vendor_twilio.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,71 @@ def test_twilio_message_generate(mocker):
assert twilio.generate_message_text({'subject': 'Foo', 'body': 'Bar'}) == 'Foo. Bar'
assert twilio.generate_message_text({'body': 'FooBar'}) == 'FooBar'
assert twilio.generate_message_text({'subject': 'FooBar'}) == 'FooBar'


def test_twilio_notification_call_generate(mocker):
mocker.patch('twilio.rest.resources.Connection')
mocker.patch('iris.vendors.iris_twilio.find_plugin')
from iris.vendors.iris_twilio import iris_twilio
relay_base_url = 'http://foo/relay'
fake_from_num = '123-123-1234'
fake_to_num = '123-123-1235'

twilio = iris_twilio({
'twilio_number': fake_from_num,
'relay_base_url': relay_base_url,
})
mock_twilio_client = mocker.MagicMock()
mocker.patch.object(twilio, 'get_twilio_client').return_value = mock_twilio_client
twilio.send_call({
'destination': fake_to_num,
'application': 'iris-sender',
'subject': 'Hello',
'body': 'World',
})
mock_twilio_client.calls.create.assert_called_once_with(
to=fake_to_num,
from_=fake_from_num,
if_machine='Continue',
url=relay_base_url + (
'/api/v0/twilio/calls/say?content=Hello.+World&'
'source=iris-sender&loop=3'),
status_callback=relay_base_url + '/api/v0/twilio/status'
)


def test_twilio_incident_call_generate(mocker):
mocker.patch('twilio.rest.resources.Connection')
mock_plugin = mocker.MagicMock()
mock_plugin.get_phone_menu_text.return_value = 'Press 1 to pay'
mocker.patch('iris.vendors.iris_twilio.find_plugin').return_value = mock_plugin
relay_base_url = 'http://foo/relay'
fake_from_num = '123-123-1234'
fake_to_num = '123-123-1235'

from iris.vendors.iris_twilio import iris_twilio
twilio = iris_twilio({
'twilio_number': fake_from_num,
'relay_base_url': relay_base_url,
})
mock_twilio_client = mocker.MagicMock()
mocker.patch.object(twilio, 'get_twilio_client').return_value = mock_twilio_client
mocker.patch.object(twilio, 'initialize_twilio_message_status')

twilio.send_call({
'message_id': 1,
'destination': fake_to_num,
'application': 'iris-sender',
'subject': 'Hello',
'body': 'World',
})
mock_twilio_client.calls.create.assert_called_once_with(
to=fake_to_num,
from_=fake_from_num,
if_machine='Continue',
url=relay_base_url + (
'/api/v0/twilio/calls/gather?content=Hello.+World&'
'source=iris-sender&instruction=Press+1+to+pay&'
'message_id=1&loop=3'),
status_callback=relay_base_url + '/api/v0/twilio/status'
)

0 comments on commit 3c744bc

Please sign in to comment.