From 0fdd38b9c5806fb9da455e5c00764fb8ed8e21c5 Mon Sep 17 00:00:00 2001 From: Leo Hemsted Date: Mon, 10 Oct 2016 17:15:57 +0100 Subject: [PATCH] add tests for new jobs functionality --- app/main/views/jobs.py | 9 +++-- app/utils.py | 4 +-- tests/app/main/views/test_jobs.py | 38 +++++++++++++++------- tests/app/notify_client/test_job_client.py | 15 +++++++-- tests/app/test_utils.py | 21 +++++++++++- tests/conftest.py | 26 +++++++++------ 6 files changed, 80 insertions(+), 33 deletions(-) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index d47cf124b..bcb3e8fe9 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -79,13 +79,12 @@ def view_jobs(service_id): if job['original_file_name'] != current_app.config['TEST_MESSAGE_FILENAME'] ] - prev_page = None if jobs_response['links'].get('prev', None): - prev_page = generate_previous_dict('main.view_jobs', service_id, page=page - 1) + prev_page = generate_previous_dict('main.view_jobs', service_id, page) next_page = None if jobs_response['links'].get('next', None): - next_page = generate_next_dict('main.view_jobs', service_id, page=page + 1) + next_page = generate_next_dict('main.view_jobs', service_id, page) return render_template( 'views/jobs/jobs.html', @@ -234,10 +233,10 @@ def get_notifications(service_id, message_type, status_override=None): } prev_page = None if notifications['links'].get('prev', None): - prev_page = generate_previous_dict('main.view_notifications', service_id, page - 1, url_args=url_args) + prev_page = generate_previous_dict('main.view_notifications', service_id, page, url_args=url_args) next_page = None if notifications['links'].get('next', None): - next_page = generate_next_dict('main.view_notifications', service_id, page + 1, url_args) + next_page = generate_next_dict('main.view_notifications', service_id, page, url_args) if request.path.endswith('csv'): csv_content = generate_notifications_csv( diff --git a/app/utils.py b/app/utils.py index 696ec4440..4c8750f39 100644 --- a/app/utils.py +++ b/app/utils.py @@ -119,11 +119,11 @@ def get_page_from_request(): def generate_previous_dict(view, service_id, page, url_args=None): - return generate_previous_next_dict(view, service_id, page, 'Previous page', url_args or {}) + return generate_previous_next_dict(view, service_id, page - 1, 'Previous page', url_args or {}) def generate_next_dict(view, service_id, page, url_args=None): - return generate_previous_next_dict(view, service_id, page, 'Next page', url_args or {}) + return generate_previous_next_dict(view, service_id, page + 1, 'Next page', url_args or {}) def generate_previous_next_dict(view, service_id, page, title, url_args): diff --git a/tests/app/main/views/test_jobs.py b/tests/app/main/views/test_jobs.py index 16506ff72..0f6d2146e 100644 --- a/tests/app/main/views/test_jobs.py +++ b/tests/app/main/views/test_jobs.py @@ -12,24 +12,38 @@ from tests import notification_json from freezegun import freeze_time -def test_should_return_list_of_all_real_jobs( - app_, +def test_get_jobs_should_return_list_of_all_real_jobs( + client, service_one, active_user_with_permissions, mock_get_jobs, mocker ): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(active_user_with_permissions, mocker, service_one) - response = client.get(url_for('main.view_jobs', service_id=service_one['id'])) + client.login(active_user_with_permissions, mocker, service_one) + response = client.get(url_for('main.view_jobs', service_id=service_one['id'])) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - assert page.h1.string == 'Uploaded files' - jobs = [x.text for x in page.tbody.find_all('a', {'class': 'file-list-filename'})] - assert len(jobs) == 4 - assert 'Test message' not in jobs + assert response.status_code == 200 + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.h1.string == 'Uploaded files' + jobs = [x.text for x in page.tbody.find_all('a', {'class': 'file-list-filename'})] + assert len(jobs) == 4 + assert 'Test message' not in jobs + + +def test_get_jobs_shows_page_links( + client, + service_one, + active_user_with_permissions, + mock_get_jobs, + mocker +): + client.login(active_user_with_permissions, mocker, service_one) + response = client.get(url_for('main.view_jobs', service_id=service_one['id'])) + + assert response.status_code == 200 + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert 'Next page' in page.find('li', {'class': 'next-page'}).text + assert 'Previous page' in page.find('li', {'class': 'previous-page'}).text @pytest.mark.parametrize( diff --git a/tests/app/notify_client/test_job_client.py b/tests/app/notify_client/test_job_client.py index 977f4eb95..02e6f740a 100644 --- a/tests/app/notify_client/test_job_client.py +++ b/tests/app/notify_client/test_job_client.py @@ -72,7 +72,16 @@ def test_client_gets_jobs_with_status_filter(mocker): JobApiClient().get_jobs(uuid.uuid4(), statuses=['foo', 'bar']) - mock_get.assert_called_once_with(url=ANY, params={'statuses': 'foo,bar'}) + mock_get.assert_called_once_with(url=ANY, params={'page': 1, 'statuses': 'foo,bar'}) + + +def test_client_gets_jobs_with_page_parameter(mocker): + client = JobApiClient() + mock_get = mocker.patch('app.notify_client.job_api_client.JobApiClient.get') + + client.get_jobs('foo', page=2) + + mock_get.assert_called_once_with(url=ANY, params={'page': 2}) def test_client_parses_job_stats(mocker): @@ -221,7 +230,7 @@ def test_client_parses_job_stats_for_service(mocker): result = client.get_jobs(service_id) - mock_get.assert_called_once_with(url=expected_url, params={}) + mock_get.assert_called_once_with(url=expected_url, params={'page': 1}) assert result['data'][0]['id'] == job_1_id assert result['data'][0]['notifications_requested'] == 80 assert result['data'][0]['notifications_sent'] == 50 @@ -281,7 +290,7 @@ def test_client_parses_empty_job_stats_for_service(mocker): result = client.get_jobs(service_id) - mock_get.assert_called_once_with(url=expected_url, params={}) + mock_get.assert_called_once_with(url=expected_url, params={'page': 1}) assert result['data'][0]['id'] == job_1_id assert result['data'][0]['notifications_requested'] == 0 assert result['data'][0]['notifications_sent'] == 0 diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index dda4cfa0b..14495ab2d 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -1,6 +1,6 @@ import pytest from io import StringIO -from app.utils import email_safe, generate_notifications_csv +from app.utils import email_safe, generate_notifications_csv, generate_previous_dict, generate_next_dict from csv import DictReader from freezegun import freeze_time @@ -48,3 +48,22 @@ def test_generate_csv_from_notifications( for row in DictReader(StringIO(csv_content)): assert row['Time'] == 'Friday 01 January 2016 at 15:09' assert row['Status'] == expected_status + + +def test_generate_previous_dict(client): + ret = generate_previous_dict('main.view_jobs', 'foo', 2, {}) + assert 'page=1' in ret['url'] + assert ret['title'] == 'Previous page' + assert ret['label'] == 'page 1' + + +def test_generate_next_dict(client): + ret = generate_next_dict('main.view_jobs', 'foo', 2, {}) + assert 'page=3' in ret['url'] + assert ret['title'] == 'Next page' + assert ret['label'] == 'page 3' + + +def test_generate_previous_next_dict_adds_other_url_args(client): + ret = generate_next_dict('main.view_notifications', 'foo', 2, {'message_type': 'blah'}) + assert 'notifications/blah' in ret['url'] diff --git a/tests/conftest.py b/tests/conftest.py index 2954a4105..d43e7d2b2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -901,7 +901,7 @@ def mock_get_job_in_progress(mocker, api_user_active): @pytest.fixture(scope='function') def mock_get_jobs(mocker, api_user_active): - def _get_jobs(service_id, limit_days=None, statuses=None): + def _get_jobs(service_id, limit_days=None, statuses=None, page=1): if statuses is None: statuses = ['', 'scheduled', 'pending', 'cancelled'] @@ -914,17 +914,23 @@ def mock_get_jobs(mocker, api_user_active): job_status=job_status ) for filename, scheduled_for, job_status in ( - ("Test message", '', 'finished'), - ("export 1/1/2016.xls", '', 'finished'), - ("all email addresses.xlsx", '', 'pending'), - ("applicants.ods", '', 'finished'), - ("thisisatest.csv", '', 'finished'), - ("send_me_later.csv", '2016-01-01 11:09:00.061258', 'scheduled'), - ("even_later.csv", '2016-01-01 23:09:00.061258', 'scheduled'), - ("full_of_regret.csv", '2016-01-01 23:09:00.061258', 'cancelled') + ('Test message', '', 'finished'), + ('export 1/1/2016.xls', '', 'finished'), + ('all email addresses.xlsx', '', 'pending'), + ('applicants.ods', '', 'finished'), + ('thisisatest.csv', '', 'finished'), + ('send_me_later.csv', '2016-01-01 11:09:00.061258', 'scheduled'), + ('even_later.csv', '2016-01-01 23:09:00.061258', 'scheduled'), + ('full_of_regret.csv', '2016-01-01 23:09:00.061258', 'cancelled') ) ] - return {"data": [job for job in jobs if job['job_status'] in statuses]} + return { + 'data': [job for job in jobs if job['job_status'] in statuses], + 'links': { + 'prev': 'services/{}/jobs?page={}'.format(service_id, page - 1), + 'next': 'services/{}/jobs?page={}'.format(service_id, page + 1) + } + } return mocker.patch('app.job_api_client.get_jobs', side_effect=_get_jobs)