Files
notifications-admin/tests/app/test_template_previews.py
Chris Hill-Scott 1304561a70 Use service model to look up service attributes
This is better than just keying into the JSON because it means you get
an exception straight away when looking up a key that doesn’t exist
(which via mocking you could ordinarily miss).
2018-07-30 14:56:36 +01:00

99 lines
3.2 KiB
Python

from functools import partial
from unittest.mock import Mock
import pytest
from notifications_utils.template import LetterPreviewTemplate
from app.template_previews import TemplatePreview, get_page_count_for_letter
@pytest.mark.parametrize('partial_call, expected_page_argument', [
(partial(TemplatePreview.from_utils_template), None),
(partial(TemplatePreview.from_utils_template, page=99), 99),
])
def test_from_utils_template_calls_through(
mocker,
mock_get_service_letter_template,
partial_call,
expected_page_argument,
):
mock_from_db = mocker.patch('app.template_previews.TemplatePreview.from_database_object')
template = LetterPreviewTemplate(mock_get_service_letter_template(None, None)['data'])
ret = partial_call(template, 'foo')
assert ret == mock_from_db.return_value
mock_from_db.assert_called_once_with(template._template, 'foo', template.values, page=expected_page_argument)
@pytest.mark.parametrize('partial_call, expected_url', [
(
partial(TemplatePreview.from_database_object, filetype='bar'),
'http://localhost:9999/preview.bar',
),
(
partial(TemplatePreview.from_database_object, filetype='baz'),
'http://localhost:9999/preview.baz',
),
(
partial(TemplatePreview.from_database_object, filetype='bar', page=99),
'http://localhost:9999/preview.bar?page=99',
),
])
def test_from_database_object_makes_request(
mocker,
client,
partial_call,
expected_url,
mock_get_service_letter_template
):
resp = Mock(content='a', status_code='b', headers={'c': 'd'})
request_mock = mocker.patch('app.template_previews.requests.post', return_value=resp)
mocker.patch('app.template_previews.current_service', dvla_organisation='123')
template = mock_get_service_letter_template('123', '456')['data']
ret = partial_call(template=template)
assert ret[0] == 'a'
assert ret[1] == 'b'
assert list(ret[2]) == [('c', 'd')]
data = {
'letter_contact_block': None,
'template': template,
'values': None,
'dvla_org_id': '123',
}
headers = {'Authorization': 'Token my-secret-key'}
request_mock.assert_called_once_with(expected_url, json=data, headers=headers)
@pytest.mark.parametrize('template_type', [
'email', 'sms'
])
def test_page_count_returns_none_for_non_letter_templates(template_type):
assert get_page_count_for_letter({'template_type': template_type}) is None
@pytest.mark.parametrize('partial_call, expected_template_preview_args', [
(
partial(get_page_count_for_letter),
({'template_type': 'letter'}, 'json', None)
),
(
partial(get_page_count_for_letter, values={'foo': 'bar'}),
({'template_type': 'letter'}, 'json', {'foo': 'bar'})
),
])
def test_page_count_unpacks_from_json_response(
mocker,
partial_call,
expected_template_preview_args,
):
mock_template_preview = mocker.patch('app.template_previews.TemplatePreview.from_database_object')
mock_template_preview.return_value = (b'{"count": 99}', 200, {})
assert partial_call({'template_type': 'letter'}) == 99
mock_template_preview.assert_called_once_with(*expected_template_preview_args)