from datetime import datetime import pytest from bs4 import BeautifulSoup from flask import url_for from freezegun import freeze_time from tests import validate_route_permission from app.main.views.templates import get_last_use_message, get_human_readable_delta def test_should_show_page_for_one_template( app_, api_user_active, mock_login, mock_get_service, mock_get_service_template, mock_get_user, mock_get_user_by_email, mock_has_permissions, fake_uuid ): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid response = client.get(url_for( '.edit_service_template', service_id=service_id, template_id=template_id)) assert response.status_code == 200 assert "Two week reminder" in response.get_data(as_text=True) assert "Your vehicle tax is about to expire" in response.get_data(as_text=True) mock_get_service_template.assert_called_with( service_id, template_id) def test_should_redirect_when_saving_a_template(app_, api_user_active, mock_login, mock_get_service_template, mock_update_service_template, mock_get_user, mock_get_service, mock_get_user_by_email, mock_has_permissions, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid name = "new name" content = "template content" data = { 'id': template_id, 'name': name, 'template_content': content, 'template_type': 'sms', 'service': service_id } response = client.post(url_for( '.edit_service_template', service_id=service_id, template_id=template_id), data=data) assert response.status_code == 302 assert response.location == url_for( '.view_template', service_id=service_id, template_id=template_id, _external=True) mock_update_service_template.assert_called_with( template_id, name, 'sms', content, service_id, None) def test_should_show_interstitial_when_making_breaking_change( app_, api_user_active, mock_login, mock_get_service_template, mock_update_service_template, mock_get_user, mock_get_service, mock_get_user_by_email, mock_has_permissions, fake_uuid ): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid response = client.post( url_for('.edit_service_template', service_id=service_id, template_id=template_id), data={ 'id': template_id, 'name': "new name", 'template_content': "hello ((name))", 'template_type': 'sms', 'service': service_id } ) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == "Confirm changes" for key, value in { 'name': 'new name', 'subject': '', 'template_content': 'hello ((name))', 'confirm': 'true' }.items(): assert page.find('input', {'name': key})['value'] == value def test_should_not_create_too_big_template(app_, api_user_active, mock_login, mock_get_service_template, mock_get_user, mock_get_service, mock_get_user_by_email, mock_create_service_template_content_too_big, mock_has_permissions, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_type = 'sms' data = { 'name': "new name", 'template_content': "template content", 'template_type': template_type, 'service': service_id } resp = client.post(url_for( '.add_service_template', service_id=service_id, template_type=template_type ), data=data) assert resp.status_code == 200 assert ( "Content has a character count greater" " than the limit of 459" ) in resp.get_data(as_text=True) def test_should_not_update_too_big_template(app_, api_user_active, mock_login, mock_get_service_template, mock_get_user, mock_get_service, mock_get_user_by_email, mock_update_service_template_400_content_too_big, mock_has_permissions, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_type = 'sms' template_id = fake_uuid data = { 'id': fake_uuid, 'name': "new name", 'template_content': "template content", 'service': service_id, 'template_type': 'sms' } resp = client.post(url_for( '.edit_service_template', service_id=service_id, template_id=template_id), data=data) assert resp.status_code == 200 assert ( "Content has a character count greater" " than the limit of 459" ) in resp.get_data(as_text=True) def test_should_redirect_when_saving_a_template_email(app_, api_user_active, mock_login, mock_get_service_email_template, mock_update_service_template, mock_get_user, mock_get_service, mock_get_user_by_email, mock_has_permissions, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid name = "new name" content = "template content" subject = "subject" data = { 'id': template_id, 'name': name, 'template_content': content, 'template_type': 'email', 'service': service_id, 'subject': subject } response = client.post(url_for( '.edit_service_template', service_id=service_id, template_id=template_id), data=data) assert response.status_code == 302 assert response.location == url_for( '.view_template', service_id=service_id, template_id=template_id, _external=True) mock_update_service_template.assert_called_with( template_id, name, 'email', content, service_id, subject) def test_should_show_delete_template_page(app_, api_user_active, mock_login, mock_get_service, mock_get_service_template, mock_get_user, mock_get_user_by_email, mock_has_permissions, mock_get_template_statistics_for_template, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid response = client.get(url_for( '.delete_service_template', service_id=service_id, template_id=template_id)) content = response.get_data(as_text=True) assert response.status_code == 200 assert 'Are you sure' in content assert 'Two week reminder' in content assert 'Your vehicle tax is about to expire' in content mock_get_service_template.assert_called_with(service_id, template_id) def test_should_redirect_when_deleting_a_template(app_, api_user_active, mock_login, mock_get_service, mock_get_service_template, mock_delete_service_template, mock_get_user, mock_get_user_by_email, mock_has_permissions, fake_uuid): with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid name = "new name" type_ = "sms" content = "template content" data = { 'id': str(template_id), 'name': name, 'template_type': type_, 'content': content, 'service': service_id } response = client.post(url_for( '.delete_service_template', service_id=service_id, template_id=template_id ), data=data) assert response.status_code == 302 assert response.location == url_for( '.choose_template', service_id=service_id, template_type=type_, _external=True) mock_get_service_template.assert_called_with( service_id, template_id) mock_delete_service_template.assert_called_with( service_id, template_id) @freeze_time('2016-01-01T15:00') def test_should_show_page_for_a_deleted_template( app_, api_user_active, mock_login, mock_get_service, mock_get_deleted_template, mock_get_user, mock_get_user_by_email, mock_has_permissions, fake_uuid ): with app_.test_request_context(), app_.test_client() as client: client.login(api_user_active) service_id = fake_uuid template_id = fake_uuid response = client.get(url_for( '.view_template', service_id=service_id, template_id=template_id )) assert response.status_code == 200 content = response.get_data(as_text=True) assert url_for("main.edit_service_template", service_id=fake_uuid, template_id=fake_uuid) not in content assert url_for("main.send_from_api", service_id=fake_uuid, template_id=fake_uuid) not in content assert url_for("main.send_test", service_id=fake_uuid, template_id=fake_uuid) not in content assert "This template was deleted
1 January 2016" in content mock_get_deleted_template.assert_called_with(service_id, template_id) @pytest.mark.parametrize('route', [ 'main.add_service_template', 'main.edit_service_template', 'main.delete_service_template' ]) def test_route_permissions(route, mocker, app_, api_user_active, service_one, mock_get_service_template, mock_get_template_statistics_for_template, fake_uuid): with app_.test_request_context(): validate_route_permission( mocker, app_, "GET", 200, url_for( route, service_id=service_one['id'], template_type='sms', template_id=fake_uuid), ['manage_templates'], api_user_active, service_one) def test_route_permissions_for_choose_template(mocker, app_, api_user_active, service_one, mock_get_service_templates): mocker.patch('app.job_api_client.get_job') with app_.test_request_context(): validate_route_permission( mocker, app_, "GET", 200, url_for( 'main.choose_template', service_id=service_one['id'], template_type='sms'), ['view_activity'], api_user_active, service_one) @pytest.mark.parametrize('route', [ 'main.add_service_template', 'main.edit_service_template', 'main.delete_service_template' ]) def test_route_invalid_permissions(route, mocker, app_, api_user_active, service_one, mock_get_service_template, mock_get_template_statistics_for_template, fake_uuid): with app_.test_request_context(): validate_route_permission( mocker, app_, "GET", 403, url_for( route, service_id=service_one['id'], template_type='sms', template_id=fake_uuid), ['view_activity'], api_user_active, service_one) def test_get_last_use_message_returns_no_template_message(): assert get_last_use_message('My Template', []) == 'My Template has never been used' @freeze_time('2000-01-01T15:00') def test_get_last_use_message_uses_most_recent_statistics(): template_statistics = [ { 'updated_at': '2000-01-01T12:00:00.000000+00:00' }, { 'updated_at': '2000-01-01T09:00:00.000000+00:00' }, ] assert get_last_use_message('My Template', template_statistics) == 'My Template was last used 3 hours ago' @pytest.mark.parametrize('from_time, until_time, message', [ (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 12, 0, 59), 'under a minute'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 12, 1), '1 minute'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 12, 2, 35), '2 minutes'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 12, 59), '59 minutes'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 13, 0), '1 hour'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 1, 14, 0), '2 hours'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 2, 11, 59), '23 hours'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 2, 12, 0), '1 day'), (datetime(2000, 1, 1, 12, 0), datetime(2000, 1, 3, 14, 0), '2 days'), ]) def test_get_human_readable_delta(from_time, until_time, message): assert get_human_readable_delta(from_time, until_time) == message