2016-07-20 16:18:04 +01:00
|
|
|
import json
|
2016-09-09 16:30:07 +01:00
|
|
|
import uuid
|
2016-07-20 16:18:04 +01:00
|
|
|
from urllib.parse import quote
|
|
|
|
|
|
2016-06-07 11:25:22 +01:00
|
|
|
import pytest
|
2016-01-15 17:46:09 +00:00
|
|
|
from flask import url_for
|
2016-01-29 15:35:35 +00:00
|
|
|
from bs4 import BeautifulSoup
|
2016-07-20 16:18:04 +01:00
|
|
|
|
2016-04-12 14:19:51 +01:00
|
|
|
from app.utils import generate_notifications_csv
|
2016-07-20 16:18:04 +01:00
|
|
|
from app.main.views.jobs import get_time_left, get_status_filters
|
|
|
|
|
from tests import notification_json
|
2016-05-10 11:36:49 +01:00
|
|
|
from freezegun import freeze_time
|
2015-12-17 16:21:34 +00:00
|
|
|
|
|
|
|
|
|
2016-01-27 12:22:32 +00:00
|
|
|
def test_should_return_list_of_all_jobs(app_,
|
|
|
|
|
service_one,
|
2016-05-11 11:57:31 +01:00
|
|
|
active_user_with_permissions,
|
2016-03-23 12:15:57 +00:00
|
|
|
mock_get_jobs,
|
2016-05-11 11:57:31 +01:00
|
|
|
mocker):
|
2016-01-15 15:15:35 +00:00
|
|
|
with app_.test_request_context():
|
|
|
|
|
with app_.test_client() as client:
|
2016-05-11 11:57:31 +01:00
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for('main.view_jobs', service_id=service_one['id']))
|
2015-12-17 16:21:34 +00:00
|
|
|
|
2016-01-11 16:03:41 +00:00
|
|
|
assert response.status_code == 200
|
2016-01-29 15:35:35 +00:00
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
2016-05-25 13:36:35 +01:00
|
|
|
assert page.h1.string == 'Uploaded files'
|
2016-01-29 15:35:35 +00:00
|
|
|
jobs = page.tbody.find_all('tr')
|
|
|
|
|
assert len(jobs) == 5
|
2015-12-17 16:21:34 +00:00
|
|
|
|
|
|
|
|
|
2016-06-08 16:34:26 +01:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"status_argument, expected_api_call", [
|
|
|
|
|
(
|
|
|
|
|
'',
|
2016-08-03 09:47:12 +01:00
|
|
|
['created', 'sending', 'delivered', 'failed', 'temporary-failure', 'permanent-failure', 'technical-failure']
|
2016-06-08 16:34:26 +01:00
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'sending',
|
2016-08-03 09:47:12 +01:00
|
|
|
['sending', 'created']
|
2016-06-08 16:34:26 +01:00
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'delivered',
|
|
|
|
|
['delivered']
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'failed',
|
|
|
|
|
['failed', 'temporary-failure', 'permanent-failure', 'technical-failure']
|
|
|
|
|
)
|
|
|
|
|
]
|
|
|
|
|
)
|
2016-05-10 11:36:49 +01:00
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-03-02 17:36:20 +00:00
|
|
|
def test_should_show_page_for_one_job(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
2016-05-11 11:57:31 +01:00
|
|
|
active_user_with_permissions,
|
2016-03-02 17:36:20 +00:00
|
|
|
mock_get_service_template,
|
2016-05-24 12:34:29 +01:00
|
|
|
mock_get_job,
|
2016-05-11 11:57:31 +01:00
|
|
|
mocker,
|
2016-05-24 12:34:29 +01:00
|
|
|
mock_get_notifications,
|
2016-06-08 16:34:26 +01:00
|
|
|
fake_uuid,
|
|
|
|
|
status_argument,
|
|
|
|
|
expected_api_call
|
2016-03-02 17:36:20 +00:00
|
|
|
):
|
2016-07-18 09:23:19 +01:00
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid,
|
|
|
|
|
status=status_argument
|
|
|
|
|
))
|
2016-01-11 16:03:41 +00:00
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
2016-07-18 08:27:51 +01:00
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
assert page.h1.text.strip() == 'thisisatest.csv'
|
|
|
|
|
assert page.find('div', {'class': 'sms-message-wrapper'}).text.strip() == (
|
|
|
|
|
'{}: Your vehicle tax is about to expire'.format(service_one['name'])
|
|
|
|
|
)
|
|
|
|
|
assert ' '.join(page.find('tbody').find('tr').text.split()) == (
|
2016-09-09 12:25:39 +01:00
|
|
|
'07123456789 Delivered 1 January at 11:10am'
|
2016-07-18 08:27:51 +01:00
|
|
|
)
|
|
|
|
|
assert page.find('div', {'data-key': 'notifications'})['data-resource'] == url_for(
|
2016-06-08 16:34:26 +01:00
|
|
|
'main.view_job_updates',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid,
|
|
|
|
|
status=status_argument,
|
2016-07-18 08:27:51 +01:00
|
|
|
)
|
2016-07-18 08:36:44 +01:00
|
|
|
csv_link = page.find('a', {'download': 'download'})
|
|
|
|
|
assert csv_link['href'] == url_for(
|
2016-06-08 16:34:26 +01:00
|
|
|
'main.view_job_csv',
|
|
|
|
|
service_id=service_one['id'],
|
2016-07-18 08:27:51 +01:00
|
|
|
job_id=fake_uuid,
|
|
|
|
|
status=status_argument
|
|
|
|
|
)
|
2016-07-18 08:36:44 +01:00
|
|
|
assert csv_link.text == 'Download this report'
|
2016-07-18 09:05:00 +01:00
|
|
|
assert page.find('span', {'id': 'time-left'}).text == 'Data available for 7 days'
|
2016-08-02 10:34:27 +01:00
|
|
|
assert page.find('p', {'class': 'table-show-more-link'}).text.strip() == 'Only showing the first 50 rows'
|
2016-06-08 16:34:26 +01:00
|
|
|
mock_get_notifications.assert_called_with(
|
|
|
|
|
service_one['id'],
|
|
|
|
|
fake_uuid,
|
|
|
|
|
status=expected_api_call
|
|
|
|
|
)
|
2016-03-02 17:36:20 +00:00
|
|
|
|
|
|
|
|
|
2016-08-02 21:27:23 +01:00
|
|
|
def test_should_show_job_in_progress(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_service_template,
|
|
|
|
|
mock_get_job_in_progress,
|
|
|
|
|
mocker,
|
|
|
|
|
mock_get_notifications,
|
|
|
|
|
fake_uuid
|
|
|
|
|
):
|
|
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
assert page.find('p', {'class': 'hint'}).text.strip() == 'Report is 50% complete…'
|
|
|
|
|
|
|
|
|
|
|
2016-08-25 16:49:31 +01:00
|
|
|
def test_should_show_scheduled_job(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_service_template,
|
|
|
|
|
mock_get_scheduled_job,
|
|
|
|
|
mocker,
|
|
|
|
|
mock_get_notifications,
|
|
|
|
|
fake_uuid
|
|
|
|
|
):
|
|
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
assert page.find('main').find_all('p')[2].text.strip() == 'Sending will start at midnight'
|
2016-09-01 15:40:49 +01:00
|
|
|
assert page.find('input', {'type': 'submit', 'value': 'Cancel sending'})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_cancel_job(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
fake_uuid,
|
|
|
|
|
mocker
|
|
|
|
|
):
|
|
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
mock_cancel = mocker.patch('app.main.jobs.job_api_client.cancel_job')
|
|
|
|
|
response = client.post(url_for(
|
|
|
|
|
'main.cancel_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
mock_cancel.assert_called_once_with(service_one['id'], fake_uuid)
|
|
|
|
|
assert response.status_code == 302
|
|
|
|
|
assert response.location == url_for('main.service_dashboard', service_id=service_one['id'], _external=True)
|
2016-08-25 16:49:31 +01:00
|
|
|
|
|
|
|
|
|
2016-09-01 15:46:16 +01:00
|
|
|
def test_should_not_show_cancelled_job(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_cancelled_job,
|
|
|
|
|
mocker,
|
|
|
|
|
fake_uuid
|
|
|
|
|
):
|
|
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 404
|
|
|
|
|
|
|
|
|
|
|
2016-07-01 11:37:09 +01:00
|
|
|
def test_should_show_not_show_csv_download_in_tour(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_service_template,
|
|
|
|
|
mock_get_job,
|
|
|
|
|
mocker,
|
|
|
|
|
mock_get_notifications,
|
|
|
|
|
fake_uuid
|
|
|
|
|
):
|
|
|
|
|
with app_.test_request_context(), app_.test_client() as client:
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_job',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid,
|
|
|
|
|
help=3
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
2016-07-19 09:09:20 +01:00
|
|
|
assert url_for(
|
|
|
|
|
'main.view_job_updates',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid,
|
|
|
|
|
status='',
|
|
|
|
|
help=3
|
|
|
|
|
).replace('&', '&') in response.get_data(as_text=True)
|
2016-07-01 11:37:09 +01:00
|
|
|
assert url_for(
|
|
|
|
|
'main.view_job_csv',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
job_id=fake_uuid
|
|
|
|
|
) not in response.get_data(as_text=True)
|
|
|
|
|
|
|
|
|
|
|
2016-08-26 08:06:28 +01:00
|
|
|
@freeze_time("2016-01-01 00:00:00.000001")
|
2016-03-02 17:36:20 +00:00
|
|
|
def test_should_show_updates_for_one_job_as_json(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
2016-05-11 11:57:31 +01:00
|
|
|
active_user_with_permissions,
|
2016-03-23 12:15:57 +00:00
|
|
|
mock_get_notifications,
|
2016-05-24 12:34:29 +01:00
|
|
|
mock_get_job,
|
|
|
|
|
mocker,
|
|
|
|
|
fake_uuid
|
2016-03-02 17:36:20 +00:00
|
|
|
):
|
2016-05-24 12:34:29 +01:00
|
|
|
job_json = mock_get_job(service_one['id'], fake_uuid)['data']
|
2016-03-02 17:36:20 +00:00
|
|
|
with app_.test_request_context():
|
|
|
|
|
with app_.test_client() as client:
|
2016-05-11 11:57:31 +01:00
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
2016-05-24 12:34:29 +01:00
|
|
|
response = client.get(url_for('main.view_job_updates', service_id=service_one['id'], job_id=fake_uuid))
|
2016-03-02 17:36:20 +00:00
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
content = json.loads(response.get_data(as_text=True))
|
2016-05-25 13:36:35 +01:00
|
|
|
assert 'sending' in content['counts']
|
|
|
|
|
assert 'delivered' in content['counts']
|
|
|
|
|
assert 'failed' in content['counts']
|
2016-03-02 17:36:20 +00:00
|
|
|
assert 'Recipient' in content['notifications']
|
2016-05-25 13:36:35 +01:00
|
|
|
assert '07123456789' in content['notifications']
|
2016-03-02 17:36:20 +00:00
|
|
|
assert 'Status' in content['notifications']
|
2016-06-09 10:25:52 +01:00
|
|
|
assert 'Delivered' in content['notifications']
|
2016-08-26 08:06:28 +01:00
|
|
|
assert '12:01am' in content['notifications']
|
|
|
|
|
assert 'Uploaded by Test User on 1 January at midnight' in content['status']
|
2016-03-16 16:57:10 +00:00
|
|
|
|
|
|
|
|
|
2016-06-07 11:25:22 +01:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"message_type,page_title", [
|
|
|
|
|
('email', 'Emails'),
|
|
|
|
|
('sms', 'Text messages')
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"status_argument, expected_api_call", [
|
Add filters for ‘processed’ and sending states
- _Processed_ is all the notifications that we know about, ie sending,
failed and delivered
- _Sending_ is notifications that we have either put into a queue or are
waiting to hear back from the provider about.
The big numbers on the dashboard are a count of all the messages we’ve
processed. So when you click them, the table of notifications you see
on the dashboard should contain that number of notifications.
This also gets the activity page one step closer to being like the job
page:
| Before | After
---------|----------------------------|---------------------------------
Activity | Sending, failed, both | Processed, sending, failed, delivered
Job page | Sending, failed, delivered | Sending, failed, delivered
2016-06-07 12:01:43 +01:00
|
|
|
(
|
2016-08-03 09:47:27 +01:00
|
|
|
'',
|
2016-08-03 09:47:12 +01:00
|
|
|
['created', 'sending', 'delivered', 'failed', 'temporary-failure', 'permanent-failure', 'technical-failure']
|
Add filters for ‘processed’ and sending states
- _Processed_ is all the notifications that we know about, ie sending,
failed and delivered
- _Sending_ is notifications that we have either put into a queue or are
waiting to hear back from the provider about.
The big numbers on the dashboard are a count of all the messages we’ve
processed. So when you click them, the table of notifications you see
on the dashboard should contain that number of notifications.
This also gets the activity page one step closer to being like the job
page:
| Before | After
---------|----------------------------|---------------------------------
Activity | Sending, failed, both | Processed, sending, failed, delivered
Job page | Sending, failed, delivered | Sending, failed, delivered
2016-06-07 12:01:43 +01:00
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'sending',
|
2016-08-03 09:47:12 +01:00
|
|
|
['sending', 'created']
|
Add filters for ‘processed’ and sending states
- _Processed_ is all the notifications that we know about, ie sending,
failed and delivered
- _Sending_ is notifications that we have either put into a queue or are
waiting to hear back from the provider about.
The big numbers on the dashboard are a count of all the messages we’ve
processed. So when you click them, the table of notifications you see
on the dashboard should contain that number of notifications.
This also gets the activity page one step closer to being like the job
page:
| Before | After
---------|----------------------------|---------------------------------
Activity | Sending, failed, both | Processed, sending, failed, delivered
Job page | Sending, failed, delivered | Sending, failed, delivered
2016-06-07 12:01:43 +01:00
|
|
|
),
|
2016-06-07 11:25:22 +01:00
|
|
|
(
|
|
|
|
|
'delivered',
|
|
|
|
|
['delivered']
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'failed',
|
|
|
|
|
['failed', 'temporary-failure', 'permanent-failure', 'technical-failure']
|
|
|
|
|
)
|
|
|
|
|
]
|
|
|
|
|
)
|
2016-09-30 15:17:17 +01:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"page_argument, expected_page_argument", [
|
|
|
|
|
(1, 1),
|
|
|
|
|
(22, 22),
|
|
|
|
|
(None, 1)
|
|
|
|
|
]
|
|
|
|
|
)
|
2016-06-07 11:28:23 +01:00
|
|
|
def test_can_show_notifications(
|
2016-06-07 11:17:33 +01:00
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_notifications,
|
2016-07-20 15:54:30 +01:00
|
|
|
mock_get_detailed_service,
|
2016-06-07 11:25:22 +01:00
|
|
|
mocker,
|
|
|
|
|
message_type,
|
|
|
|
|
page_title,
|
|
|
|
|
status_argument,
|
2016-09-30 15:17:17 +01:00
|
|
|
expected_api_call,
|
|
|
|
|
page_argument,
|
|
|
|
|
expected_page_argument
|
2016-06-07 11:17:33 +01:00
|
|
|
):
|
2016-04-04 16:34:06 +01:00
|
|
|
with app_.test_request_context():
|
|
|
|
|
with app_.test_client() as client:
|
2016-05-11 11:57:31 +01:00
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
2016-04-04 16:34:06 +01:00
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_notifications',
|
|
|
|
|
service_id=service_one['id'],
|
2016-06-07 11:25:22 +01:00
|
|
|
message_type=message_type,
|
2016-09-30 15:17:17 +01:00
|
|
|
status=status_argument,
|
|
|
|
|
page=page_argument))
|
2016-04-28 15:50:05 +01:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
content = response.get_data(as_text=True)
|
|
|
|
|
|
|
|
|
|
notifications = notification_json(service_one['id'])
|
|
|
|
|
notification = notifications['notifications'][0]
|
|
|
|
|
assert notification['to'] in content
|
|
|
|
|
assert notification['status'] in content
|
|
|
|
|
assert notification['template']['name'] in content
|
2016-05-25 13:36:35 +01:00
|
|
|
assert 'csv' in content
|
2016-04-29 15:24:48 +01:00
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
2016-06-07 11:25:22 +01:00
|
|
|
assert page_title in page.h1.text.strip()
|
2016-06-07 11:41:20 +01:00
|
|
|
assert url_for(
|
|
|
|
|
'.view_notifications_csv',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type=message_type,
|
|
|
|
|
status=status_argument
|
|
|
|
|
) == page.findAll("a", {"download": "download"})[0]['href']
|
2016-06-07 11:25:22 +01:00
|
|
|
|
2016-09-30 15:17:17 +01:00
|
|
|
assert url_for(
|
|
|
|
|
'.get_notifications_as_json',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type=message_type,
|
|
|
|
|
status=status_argument,
|
|
|
|
|
page=expected_page_argument
|
|
|
|
|
) == page.find("div", {'data-key': 'notifications'})['data-resource']
|
|
|
|
|
|
2016-10-05 16:05:41 +01:00
|
|
|
path_to_json = page.find("div", {'data-key': 'notifications'})['data-resource']
|
|
|
|
|
|
|
|
|
|
assert (
|
|
|
|
|
'/services/{}/notifications/{}.json?status={}&page={}'.format(
|
|
|
|
|
service_one['id'], message_type, status_argument, expected_page_argument
|
|
|
|
|
) in path_to_json or
|
|
|
|
|
'/services/{}/notifications/{}.json?page={}&status={}'.format(
|
|
|
|
|
service_one['id'], message_type, expected_page_argument, status_argument
|
|
|
|
|
) in path_to_json
|
|
|
|
|
)
|
|
|
|
|
|
2016-06-07 11:25:22 +01:00
|
|
|
mock_get_notifications.assert_called_with(
|
|
|
|
|
limit_days=7,
|
2016-09-30 15:17:17 +01:00
|
|
|
page=expected_page_argument,
|
2016-06-07 11:25:22 +01:00
|
|
|
service_id=service_one['id'],
|
|
|
|
|
status=expected_api_call,
|
|
|
|
|
template_type=[message_type]
|
|
|
|
|
)
|
2016-04-28 15:50:05 +01:00
|
|
|
|
2016-06-07 11:28:23 +01:00
|
|
|
csv_response = client.get(url_for(
|
2016-06-07 11:41:20 +01:00
|
|
|
'main.view_notifications_csv',
|
2016-06-07 11:28:23 +01:00
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type='email',
|
|
|
|
|
download='csv'
|
|
|
|
|
))
|
|
|
|
|
csv_content = generate_notifications_csv(
|
|
|
|
|
mock_get_notifications(service_one['id'])['notifications']
|
|
|
|
|
)
|
|
|
|
|
assert csv_response.status_code == 200
|
|
|
|
|
assert csv_response.get_data(as_text=True) == csv_content
|
|
|
|
|
assert 'text/csv' in csv_response.headers['Content-Type']
|
2016-04-29 15:24:48 +01:00
|
|
|
|
2016-09-27 15:07:40 +01:00
|
|
|
json_response = client.get(url_for(
|
|
|
|
|
'main.get_notifications_as_json',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type=message_type,
|
|
|
|
|
status=status_argument
|
|
|
|
|
))
|
|
|
|
|
json_content = json.loads(json_response.get_data(as_text=True))
|
|
|
|
|
assert json_content.keys() == {'counts', 'notifications'}
|
|
|
|
|
|
2016-04-29 15:24:48 +01:00
|
|
|
|
2016-06-07 16:35:03 +01:00
|
|
|
def test_should_show_notifications_for_a_service_with_next_previous(
|
|
|
|
|
app_,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_notifications_with_previous_next,
|
2016-07-20 15:54:30 +01:00
|
|
|
mock_get_detailed_service,
|
2016-06-07 16:35:03 +01:00
|
|
|
mocker
|
|
|
|
|
):
|
2016-03-16 16:57:10 +00:00
|
|
|
with app_.test_request_context():
|
|
|
|
|
with app_.test_client() as client:
|
2016-05-11 11:57:31 +01:00
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
2016-06-07 11:17:33 +01:00
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_notifications',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type='sms',
|
|
|
|
|
page=2
|
|
|
|
|
))
|
2016-03-16 16:57:10 +00:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
content = response.get_data(as_text=True)
|
2016-08-05 11:33:32 +01:00
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
next_page_link = page.find('a', {'rel': 'next'})
|
|
|
|
|
prev_page_link = page.find('a', {'rel': 'previous'})
|
|
|
|
|
assert (
|
|
|
|
|
url_for('main.view_notifications', service_id=service_one['id'], message_type='sms', page=3) in
|
|
|
|
|
next_page_link['href']
|
|
|
|
|
)
|
|
|
|
|
assert 'Next page' in next_page_link.text.strip()
|
|
|
|
|
assert 'page 3' in next_page_link.text.strip()
|
|
|
|
|
assert (
|
|
|
|
|
url_for('main.view_notifications', service_id=service_one['id'], message_type='sms', page=1) in
|
|
|
|
|
prev_page_link['href']
|
|
|
|
|
)
|
|
|
|
|
assert 'Previous page' in prev_page_link.text.strip()
|
|
|
|
|
assert 'page 1' in prev_page_link.text.strip()
|
2016-04-12 14:19:51 +01:00
|
|
|
|
|
|
|
|
|
2016-05-24 09:52:43 +01:00
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-05-23 12:14:12 +01:00
|
|
|
def test_should_download_notifications_for_a_job(app_,
|
|
|
|
|
api_user_active,
|
|
|
|
|
mock_login,
|
|
|
|
|
mock_get_service,
|
|
|
|
|
mock_get_job,
|
|
|
|
|
mock_get_notifications,
|
|
|
|
|
mock_get_template_version,
|
|
|
|
|
mock_has_permissions,
|
|
|
|
|
fake_uuid):
|
|
|
|
|
with app_.test_request_context():
|
|
|
|
|
with app_.test_client() as client:
|
|
|
|
|
client.login(api_user_active)
|
|
|
|
|
response = client.get(url_for(
|
2016-06-07 11:41:20 +01:00
|
|
|
'main.view_job_csv',
|
2016-05-23 12:14:12 +01:00
|
|
|
service_id=fake_uuid,
|
|
|
|
|
job_id=fake_uuid,
|
2016-06-07 11:41:20 +01:00
|
|
|
))
|
2016-05-23 12:14:12 +01:00
|
|
|
csv_content = generate_notifications_csv(
|
2016-06-07 11:41:20 +01:00
|
|
|
mock_get_notifications(fake_uuid, job_id=fake_uuid)['notifications']
|
|
|
|
|
)
|
2016-05-23 12:14:12 +01:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
assert response.get_data(as_text=True) == csv_content
|
|
|
|
|
assert 'text/csv' in response.headers['Content-Type']
|
2016-08-26 08:06:28 +01:00
|
|
|
assert 'sample template - 1 January at 11:09am.csv"' in response.headers['Content-Disposition']
|
2016-07-20 11:50:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"job_created_at, expected_message", [
|
|
|
|
|
("2016-01-10 11:09:00.000000+00:00", "Data available for 7 days"),
|
|
|
|
|
("2016-01-04 11:09:00.000000+00:00", "Data available for 1 day"),
|
|
|
|
|
("2016-01-03 11:09:00.000000+00:00", "Data available for 11 hours"),
|
|
|
|
|
("2016-01-02 23:59:59.000000+00:00", "Data no longer available")
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
@freeze_time("2016-01-10 12:00:00.000000")
|
|
|
|
|
def test_time_left(job_created_at, expected_message):
|
|
|
|
|
assert get_time_left(job_created_at) == expected_message
|
2016-07-20 16:18:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
STATISTICS = {
|
|
|
|
|
'sms': {
|
|
|
|
|
'requested': 6,
|
|
|
|
|
'failed': 2,
|
|
|
|
|
'delivered': 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_status_filters_calculates_stats(app_):
|
|
|
|
|
with app_.test_request_context():
|
|
|
|
|
ret = get_status_filters({'id': 'foo'}, 'sms', STATISTICS)
|
|
|
|
|
|
|
|
|
|
assert {label: count for label, _option, _link, count in ret} == {
|
2016-08-03 09:47:27 +01:00
|
|
|
'total': 6,
|
2016-07-20 16:18:04 +01:00
|
|
|
'sending': 3,
|
|
|
|
|
'failed': 2,
|
|
|
|
|
'delivered': 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_status_filters_in_right_order(app_):
|
|
|
|
|
with app_.test_request_context():
|
|
|
|
|
ret = get_status_filters({'id': 'foo'}, 'sms', STATISTICS)
|
|
|
|
|
|
|
|
|
|
assert [label for label, _option, _link, _count in ret] == [
|
2016-08-03 09:47:27 +01:00
|
|
|
'total', 'sending', 'delivered', 'failed'
|
2016-07-20 16:18:04 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_status_filters_constructs_links(app_):
|
|
|
|
|
with app_.test_request_context():
|
|
|
|
|
ret = get_status_filters({'id': 'foo'}, 'sms', STATISTICS)
|
|
|
|
|
|
|
|
|
|
link = ret[0][2]
|
|
|
|
|
assert link == '/services/foo/notifications/sms?status={}'.format(quote('sending,delivered,failed'))
|
2016-09-09 16:30:07 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_html_contains_notification_id(
|
|
|
|
|
client,
|
|
|
|
|
service_one,
|
|
|
|
|
active_user_with_permissions,
|
|
|
|
|
mock_get_notifications,
|
|
|
|
|
mock_get_detailed_service,
|
|
|
|
|
mocker
|
|
|
|
|
):
|
|
|
|
|
client.login(active_user_with_permissions, mocker, service_one)
|
|
|
|
|
response = client.get(url_for(
|
|
|
|
|
'main.view_notifications',
|
|
|
|
|
service_id=service_one['id'],
|
|
|
|
|
message_type='sms',
|
|
|
|
|
status='')
|
|
|
|
|
)
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
notifications = page.tbody.find_all('tr')
|
|
|
|
|
for tr in notifications:
|
|
|
|
|
assert uuid.UUID(tr.attrs['id'])
|