From 77bfa674020fe65a81330758258960776daac93f Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sun, 23 Aug 2020 20:17:50 +0200 Subject: [PATCH] fix delete_alias: do not use IntegrityError --- app/alias_utils.py | 18 ++++++------------ tests/test_alias_utils.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 tests/test_alias_utils.py diff --git a/app/alias_utils.py b/app/alias_utils.py index d3c00b8c..9209f64d 100644 --- a/app/alias_utils.py +++ b/app/alias_utils.py @@ -148,27 +148,21 @@ def delete_alias(alias: Alias, user: User): """ # save deleted alias to either global or domain trash if alias.custom_domain_id: - try: + if DomainDeletedAlias.get_by( + email=alias.email, domain_id=alias.custom_domain_id + ): + LOG.debug("add %s to domain %s trash", alias, alias.custom_domain_id) db.session.add( DomainDeletedAlias( user_id=user.id, email=alias.email, domain_id=alias.custom_domain_id ) ) db.session.commit() - except IntegrityError: - LOG.exception( - "alias %s domain %s has been added before to DeletedAlias", - alias.email, - alias.custom_domain_id, - ) - db.session.rollback() else: - try: + if not DeletedAlias.get_by(email=alias.email): + LOG.d("add %s to global trash", alias) db.session.add(DeletedAlias(email=alias.email)) db.session.commit() - except IntegrityError: - LOG.exception("alias %s has been added before to DeletedAlias", alias.email) - db.session.rollback() Alias.query.filter(Alias.id == alias.id).delete() db.session.commit() diff --git a/tests/test_alias_utils.py b/tests/test_alias_utils.py new file mode 100644 index 00000000..aa4d0194 --- /dev/null +++ b/tests/test_alias_utils.py @@ -0,0 +1,38 @@ +from app.alias_utils import delete_alias +from app.extensions import db +from app.models import User, Alias, DeletedAlias + + +def test_delete_alias(flask_client): + user = User.create( + email="a@b.c", password="password", name="Test User", activated=True + ) + db.session.commit() + alias = Alias.create( + user_id=user.id, email="first@d1.test", mailbox_id=user.default_mailbox_id + ) + db.session.commit() + assert Alias.get_by(email="first@d1.test") + + delete_alias(alias, user) + assert Alias.get_by(email="first@d1.test") is None + assert DeletedAlias.get_by(email=alias.email) + + +def test_delete_alias_already_in_trash(flask_client): + """delete an alias that's already in alias trash""" + user = User.create( + email="a@b.c", password="password", name="Test User", activated=True + ) + db.session.commit() + alias = Alias.create( + user_id=user.id, email="first@d1.test", mailbox_id=user.default_mailbox_id + ) + db.session.commit() + + # add the alias to global trash + db.session.add(DeletedAlias(email=alias.email)) + db.session.commit() + + delete_alias(alias, user) + assert Alias.get_by(email="first@d1.test") is None