mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-07-18 13:39:57 -04:00
CSV files currently have ‘to’ as the recipient column. This is changing in https://github.com/alphagov/notifications-api/pull/109 The admin app also has to validate that the CSV files have the right columns, because the API expects any CSV that it’s given to have been checked (also we want things to actually work). This commit is the minimum code change needed. In the future it should reuse the same code as the API for processing CSV files. This will need more thinking.
236 lines
8.1 KiB
Python
236 lines
8.1 KiB
Python
import pytest
|
||
|
||
from io import BytesIO
|
||
from flask import url_for
|
||
from unittest.mock import ANY
|
||
|
||
template_types = ['email', 'sms']
|
||
|
||
|
||
@pytest.mark.parametrize("template_type", template_types)
|
||
def test_choose_template(
|
||
template_type,
|
||
app_,
|
||
api_user_active,
|
||
mock_login,
|
||
mock_get_user,
|
||
mock_get_service,
|
||
mock_check_verify_code,
|
||
mock_get_service_templates,
|
||
mock_get_jobs
|
||
):
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
response = client.get(url_for('main.choose_template', template_type=template_type, service_id=12345))
|
||
|
||
assert response.status_code == 200
|
||
content = response.get_data(as_text=True)
|
||
assert '{}_template_one'.format(template_type) in content
|
||
assert '{} template one content'.format(template_type) in content
|
||
assert '{}_template_two'.format(template_type) in content
|
||
assert '{} template two content'.format(template_type) in content
|
||
|
||
|
||
def test_upload_empty_csvfile_returns_to_upload_page(
|
||
app_,
|
||
api_user_active,
|
||
mock_login,
|
||
mock_get_user,
|
||
mock_get_service,
|
||
mock_get_service_templates,
|
||
mock_check_verify_code,
|
||
mock_get_service_template
|
||
):
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
upload_data = {'file': (BytesIO(''.encode('utf-8')), 'emtpy.csv')}
|
||
response = client.post(
|
||
url_for('main.send_messages', service_id=12345, template_id=54321),
|
||
data=upload_data,
|
||
follow_redirects=True
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
content = response.get_data(as_text=True)
|
||
assert 'The file emtpy.csv contained no data' in content
|
||
|
||
|
||
def test_upload_csvfile_with_invalid_phone_shows_check_page_with_errors(
|
||
app_,
|
||
api_user_active,
|
||
mocker,
|
||
mock_login,
|
||
mock_get_service,
|
||
mock_get_service_template,
|
||
mock_s3_upload
|
||
):
|
||
|
||
contents = 'phone number,name\n+44 123,test1\n+44 456,test2'
|
||
file_data = (BytesIO(contents.encode('utf-8')), 'invalid.csv')
|
||
mocker.patch('app.main.views.send.s3download', return_value=contents)
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
upload_data = {'file': file_data}
|
||
response = client.post(
|
||
url_for('main.send_messages', service_id=12345, template_id=54321),
|
||
data=upload_data,
|
||
follow_redirects=True
|
||
)
|
||
assert response.status_code == 200
|
||
content = response.get_data(as_text=True)
|
||
assert 'Your CSV file contained missing or invalid data' in content
|
||
assert '+44 123' in content
|
||
assert '+44 456' in content
|
||
assert 'Upload a CSV file' in content
|
||
|
||
|
||
def test_upload_csvfile_removes_empty_lines_and_trailing_commas(
|
||
app_,
|
||
api_user_active,
|
||
mocker,
|
||
mock_login,
|
||
mock_get_service,
|
||
mock_get_service_template,
|
||
mock_s3_upload
|
||
):
|
||
|
||
contents = 'phone number,name,,,\n++44 7700 900981,test1,,,\n+44 7700 900981,test2,,,\n ,,, \n ,,, \t \t \n'
|
||
file_data = (BytesIO(contents.encode('utf-8')), 'invalid.csv')
|
||
|
||
expected_data = {'data': ['phone number,name', '++44 7700 900981,test1', '+44 7700 900981,test2'],
|
||
'file_name': 'invalid.csv'}
|
||
|
||
mocker.patch('app.main.views.send.s3download',
|
||
return_value='phone number,name\n++44 7700 900981,test1\n+44 7700 900981,test2')
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
upload_data = {'file': file_data}
|
||
response = client.post(
|
||
url_for('main.send_messages', service_id=12345, template_id=54321),
|
||
data=upload_data,
|
||
follow_redirects=True
|
||
)
|
||
assert response.status_code == 200
|
||
mock_s3_upload.assert_called_with(ANY, '12345', expected_data, 'eu-west-1')
|
||
|
||
|
||
def test_send_test_message_to_self(
|
||
app_,
|
||
mocker,
|
||
api_user_active,
|
||
mock_login,
|
||
mock_get_service,
|
||
mock_get_service_template,
|
||
mock_s3_upload
|
||
):
|
||
|
||
expected_data = {'data': ['phone number', '+4412341234'], 'file_name': 'Test run'}
|
||
mocker.patch('app.main.views.send.s3download', return_value='phone number\r\n+4412341234')
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
response = client.get(
|
||
url_for('main.send_message_to_self', service_id=12345, template_id=54321),
|
||
follow_redirects=True
|
||
)
|
||
assert response.status_code == 200
|
||
mock_s3_upload.assert_called_with(ANY, '12345', expected_data, 'eu-west-1')
|
||
|
||
|
||
def test_download_example_csv(
|
||
app_,
|
||
mocker,
|
||
api_user_active,
|
||
mock_login,
|
||
mock_get_service,
|
||
mock_get_service_template
|
||
):
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
response = client.get(
|
||
url_for('main.get_example_csv', service_id=12345, template_id=54321),
|
||
follow_redirects=True
|
||
)
|
||
assert response.status_code == 200
|
||
assert response.get_data(as_text=True) == 'phone number\r\n+4412341234\r\n'
|
||
assert 'text/csv' in response.headers['Content-Type']
|
||
|
||
|
||
def test_upload_csvfile_with_valid_phone_shows_all_numbers(
|
||
app_,
|
||
mocker,
|
||
api_user_active,
|
||
mock_login,
|
||
mock_get_service,
|
||
mock_get_service_template,
|
||
mock_s3_upload
|
||
):
|
||
|
||
contents = 'phone number\n+44 7700 900981\n+44 7700 900982\n+44 7700 900983\n+44 7700 900984\n+44 7700 900985\n+44 7700 900986' # noqa
|
||
file_data = (BytesIO(contents.encode('utf-8')), 'valid.csv')
|
||
mocker.patch('app.main.views.send.s3download', return_value=contents)
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
upload_data = {'file': file_data}
|
||
response = client.post(url_for('main.send_messages', service_id=12345, template_id=54321),
|
||
data=upload_data,
|
||
follow_redirects=True)
|
||
with client.session_transaction() as sess:
|
||
assert int(sess['upload_data']['template_id']) == 54321
|
||
assert sess['upload_data']['original_file_name'] == 'valid.csv'
|
||
assert sess['upload_data']['notification_count'] == 6
|
||
|
||
content = response.get_data(as_text=True)
|
||
|
||
assert response.status_code == 200
|
||
assert '+44 7700 900981' in content
|
||
assert '+44 7700 900982' in content
|
||
assert '+44 7700 900983' in content
|
||
assert '+44 7700 900984' in content
|
||
assert '+44 7700 900985' in content
|
||
assert '+44 7700 900986' in content
|
||
|
||
|
||
def test_create_job_should_call_api(
|
||
app_,
|
||
service_one,
|
||
api_user_active,
|
||
mock_login,
|
||
job_data,
|
||
mock_create_job,
|
||
mock_get_job,
|
||
mock_get_service,
|
||
mock_get_service_template
|
||
):
|
||
|
||
service_id = service_one['id']
|
||
job_id = job_data['id']
|
||
original_file_name = job_data['original_file_name']
|
||
template_id = job_data['template']
|
||
notification_count = job_data['notification_count']
|
||
|
||
with app_.test_request_context():
|
||
with app_.test_client() as client:
|
||
client.login(api_user_active)
|
||
with client.session_transaction() as session:
|
||
session['upload_data'] = {'original_file_name': original_file_name,
|
||
'template_id': template_id,
|
||
'notification_count': notification_count}
|
||
url = url_for('main.check_messages', service_id=service_one['id'], upload_id=job_id)
|
||
response = client.post(url, data=job_data, follow_redirects=True)
|
||
|
||
assert response.status_code == 200
|
||
assert 'We’ve started sending your messages' in response.get_data(as_text=True)
|
||
mock_create_job.assert_called_with(job_id, service_id, template_id, original_file_name, notification_count)
|