diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index bead23a6e..08b30b381 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -86,10 +86,12 @@ def dao_deactive_service(service_id): service.email_from = '_archived_' + service.email_from for template in service.templates: - template.archived = True + if not template.archived: + template.archived = True for api_key in service.api_keys: - api_key.expiry_date = datetime.utcnow() + if not api_key.expiry_date: + api_key.expiry_date = datetime.utcnow() def dao_fetch_service_by_id_and_user(service_id, user_id): diff --git a/tests/app/service/test_deactivate.py b/tests/app/service/test_deactivate.py index 0f9a3dcce..2ed2c01a6 100644 --- a/tests/app/service/test_deactivate.py +++ b/tests/app/service/test_deactivate.py @@ -1,11 +1,14 @@ import uuid -from unittest import mock +from datetime import datetime import pytest +from freezegun import freeze_time from app import db -from app.models import Service, TemplateHistory, ApiKey +from app.models import Service from app.dao.services_dao import dao_deactive_service +from app.dao.api_key_dao import expire_api_key +from app.dao.templates_dao import dao_update_template from tests import create_authorization_header, unwrap_function from tests.app.conftest import ( @@ -79,6 +82,37 @@ def test_deactivating_service_creates_history(deactivated_service): assert history.active is False +@pytest.fixture +def deactivated_service_with_deleted_stuff(client, notify_db, notify_db_session, sample_service): + with freeze_time('2001-01-01'): + template = create_template(notify_db, notify_db_session, template_name='a') + api_key = create_api_key(notify_db, notify_db_session) + + expire_api_key(sample_service.id, api_key.id) + + template.archived = True + dao_update_template(template) + + with freeze_time('2002-02-02'): + auth_header = create_authorization_header() + response = client.post('/service/{}/deactivate'.format(sample_service.id), headers=[auth_header]) + + assert response.status_code == 204 + assert response.data == b'' + return sample_service + + +def test_deactivating_service_doesnt_affect_existing_archived_templates(deactivated_service_with_deleted_stuff): + assert deactivated_service_with_deleted_stuff.templates[0].archived is True + assert deactivated_service_with_deleted_stuff.templates[0].updated_at == datetime(2001, 1, 1, 0, 0, 0) + assert deactivated_service_with_deleted_stuff.templates[0].version == 2 + + +def test_deactivating_service_doesnt_affect_existing_revoked_api_keys(deactivated_service_with_deleted_stuff): + assert deactivated_service_with_deleted_stuff.api_keys[0].expiry_date == datetime(2001, 1, 1, 0, 0, 0) + assert deactivated_service_with_deleted_stuff.api_keys[0].version == 2 + + def test_deactivating_service_rolls_back_everything_on_error(sample_service, sample_api_key, sample_template): unwrapped_deactive_service = unwrap_function(dao_deactive_service)