From 4c8bc9f4307572d75dc3107e30d637cdb873ad8f Mon Sep 17 00:00:00 2001 From: Richard Chapman Date: Mon, 26 Feb 2018 13:57:41 +0000 Subject: [PATCH] Added endpoint to get the letter preview from the template preview app Is will allow the admin application to call into the api instead of making the call itself. This will allow the api to make decision for precompiled pdf without having to update the admin app. - Added new endpoint - Added tests for the endpoint --- app/template/rest.py | 49 ++++++++++++++++-- tests/app/template/test_rest.py | 89 ++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 6 deletions(-) diff --git a/app/template/rest.py b/app/template/rest.py index 038f249bf..528fdd22c 100644 --- a/app/template/rest.py +++ b/app/template/rest.py @@ -1,10 +1,11 @@ from flask import ( Blueprint, + current_app, jsonify, - request, - current_app + request ) +from app.dao.notifications_dao import get_notification_by_id from app.dao.templates_dao import ( dao_update_template, dao_create_template, @@ -12,8 +13,8 @@ from app.dao.templates_dao import ( dao_get_template_by_id_and_service_id, dao_get_all_templates_for_service, dao_get_template_versions, - dao_update_template_reply_to -) + dao_update_template_reply_to, + dao_get_template_by_id) from notifications_utils.template import SMSMessageTemplate from app.dao.services_dao import dao_fetch_service_by_id from app.models import SMS_TYPE @@ -179,3 +180,43 @@ def redact_template(template, data): if not template.redact_personalisation: dao_redact_template(template, data['created_by']) return 'null', 200 + + +@template_blueprint.route('//pdf-preview//', methods=['GET']) +def preview_letter_template_by_notification_id(service_id, template_id, notification_id, file_type): + + if file_type not in ('pdf', 'png'): + raise InvalidRequest({'content': ["file_type must be pdf or png"]}, status_code=404) + + page = request.args.get('page') + + template = dao_get_template_by_id(template_id) + + template_for_letter_print = { + "subject": template.subject, + "content": template.content + } + + notification = get_notification_by_id(notification_id) + + service = dao_fetch_service_by_id(service_id) + + data = { + 'letter_contact_block': notification.reply_to_text, + 'template': template_for_letter_print, + 'values': notification.personalisation, + 'dvla_org_id': service.dvla_organisation_id, + } + + from requests import (post as requests_post) + resp = requests_post( + '{}/preview.{}{}'.format( + current_app.config['TEMPLATE_PREVIEW_API_HOST'], + file_type, + '?page={}'.format(page) if page else '' + ), + json=data, + headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])} + ) + + return resp.content, resp.status_code, resp.headers.items() diff --git a/tests/app/template/test_rest.py b/tests/app/template/test_rest.py index 1324a9915..0747652c3 100644 --- a/tests/app/template/test_rest.py +++ b/tests/app/template/test_rest.py @@ -6,6 +6,7 @@ from datetime import datetime, timedelta import pytest from freezegun import freeze_time +from app.errors import InvalidRequest from app.models import Template, SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, TemplateHistory from app.dao.templates_dao import dao_get_template_by_id, dao_redact_template @@ -14,9 +15,9 @@ from tests.app.conftest import ( sample_template as create_sample_template, sample_template_without_email_permission, sample_template_without_letter_permission, - sample_template_without_sms_permission, -) + sample_template_without_sms_permission) from tests.app.db import create_service, create_letter_contact, create_template +from tests.conftest import set_config_values @pytest.mark.parametrize('template_type, subject', [ @@ -794,3 +795,87 @@ def test_update_redact_template_400s_if_no_created_by(admin_request, sample_temp assert sample_template.redact_personalisation is False assert sample_template.template_redacted.updated_at == original_updated_time + + +def test_preview_letter_template_by_id_invalid_file_type( + sample_service, + sample_letter_template, + sample_letter_notification): + + with pytest.raises(InvalidRequest) as exc: + from app.template.rest import preview_letter_template_by_notification_id + preview_letter_template_by_notification_id( + sample_service.id, + sample_letter_template.id, + sample_letter_notification.id, + 'doc') + assert 'file_type must be pdf or png' in str(exc.value) + + +def test_preview_letter_template_by_id_valid_file_type( + notify_api, + client, + sample_service, + sample_letter_template, + sample_letter_notification): + + with set_config_values(notify_api, { + 'TEMPLATE_PREVIEW_API_HOST': 'http://localhost/notifications-template-preview', + 'TEMPLATE_PREVIEW_API_KEY': 'test-key' + }): + import requests_mock + with requests_mock.Mocker() as request_mock: + content = b'\x00\x01' + + request_mock.post( + 'http://localhost/notifications-template-preview/preview.pdf', + content=content, + headers={'X-pdf-page-count': '1'}, + status_code=200 + ) + + from app.template.rest import preview_letter_template_by_notification_id + content, status_code, items = preview_letter_template_by_notification_id( + sample_service.id, + sample_letter_template.id, + sample_letter_notification.id, + 'pdf' + ) + + assert status_code == 200 + assert content == content + assert list(items)[0][0] == 'X-pdf-page-count' + assert list(items)[0][1] == '1' + + +def test_preview_letter_template_by_id_template_preview_404( + notify_api, + client, + sample_service, + sample_letter_template, + sample_letter_notification): + + with set_config_values(notify_api, { + 'TEMPLATE_PREVIEW_API_HOST': 'http://localhost/notifications-template-preview', + 'TEMPLATE_PREVIEW_API_KEY': 'test-key' + }): + import requests_mock + with requests_mock.Mocker() as request_mock: + content = b'\x00\x01' + + request_mock.post( + 'http://localhost/notifications-template-preview/preview.pdf', + content=content, + headers={'X-pdf-page-count': '1'}, + status_code=404 + ) + + from app.template.rest import preview_letter_template_by_notification_id + content, status_code, items = preview_letter_template_by_notification_id( + sample_service.id, + sample_letter_template.id, + sample_letter_notification.id, + 'pdf' + ) + + assert status_code == 404