Files
notifications-admin/tests/app/main/views/test_conversation.py
Chris Hill-Scott fd3f6f920f Refactor conversation test to not re-request page
There’s no need to request the page once for each message on it. Quicker
to load the page once and then loop through the messages.

Still need this as an integration test because it’s testing the ordering
and threading of the message.
2017-06-14 15:43:42 +01:00

154 lines
4.1 KiB
Python

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