Merge pull request #1291 from alphagov/two-way

Add page to show two-way conversation
This commit is contained in:
Chris Hill-Scott
2017-06-14 16:42:46 +01:00
committed by GitHub
12 changed files with 359 additions and 13 deletions

View File

@@ -248,7 +248,9 @@ def notification_json(
'template': {
'id': template['id'],
'name': template['name'],
'template_type': template['template_type']},
'template_type': template['template_type'],
'content': template['content'],
},
'job': job_payload,
'sent_at': sent_at,
'status': status,

View File

@@ -0,0 +1,153 @@
import pytest
from bs4 import BeautifulSoup
from flask import (
url_for,
)
from notifications_python_client.errors import HTTPError
from tests.conftest import (
SERVICE_ONE_ID,
)
from tests.app.test_utils import normalize_spaces
from freezegun import freeze_time
from unittest import mock
from app.main.views.conversation import get_user_number
@mock.patch(
'app.main.views.conversation.service_api_client.get_inbound_sms_by_id',
return_value={
'user_number': '4407900900123'
}
)
@mock.patch(
'app.main.views.conversation.notification_api_client.get_notification',
side_effect=HTTPError,
)
def test_get_user_phone_number_when_only_inbound_exists(
mock_get_notification,
mock_get_inbound_sms,
):
assert get_user_number('service', 'notification') == '07900 900123'
mock_get_inbound_sms.assert_called_once_with('service', 'notification')
assert mock_get_notification.called is False
@mock.patch(
'app.main.views.conversation.service_api_client.get_inbound_sms_by_id',
side_effect=HTTPError,
)
@mock.patch(
'app.main.views.conversation.notification_api_client.get_notification',
return_value={
'to': '15550000000'
}
)
def test_get_user_phone_number_when_only_outbound_exists(
mock_get_notification,
mock_get_inbound_sms,
):
assert get_user_number('service', 'notification') == '+1 555-000-0000'
mock_get_inbound_sms.assert_called_once_with('service', 'notification')
mock_get_notification.assert_called_once_with('service', 'notification')
@mock.patch(
'app.main.views.conversation.service_api_client.get_inbound_sms_by_id',
side_effect=HTTPError,
)
@mock.patch(
'app.main.views.conversation.notification_api_client.get_notification',
side_effect=HTTPError,
)
def test_get_user_phone_number_raises_if_both_API_requests_fail(
mock_get_notification,
mock_get_inbound_sms,
):
with pytest.raises(HTTPError):
get_user_number('service', 'notification')
mock_get_inbound_sms.assert_called_once_with('service', 'notification')
mock_get_notification.assert_called_once_with('service', 'notification')
@freeze_time("2012-01-01 00:00:00")
def test_view_conversation(
logged_in_client,
fake_uuid,
mock_get_notification,
mock_get_inbound_sms,
mock_get_notifications,
):
response = logged_in_client.get(url_for(
'main.conversation',
service_id=SERVICE_ONE_ID,
notification_id=fake_uuid,
))
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
messages = page.select('.sms-message-wrapper')
statuses = page.select('.sms-message-status')
assert len(messages) == 13
assert len(statuses) == 13
for index, expected in enumerate([
(
'message-8',
'Failed (sent yesterday at 2:59pm)',
),
(
'message-7',
'Failed (sent yesterday at 2:59pm)',
),
(
'message-6',
'Failed (sent yesterday at 4:59pm)',
),
(
'message-5',
'Failed (sent yesterday at 6:59pm)',
),
(
'message-4',
'Failed (sent yesterday at 8:59pm)',
),
(
'message-3',
'Failed (sent yesterday at 10:59pm)',
),
(
'message-2',
'Failed (sent yesterday at 10:59pm)',
),
(
'message-1',
'Failed (sent yesterday at 11:00pm)',
),
(
'template content',
'yesterday at midnight',
),
(
'template content',
'yesterday at midnight',
),
(
'template content',
'yesterday at midnight',
),
(
'template content',
'yesterday at midnight',
),
(
'template content',
'yesterday at midnight',
),
]):
assert (
normalize_spaces(messages[index].text),
normalize_spaces(statuses[index].text),
) == expected

View File

@@ -1096,6 +1096,22 @@ def mock_get_notifications(mocker, api_user_active):
)
@pytest.fixture(scope='function')
def mock_get_notification(mocker, api_user_active):
def _get_notification(
service_id,
notification_id,
):
return single_notification_json(
service_id,
)
return mocker.patch(
'app.notification_api_client.get_notification',
side_effect=_get_notification
)
@pytest.fixture(scope='function')
def mock_get_notifications_with_previous_next(mocker):
def _get_notifications(service_id,
@@ -1138,11 +1154,13 @@ def mock_get_notifications_with_no_notifications(mocker):
def mock_get_inbound_sms(mocker):
def _get_inbound_sms(
service_id,
user_number=None,
):
return [{
'user_number': '0790090000' + str(i),
'content': 'message-{}'.format(index + 1),
'created_at': (datetime.utcnow() - timedelta(minutes=60 * (i + 1))).isoformat()
'created_at': (datetime.utcnow() - timedelta(minutes=60 * (i + 1), seconds=index)).isoformat(),
'id': sample_uuid(),
} for index, i in enumerate([0, 0, 0, 2, 4, 6, 8, 8])]
return mocker.patch(