From cf91ce57fcb8817437f119e81edc83de5c4961e8 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 16 Jun 2016 13:51:20 +0100 Subject: [PATCH] =?UTF-8?q?Add=20a=20=E2=80=98preview=20template=E2=80=99?= =?UTF-8?q?=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There’s a need for users of the API to be able to take advantage of Notify’s template rendering. For example, there’s a service that’s building a case management system. Their users are sending emails on a case-by-case basis. Before they send an email, it’s ressuring to double check that the right data is being inserted, that the right template is being used, etc. This commit: - adds a separate endpoint for previewing a template, with personalisation taken from the get parameters of the request - beefs up the tests around getting a template Not part of this pull request: - making this enpoint publicly accessible --- app/template/rest.py | 25 +++++++++++ tests/app/template/test_rest.py | 78 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/app/template/rest.py b/app/template/rest.py index dc285e9d1..692f27d14 100644 --- a/app/template/rest.py +++ b/app/template/rest.py @@ -86,6 +86,31 @@ def get_template_by_id_and_service_id(service_id, template_id): return jsonify(data=data) +@template.route('//preview', methods=['GET']) +def preview_template_by_id_and_service_id(service_id, template_id): + fetched_template = dao_get_template_by_id_and_service_id(template_id=template_id, service_id=service_id) + data = template_schema.dump(fetched_template).data + template_object = Template(data, values=request.args.to_dict()) + + if template_object.missing_data: + raise InvalidRequest( + {'template': [ + 'Missing personalisation: {}'.format(", ".join(template_object.missing_data)) + ]}, status_code=400 + ) + + if template_object.additional_data: + raise InvalidRequest( + {'template': [ + 'Personalisation not needed for template: {}'.format(", ".join(template_object.additional_data)) + ]}, status_code=400 + ) + + data['subject'], data['content'] = template_object.replaced_subject, template_object.replaced + + return jsonify(data=data) + + @template.route('//version/') def get_template_version(service_id, template_id, version): data = template_history_schema.dump( diff --git a/tests/app/template/test_rest.py b/tests/app/template/test_rest.py index 25e03d390..ff69342fe 100644 --- a/tests/app/template/test_rest.py +++ b/tests/app/template/test_rest.py @@ -1,8 +1,10 @@ import json import random import string +import pytest from app.models import Template from tests import create_authorization_header +from tests.app.conftest import sample_template as create_sample_template from app.dao.templates_dao import dao_get_template_by_id @@ -324,6 +326,82 @@ def test_should_get_only_templates_for_that_service(notify_api, sample_user, ser assert len(json_resp_4['data']) == 1 +@pytest.mark.parametrize( + "subject, content, path, expected_subject, expected_content, expected_error", [ + ( + 'about your ((thing))', + 'hello ((name)) we’ve received your ((thing))', + '/service/{}/template/{}', + 'about your ((thing))', + 'hello ((name)) we’ve received your ((thing))', + None + ), + ( + 'about your thing', + 'hello user we’ve received your thing', + '/service/{}/template/{}/preview', + 'about your thing', + 'hello user we’ve received your thing', + None + ), + ( + 'about your ((thing))', + 'hello ((name)) we’ve received your ((thing))', + '/service/{}/template/{}/preview?name=Amala&thing=document', + 'about your document', + 'hello Amala we’ve received your document', + None + ), + ( + 'about your ((thing))', + 'hello ((name)) we’ve received your ((thing))', + '/service/{}/template/{}/preview?eman=Amala&gniht=document', + None, None, + 'Missing personalisation: thing, name' + ), + ( + 'about your ((thing))', + 'hello ((name)) we’ve received your ((thing))', + '/service/{}/template/{}/preview?name=Amala&thing=document&foo=bar', + None, None, + 'Personalisation not needed for template: foo' + ) + ] +) +def test_should_get_a_single_template( + notify_db, + notify_api, + sample_user, + service_factory, + subject, + content, + path, + expected_subject, + expected_content, + expected_error +): + with notify_api.test_request_context(), notify_api.test_client() as client: + + template = create_sample_template( + notify_db, notify_db.session, subject_line=subject, content=content, template_type='email' + ) + + response = client.get( + path.format(template.service.id, template.id), + headers=[create_authorization_header()] + ) + + content = json.loads(response.get_data(as_text=True)) + + if expected_error: + assert response.status_code == 400 + assert content['message']['template'] == [expected_error] + else: + assert response.status_code == 200 + assert content['data']['content'] == expected_content + assert content['data']['subject'] == expected_subject + + def test_should_return_empty_array_if_no_templates_for_service(notify_api, sample_service): with notify_api.test_request_context(): with notify_api.test_client() as client: