diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 8594078c5..c0cc57997 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -13,7 +13,7 @@ from app import ( service_api_client, ) from app.main import main -from app.main.forms import DateFilterForm, ReturnedLettersForm, PDFUploadForm +from app.main.forms import DateFilterForm, PDFUploadForm, ReturnedLettersForm from app.statistics_utils import ( get_formatted_percentage, get_formatted_percentage_two_dp, @@ -247,20 +247,19 @@ def platform_admin_returned_letters(): def platform_admin_letter_validation_preview(): message, pages, result = None, [], None form = PDFUploadForm() - if form.validate_on_submit(): pdf_file = form.file.data try: response = validate_letter(pdf_file) if response.status_code == 200: - pages=response.json()["pages"] + pages = response.json()["pages"] message = response.json()["message"] result = response.json()["result"] except HTTPError as error: if error.status_code == 400: flash("Something was wrong with the file you tried to upload. Please upload a valid PDF file.") else: - raise e + raise error return render_template( 'views/platform-admin/letter-validation-preview.html', @@ -270,6 +269,7 @@ def platform_admin_letter_validation_preview(): result=result ) + def sum_service_usage(service): total = 0 for notification_type in service['statistics'].keys(): diff --git a/requirements_for_test.txt b/requirements_for_test.txt index 2d14c978c..4edafb246 100644 --- a/requirements_for_test.txt +++ b/requirements_for_test.txt @@ -11,3 +11,4 @@ beautifulsoup4==4.6.3 freezegun==0.3.10 flake8==3.5.0 flake8-print==3.1.0 +requests-mock==1.5.2 diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index e00ac59e6..9b2373295 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -5,8 +5,9 @@ from functools import partial from unittest.mock import ANY import pytest +import requests_mock from bs4 import BeautifulSoup -from flask import url_for +from flask import url_for, current_app from freezegun import freeze_time from app.main.views.platform_admin import ( @@ -760,8 +761,72 @@ def test_platform_admin_submit_empty_returned_letters(mocker, client, platform_a assert "Can’t be empty" in response.get_data(as_text=True) -def test_letter_validation_preview(mocker, client, platform_admin_user): +def test_letter_validation_preview_renders_correctly(mocker, client, platform_admin_user): mock_get_user(mocker, user=platform_admin_user) client.login(platform_admin_user) response = client.get(url_for('main.platform_admin_letter_validation_preview')) assert response.status_code == 200 + + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.find('h1').text.strip() == "Letter Validation Preview" + assert page.find_all('input', class_='file-upload-field') + + +@pytest.mark.parametrize("result,expected_class", [(True, 'banner-with-tick'), (False, "banner-dangerous")]) +def test_letter_validation_preview_calls_template_preview_when_data_correct_and_displays_correct_message( + mocker, client, platform_admin_user, result, expected_class +): + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + endpoint = '{}/precompiled/validate?include_preview=true'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST']) + with requests_mock.mock() as rmock: + rmock.request( + "POST", + endpoint, + json={"pages": [], "message": "bazinga!", "result": result}, + status_code=200 + ) + with open('tests/test_pdf_files/multi_page_pdf.pdf', 'rb') as file: + response = client.post( + url_for('main.platform_admin_letter_validation_preview'), + data={"file": file}, + content_type='multipart/form-data' + ) + assert response.status_code == 200 + assert rmock.called + assert rmock.request_history[0].url == endpoint + + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.find('div', class_=expected_class).text.strip() == "bazinga!" + + +def test_letter_validation_preview_doesnt_call_template_preview_when_no_file(mocker, client, platform_admin_user): + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + validate_letter = mocker.patch('app.main.views.platform_admin.validate_letter') + response = client.post( + url_for('main.platform_admin_letter_validation_preview'), + data={"file": ""}, + content_type='multipart/form-data' + ) + assert response.status_code == 200 + validate_letter.assert_not_called() + + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.find('span', class_='error-message').text.strip() == "You need to upload a file to submit" + + +def test_letter_validation_preview_doesnt_call_template_preview_when_file_not_pdf(mocker, client, platform_admin_user): + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + validate_letter = mocker.patch('app.main.views.platform_admin.validate_letter') + with open('tests/non_spreadsheet_files/actually_a_png.csv', 'rb') as file: + response = client.post( + url_for('main.platform_admin_letter_validation_preview'), + data={"file": file}, + content_type='multipart/form-data' + ) + assert response.status_code == 200 + validate_letter.assert_not_called() + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.find('span', class_='error-message').text.strip() == "PDF documents only!" diff --git a/tests/test_pdf_files/multi_page_pdf.pdf b/tests/test_pdf_files/multi_page_pdf.pdf new file mode 100644 index 000000000..99d31cef1 Binary files /dev/null and b/tests/test_pdf_files/multi_page_pdf.pdf differ diff --git a/tests/test_pdf_files/one_page_pdf.pdf b/tests/test_pdf_files/one_page_pdf.pdf new file mode 100644 index 000000000..b8c02ff6c Binary files /dev/null and b/tests/test_pdf_files/one_page_pdf.pdf differ