def test_update_service_creates_a_history_record_with_current_data(notify_db_session): user = create_user() assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service(name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=user) dao_create_service(service, user) assert Service.query.count() == 1 assert Service.query.first().version == 1 assert Service.get_history_model().query.count() == 1 service.name = 'updated_service_name' dao_update_service(service) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 2 service_from_db = Service.query.first() assert service_from_db.version == 2 assert Service.get_history_model().query.filter_by(name='service_name').one().version == 1 assert Service.get_history_model().query.filter_by(name='updated_service_name').one().version == 2
def test_create_service_creates_a_history_record_with_current_data( notify_db_session): user = create_user() create_letter_branding() assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service( name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=user, ) dao_create_service(service, user) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 1 service_from_db = Service.query.first() service_history = Service.get_history_model().query.first() assert service_from_db.id == service_history.id assert service_from_db.name == service_history.name assert service_from_db.version == 1 assert service_from_db.version == service_history.version assert user.id == service_history.created_by_id assert service_from_db.created_by.id == service_history.created_by_id
def test_create_service_and_history_is_transactional(sample_user): assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service(name=None, email_from="email_from", message_limit=1000, restricted=False, created_by=sample_user) with pytest.raises(IntegrityError) as excinfo: dao_create_service(service, sample_user) assert 'column "name" violates not-null constraint' in str(excinfo.value) assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0
def test_update_service_permission_creates_a_history_record_with_current_data( notify_db_session, ): user = create_user() assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service( name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=user, ) dao_create_service( service, user, service_permissions=[ SMS_TYPE, EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, ], ) service.permissions.append( ServicePermission(service_id=service.id, permission="letter")) dao_update_service(service) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 2 service_from_db = Service.query.first() assert service_from_db.version == 2 _assert_service_permissions( service.permissions, (SMS_TYPE, EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, LETTER_TYPE)) permission = [p for p in service.permissions if p.permission == "sms"][0] service.permissions.remove(permission) dao_update_service(service) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 3 service_from_db = Service.query.first() assert service_from_db.version == 3 _assert_service_permissions( service.permissions, (EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, LETTER_TYPE)) assert len(Service.get_history_model().query.filter_by( name="service_name").all()) == 3 assert Service.get_history_model().query.filter_by( name="service_name").all()[2].version == 3
def test_save_api_key_should_not_create_new_service_history(sample_service): from app.models import Service assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 1 api_key = ApiKey(**{'service': sample_service, 'name': sample_service.name, 'created_by': sample_service.created_by, 'key_type': KEY_TYPE_NORMAL}) save_model_api_key(api_key) assert Service.get_history_model().query.count() == 1
def test_save_api_key_should_not_create_new_service_history(sample_service): from app.models import Service assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 1 api_key = ApiKey( **{ 'service': sample_service, 'name': sample_service.name, 'created_by': sample_service.created_by, 'key_type': KEY_TYPE_NORMAL }) save_model_api_key(api_key) assert Service.get_history_model().query.count() == 1
def test_create_service_and_history_is_transactional(notify_db_session): user = create_user() assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service(name=None, email_from="email_from", message_limit=1000, restricted=False, created_by=user) with pytest.raises(IntegrityError) as excinfo: dao_create_service(service, user) assert 'column "name" violates not-null constraint' in str(excinfo.value) assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0
def delete_service_and_all_associated_db_objects(service): def _delete_commit(query): query.delete() db.session.commit() _delete_commit(NotificationStatistics.query.filter_by(service=service)) _delete_commit(TemplateStatistics.query.filter_by(service=service)) _delete_commit(ProviderStatistics.query.filter_by(service=service)) _delete_commit(InvitedUser.query.filter_by(service=service)) _delete_commit(Permission.query.filter_by(service=service)) _delete_commit(ApiKey.query.filter_by(service=service)) _delete_commit(ApiKey.get_history_model().query.filter_by(service_id=service.id)) _delete_commit(NotificationHistory.query.filter_by(service=service)) _delete_commit(Notification.query.filter_by(service=service)) _delete_commit(Job.query.filter_by(service=service)) _delete_commit(Template.query.filter_by(service=service)) _delete_commit(TemplateHistory.query.filter_by(service_id=service.id)) verify_codes = VerifyCode.query.join(User).filter(User.id.in_([x.id for x in service.users])) list(map(db.session.delete, verify_codes)) db.session.commit() users = [x for x in service.users] map(service.users.remove, users) [service.users.remove(x) for x in users] _delete_commit(Service.get_history_model().query.filter_by(id=service.id)) db.session.delete(service) db.session.commit() list(map(db.session.delete, users)) db.session.commit()
def test_delete_service_and_associated_objects(notify_db_session): user = create_user() service = create_service(user=user, service_permissions=None) create_user_code(user=user, code="somecode", code_type="email") create_user_code(user=user, code="somecode", code_type="sms") template = create_template(service=service) api_key = create_api_key(service=service) create_notification(template=template, api_key=api_key) create_invited_user(service=service) assert ServicePermission.query.count() == len(( SMS_TYPE, EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, )) delete_service_and_all_associated_db_objects(service) assert VerifyCode.query.count() == 0 assert ApiKey.query.count() == 0 assert ApiKey.get_history_model().query.count() == 0 assert Template.query.count() == 0 assert TemplateHistory.query.count() == 0 assert Job.query.count() == 0 assert Notification.query.count() == 0 assert Permission.query.count() == 0 assert User.query.count() == 0 assert InvitedUser.query.count() == 0 assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 assert ServicePermission.query.count() == 0
def test_deactivating_service_creates_history(archived_service): ServiceHistory = Service.get_history_model() history = ServiceHistory.query.filter_by(id=archived_service.id).order_by( ServiceHistory.version.desc()).first() assert history.version == 2 assert history.active is False
def test_dao_fetch_service_creator(notify_db_session): active_user_1 = create_user(email="*****@*****.**", state="active") active_user_2 = create_user(email="*****@*****.**", state="active") service = Service( name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=active_user_1, ) dao_create_service( service, active_user_1, service_permissions=[ SMS_TYPE, EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, ], ) service.created_by_id = active_user_2.id service.name = "New Name" dao_update_service(service) assert Service.query.count() == 1 history_model = Service.get_history_model() entries = history_model.query.all() assert len(entries) == 2 assert entries[1].created_by_id == active_user_2.id assert active_user_1 == dao_fetch_service_creator(service.id)
def dao_fetch_service_creator(service_id: uuid.UUID) -> User: service_history = Service.get_history_model() query = (User.query.join(service_history, User.id == service_history.created_by_id).filter( service_history.id == service_id, service_history.version == 1).one()) return query
def test_delete_service_and_associated_objects( notify_db, notify_db_session, sample_user, sample_service, sample_email_code, sample_sms_code, sample_template, sample_email_template, sample_api_key, sample_job, sample_notification, sample_invited_user, sample_permission, sample_provider_statistics, ): delete_service_and_all_associated_db_objects(sample_service) assert NotificationStatistics.query.count() == 0 assert TemplateStatistics.query.count() == 0 assert ProviderStatistics.query.count() == 0 assert VerifyCode.query.count() == 0 assert ApiKey.query.count() == 0 assert ApiKey.get_history_model().query.count() == 0 assert Template.query.count() == 0 assert TemplateHistory.query.count() == 0 assert Job.query.count() == 0 assert Notification.query.count() == 0 assert Permission.query.count() == 0 assert User.query.count() == 0 assert InvitedUser.query.count() == 0 assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0
def test_delete_service_and_associated_objects(notify_db_session): user = create_user() organisation = create_organisation() service = create_service(user=user, service_permissions=None, organisation=organisation) create_user_code(user=user, code='somecode', code_type='email') create_user_code(user=user, code='somecode', code_type='sms') template = create_template(service=service) api_key = create_api_key(service=service) create_notification(template=template, api_key=api_key) create_invited_user(service=service) user.organisations = [organisation] assert ServicePermission.query.count() == len(( SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, UPLOAD_LETTERS, )) delete_service_and_all_associated_db_objects(service) assert VerifyCode.query.count() == 0 assert ApiKey.query.count() == 0 assert ApiKey.get_history_model().query.count() == 0 assert Template.query.count() == 0 assert TemplateHistory.query.count() == 0 assert Job.query.count() == 0 assert Notification.query.count() == 0 assert Permission.query.count() == 0 assert User.query.count() == 0 assert InvitedUser.query.count() == 0 assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 assert ServicePermission.query.count() == 0 # the organisation hasn't been deleted assert Organisation.query.count() == 1
def delete_service_and_all_associated_db_objects(service): def _delete_commit(query): query.delete(synchronize_session=False) db.session.commit() subq = db.session.query(Template.id).filter_by(service=service).subquery() _delete_commit(TemplateRedacted.query.filter(TemplateRedacted.template_id.in_(subq))) _delete_commit(ServiceSmsSender.query.filter_by(service=service)) _delete_commit(InvitedUser.query.filter_by(service=service)) _delete_commit(Permission.query.filter_by(service=service)) _delete_commit(NotificationHistory.query.filter_by(service=service)) _delete_commit(Notification.query.filter_by(service=service)) _delete_commit(Job.query.filter_by(service=service)) _delete_commit(Template.query.filter_by(service=service)) _delete_commit(TemplateHistory.query.filter_by(service_id=service.id)) _delete_commit(ServicePermission.query.filter_by(service_id=service.id)) _delete_commit(ApiKey.query.filter_by(service=service)) _delete_commit(ApiKey.get_history_model().query.filter_by(service_id=service.id)) _delete_commit(AnnualBilling.query.filter_by(service_id=service.id)) verify_codes = VerifyCode.query.join(User).filter(User.id.in_([x.id for x in service.users])) list(map(db.session.delete, verify_codes)) db.session.commit() users = [x for x in service.users] map(service.users.remove, users) [service.users.remove(x) for x in users] _delete_commit(Service.get_history_model().query.filter_by(id=service.id)) db.session.delete(service) db.session.commit() list(map(db.session.delete, users)) db.session.commit()
def get_service_history(service_id): from app.models import ApiKey, Service, TemplateHistory from app.schemas import ( api_key_history_schema, service_history_schema, template_history_schema, ) service_history = Service.get_history_model().query.filter_by( id=service_id).all() service_data = service_history_schema.dump(service_history, many=True).data api_key_history = ApiKey.get_history_model().query.filter_by( service_id=service_id).all() api_keys_data = api_key_history_schema.dump(api_key_history, many=True).data template_history = TemplateHistory.query.filter_by( service_id=service_id).all() template_data, errors = template_history_schema.dump(template_history, many=True) data = { "service_history": service_data, "api_key_history": api_keys_data, "template_history": template_data, "events": [], } return jsonify(data=data)
def get_service_history(service_id): from app.models import (Service, ApiKey, TemplateHistory) from app.schemas import (service_history_schema, api_key_history_schema, template_history_schema) service_history = Service.get_history_model().query.filter_by( id=service_id).all() service_data = service_history_schema.dump(service_history, many=True).data api_key_history = ApiKey.get_history_model().query.filter_by( service_id=service_id).all() api_keys_data = api_key_history_schema.dump(api_key_history, many=True).data template_history = TemplateHistory.query.filter_by( service_id=service_id).all() template_data, errors = template_history_schema.dump(template_history, many=True) data = { 'service_history': service_data, 'api_key_history': api_keys_data, 'template_history': template_data, 'events': [] } return jsonify(data=data)
def test_deactivating_service_creates_history(deactivated_service): ServiceHistory = Service.get_history_model() history = ServiceHistory.query.filter_by( id=deactivated_service.id ).order_by( ServiceHistory.version.desc() ).first() assert history.version == 2 assert history.active is False
def test_create_service_creates_a_history_record_with_current_data(sample_user): assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service( name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=sample_user ) dao_create_service(service, sample_user) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 1 service_from_db = Service.query.first() service_history = Service.get_history_model().query.first() assert service_from_db.id == service_history.id assert service_from_db.name == service_history.name assert service_from_db.version == 1 assert service_from_db.version == service_history.version assert sample_user.id == service_history.created_by_id assert service_from_db.created_by.id == service_history.created_by_id assert service_from_db.branding == BRANDING_GOVUK assert service_history.branding == BRANDING_GOVUK
def test_service_history_is_created(client, sample_service, action, original_state): sample_service.active = original_state auth_header = create_authorization_header() response = client.post("/service/{}/{}".format(sample_service.id, action), headers=[auth_header]) ServiceHistory = Service.get_history_model() history = ServiceHistory.query.filter_by(id=sample_service.id).order_by( ServiceHistory.version.desc()).first() assert response.status_code == 204 assert history.version == 2 assert history.active != original_state
def associate_services_to_organisations(): services = Service.get_history_model().query.filter_by(version=1).all() for s in services: created_by_user = User.query.filter_by(id=s.created_by_id).first() organisation = dao_get_organisation_by_email_address( created_by_user.email_address) service = dao_fetch_service_by_id(service_id=s.id) if organisation: dao_add_service_to_organisation(service=service, organisation_id=organisation.id) print("finished associating services to organisations")
def test_update_organisation_updates_the_service_org_type_if_org_type_is_provided( setup_service, sample_organisation, setup_org_type): setup_service.organisation_type = setup_org_type.name sample_organisation.organisation_type = setup_org_type.name sample_organisation.services.append(setup_service) db.session.commit() dao_update_organisation(sample_organisation.id, organisation_type='other') assert sample_organisation.organisation_type == 'other' assert setup_service.organisation_type == 'other' assert Service.get_history_model().query.filter_by( id=setup_service.id, version=2).one().organisation_type == 'other'
def test_update_service_creates_a_history_record_with_current_data(sample_user): assert Service.query.count() == 0 assert Service.get_history_model().query.count() == 0 service = Service( name="service_name", email_from="email_from", message_limit=1000, restricted=False, created_by=sample_user ) dao_create_service(service, sample_user) assert Service.query.count() == 1 assert Service.query.first().version == 1 assert Service.get_history_model().query.count() == 1 service.name = "updated_service_name" dao_update_service(service) assert Service.query.count() == 1 assert Service.get_history_model().query.count() == 2 service_from_db = Service.query.first() assert service_from_db.version == 2 assert Service.get_history_model().query.filter_by(name="service_name").one().version == 1 assert Service.get_history_model().query.filter_by(name="updated_service_name").one().version == 2
def test_update_organisation_updates_the_service_org_type_if_org_type_is_provided( sample_service, sample_organisation, ): sample_service.organisation_type = 'local' sample_organisation.organisation_type = 'local' sample_organisation.services.append(sample_service) db.session.commit() dao_update_organisation(sample_organisation.id, organisation_type='central') assert sample_organisation.organisation_type == 'central' assert sample_service.organisation_type == 'central' assert Service.get_history_model().query.filter_by( id=sample_service.id, version=2).one().organisation_type == 'central'
def test_add_service_to_organisation(sample_service, sample_organisation): assert sample_organisation.services == [] sample_service.organisation_type = "central" sample_organisation.organisation_type = "local" sample_organisation.crown = False dao_add_service_to_organisation(sample_service, sample_organisation.id) assert len(sample_organisation.services) == 1 assert sample_organisation.services[0].id == sample_service.id assert sample_service.organisation_type == sample_organisation.organisation_type assert sample_service.crown == sample_organisation.crown assert Service.get_history_model().query.filter_by( id=sample_service.id, version=2).one( ).organisation_type == sample_organisation.organisation_type assert sample_service.organisation_id == sample_organisation.id