Show letter preview once file is uploaded

This shows the sanitised letter preview if the file had no validation
errors or the preview with the overlay if it failed validation.
This commit is contained in:
Katie Smith
2019-09-09 10:59:32 +01:00
parent 8a322b844b
commit 7368245c9a
9 changed files with 228 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ def test_post_upload_letter_redirects_for_valid_file(mocker, client_request):
antivirus_mock = mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
mocker.patch('app.main.views.uploads.sanitise_letter', return_value=Mock(content='The sanitised content'))
mock_s3 = mocker.patch('app.main.views.uploads.upload_letter_to_s3')
mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template')
with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
page = client_request.post(
@@ -50,6 +51,43 @@ def test_post_upload_letter_redirects_for_valid_file(mocker, client_request):
assert not page.find(id='validation-error-message')
def test_post_upload_letter_shows_letter_preview_for_valid_file(mocker, client_request):
letter_template = {'template_type': 'letter',
'reply_to_text': '',
'postage': 'second',
'subject': 'hi',
'content': 'my letter'}
mocker.patch('uuid.uuid4', return_value='fake-uuid')
mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
mocker.patch('app.main.views.uploads.sanitise_letter', return_value=Mock(content='The sanitised content'))
mocker.patch('app.main.views.uploads.upload_letter_to_s3')
mocker.patch('app.main.views.uploads.pdf_page_count', return_value=3)
mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template', return_value=letter_template)
with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
page = client_request.post(
'main.upload_letter',
service_id=SERVICE_ONE_ID,
_data={'file': file},
_follow_redirects=True,
)
assert len(page.select('.letter-postage')) == 1
assert normalize_spaces(page.select_one('.letter-postage').text) == ('Postage: second class')
assert page.select_one('.letter-postage')['class'] == ['letter-postage', 'letter-postage-second']
letter_images = page.select('main img')
assert len(letter_images) == 3
for page_no, img in enumerate(letter_images, start=1):
assert img['src'] == url_for(
'.view_letter_upload_as_preview',
service_id=SERVICE_ONE_ID,
file_id='fake-uuid',
page=page_no)
def test_post_upload_letter_shows_error_when_file_is_not_a_pdf(client_request):
with open('tests/non_spreadsheet_files/actually_a_png.csv', 'rb') as file:
page = client_request.post(
@@ -121,6 +159,7 @@ def test_post_upload_letter_with_invalid_file(mocker, client_request):
mock_sanitise_response = Mock()
mock_sanitise_response.raise_for_status.side_effect = RequestException(response=Mock(status_code=400))
mocker.patch('app.main.views.uploads.sanitise_letter', return_value=mock_sanitise_response)
mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template')
with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
file_contents = file.read()
@@ -145,6 +184,43 @@ def test_post_upload_letter_with_invalid_file(mocker, client_request):
) == 'Validation failed'
def test_post_upload_letter_shows_letter_preview_for_invalid_file(mocker, client_request):
letter_template = {'template_type': 'letter',
'reply_to_text': '',
'postage': 'first',
'subject': 'hi',
'content': 'my letter'}
mocker.patch('uuid.uuid4', return_value='fake-uuid')
mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
mocker.patch('app.main.views.uploads.upload_letter_to_s3')
mock_sanitise_response = Mock()
mock_sanitise_response.raise_for_status.side_effect = RequestException(response=Mock(status_code=400))
mocker.patch('app.main.views.uploads.sanitise_letter', return_value=mock_sanitise_response)
mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template', return_value=letter_template)
with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
page = client_request.post(
'main.upload_letter',
service_id=SERVICE_ONE_ID,
_data={'file': file},
_follow_redirects=True,
)
assert len(page.select('.letter-postage')) == 1
assert normalize_spaces(page.select_one('.letter-postage').text) == ('Postage: first class')
assert page.select_one('.letter-postage')['class'] == ['letter-postage', 'letter-postage-first']
letter_images = page.select('main img')
assert len(letter_images) == 1
assert letter_images[0]['src'] == url_for(
'.view_letter_upload_as_preview',
service_id=SERVICE_ONE_ID,
file_id='fake-uuid',
page=1
)
def test_post_upload_letter_does_not_upload_to_s3_if_template_preview_raises_unknown_error(mocker, client_request):
mocker.patch('uuid.uuid4', return_value='fake-uuid')
mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
@@ -164,12 +240,17 @@ def test_post_upload_letter_does_not_upload_to_s3_if_template_preview_raises_unk
assert not mock_s3.called
def test_uploaded_letter_preview(client_request):
def test_uploaded_letter_preview(mocker, client_request):
mocker.patch('app.main.views.uploads.service_api_client')
page = client_request.get(
'main.uploaded_letter_preview',
service_id=SERVICE_ONE_ID,
file_id='fake-uuid',
original_filename='my_letter.pdf',
page_count=1,
status='valid',
)
assert page.find('h1').text == 'my_letter.pdf'
assert page.find('div', class_='letter-sent')

View File

@@ -93,6 +93,14 @@ def test_client_creates_service_with_correct_data(
)
def test_get_precompiled_template(mocker):
client = ServiceAPIClient()
mock_get = mocker.patch.object(client, 'get')
client.get_precompiled_template(SERVICE_ONE_ID)
mock_get.assert_called_once_with('/service/{}/template/precompiled'.format(SERVICE_ONE_ID))
@pytest.mark.parametrize('template_data, extra_args, expected_count', (
(
[],

View File

@@ -1,3 +1,4 @@
import base64
from functools import partial
from unittest.mock import Mock
@@ -79,6 +80,44 @@ def test_from_database_object_makes_request(
request_mock.assert_called_once_with(expected_url, json=data, headers=headers)
@pytest.mark.parametrize('page_number, expected_url', [
('1', 'http://localhost:9999/precompiled-preview.png?hide_notify=true'),
('2', 'http://localhost:9999/precompiled-preview.png'),
])
def test_from_valid_pdf_file_makes_request(mocker, page_number, expected_url):
mocker.patch('app.template_previews.extract_page_from_pdf', return_value=b'pdf page')
request_mock = mocker.patch(
'app.template_previews.requests.post',
return_value=Mock(content='a', status_code='b', headers={'c': 'd'})
)
response = TemplatePreview.from_valid_pdf_file(b'pdf file', page_number)
assert response == ('a', 'b', {'c': 'd'}.items())
request_mock.assert_called_once_with(
expected_url,
data=base64.b64encode(b'pdf page').decode('utf-8'),
headers={'Authorization': 'Token my-secret-key'},
)
def test_from_invalid_pdf_file_makes_request(mocker):
mocker.patch('app.template_previews.extract_page_from_pdf', return_value=b'pdf page')
request_mock = mocker.patch(
'app.template_previews.requests.post',
return_value=Mock(content='a', status_code='b', headers={'c': 'd'})
)
response = TemplatePreview.from_invalid_pdf_file(b'pdf file', '1')
assert response == ('a', 'b', {'c': 'd'}.items())
request_mock.assert_called_once_with(
'http://localhost:9999/precompiled/overlay.png?page_number=1',
data=b'pdf page',
headers={'Authorization': 'Token my-secret-key'},
)
@pytest.mark.parametrize('template_type', [
'email', 'sms'
])