From 054cd16d026bafa703f5e63d50d129be6060e45b Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 7 Apr 2020 16:48:24 +0100 Subject: [PATCH] Ensure correct object renders V2 template preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `body` field of the ‘preview a template’ endpoint should contain the content of the template with the placeholders replaced. It should not be rendered into a plain text email, which does stuff like normalising newlines (so `\r\n` becomes `\n`). However the object that the `create_post_template_preview_response` function receives is an instance of `PlainTextEmailTemplate`. So we can’t just call `str()` on it. Instead we need to call the `__str__` method of `WithSubjectTemplate` which gives us the result we want. We were already doing this the right way in the V1 endpoint[1] but forgot to do it here too. 1. https://github.com/alphagov/notifications-api/blob/0108749daa9885e000ad0ea222692b799ff59338/app/template/rest.py#L181-L184 --- app/v2/template/template_schemas.py | 11 ++++-- tests/app/v2/template/test_post_template.py | 37 ++++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/v2/template/template_schemas.py b/app/v2/template/template_schemas.py index a9c9afece..512b47ebd 100644 --- a/app/v2/template/template_schemas.py +++ b/app/v2/template/template_schemas.py @@ -1,3 +1,5 @@ +from notifications_utils.template import WithSubjectTemplate + from app.models import SMS_TYPE, TEMPLATE_TYPES from app.schema_validation.definitions import uuid, personalisation from app.utils import get_html_email_body_from_template @@ -75,13 +77,18 @@ post_template_preview_response = { def create_post_template_preview_response(template, template_object): - subject = template_object.subject if template.template_type != SMS_TYPE else None + if template.template_type == SMS_TYPE: + subject = None + body = str(template_object) + else: + subject = template_object.subject + body = WithSubjectTemplate.__str__(template_object) return { "id": template.id, "type": template.template_type, "version": template.version, - "body": str(template_object), + "body": body, "html": get_html_email_body_from_template(template_object), "subject": subject, "postage": template.postage diff --git a/tests/app/v2/template/test_post_template.py b/tests/app/v2/template/test_post_template.py index 4e392c8c6..411524ca4 100644 --- a/tests/app/v2/template/test_post_template.py +++ b/tests/app/v2/template/test_post_template.py @@ -2,7 +2,7 @@ import pytest from flask import json -from app.models import EMAIL_TYPE, SMS_TYPE, TEMPLATE_TYPES +from app.models import EMAIL_TYPE, LETTER_TYPE, SMS_TYPE, TEMPLATE_TYPES from tests import create_authorization_header from tests.app.db import create_template @@ -108,6 +108,41 @@ def test_valid_post_template_returns_200( assert expected_content in resp_json['body'] +@pytest.mark.parametrize("template_type", (EMAIL_TYPE, LETTER_TYPE)) +def test_email_and_letter_templates_not_rendered_into_content( + client, + sample_service, + template_type, +): + template = create_template( + sample_service, + template_type=template_type, + subject='Test', + content=( + 'Hello\n' + '\r\n' + '\r\n' + '\n' + '# This is a heading\n' + '\n' + 'Paragraph' + ), + ) + + auth_header = create_authorization_header(service_id=sample_service.id) + + response = client.post( + path='/v2/template/{}/preview'.format(template.id), + data=json.dumps(None), + headers=[('Content-Type', 'application/json'), auth_header]) + + assert response.status_code == 200 + + resp_json = json.loads(response.get_data(as_text=True)) + + assert resp_json['body'] == template.content + + @pytest.mark.parametrize("tmp_type", TEMPLATE_TYPES) def test_invalid_post_template_returns_400(client, sample_service, tmp_type): template = create_template(