From 532d69844d2b37a0665fce1b357849388b03ce3e Mon Sep 17 00:00:00 2001 From: Carlos Quintana Date: Tue, 12 Aug 2025 12:34:34 +0200 Subject: [PATCH] fix: mailbox deletion respects alias setting --- app/models.py | 13 ++++++++++--- tests/test_alias_delete.py | 31 ++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/app/models.py b/app/models.py index b0526d83..35e167eb 100644 --- a/app/models.py +++ b/app/models.py @@ -2982,10 +2982,17 @@ class Mailbox(Base, ModelMixin): alias.mailbox_id = first_mb.id alias._mailboxes.remove(first_mb) else: - from app.alias_delete import perform_alias_deletion + from app.alias_delete import perform_alias_deletion, move_alias_to_trash + # If the user setting is DeleteImmediately, perform alias deletion + # Otherwise, if the user setting is MoveToTrash, assign the default mailbox and move them to trash - # only put aliases that have mailbox as a single mailbox into trash - perform_alias_deletion(alias, user, AliasDeleteReason.MailboxDeleted) + if user.alias_delete_action == UserAliasDeleteAction.DeleteImmediately: + perform_alias_deletion( + alias, user, AliasDeleteReason.MailboxDeleted + ) + else: + alias.mailbox_id = user.default_mailbox_id + move_alias_to_trash(alias, user, AliasDeleteReason.MailboxDeleted) Session.commit() cls.filter(cls.id == obj_id).delete() diff --git a/tests/test_alias_delete.py b/tests/test_alias_delete.py index 9ea8b6e4..5114ce04 100644 --- a/tests/test_alias_delete.py +++ b/tests/test_alias_delete.py @@ -43,13 +43,17 @@ def teardown_module(): def ensure_alias_is_trashed( alias: Alias, expected_audit_log_size: int, reason: AliasDeleteReason -): - assert alias.enabled is False - assert alias.delete_on is not None - assert alias.delete_reason == reason +) -> Alias: + db_alias = Alias.get(alias.id) + assert db_alias is not None + assert db_alias.enabled is False + assert db_alias.delete_on is not None + assert db_alias.delete_reason == reason # Ensure audit log - audit_logs: List[AliasAuditLog] = AliasAuditLog.filter_by(alias_id=alias.id).all() + audit_logs: List[AliasAuditLog] = AliasAuditLog.filter_by( + alias_id=db_alias.id + ).all() assert len(audit_logs) == expected_audit_log_size assert ( audit_logs[expected_audit_log_size - 2].action @@ -61,9 +65,11 @@ def ensure_alias_is_trashed( ) # Ensure DeletedAlias instance is not created - deleted_alias: Optional[DeletedAlias] = DeletedAlias.get_by(email=alias.email) + deleted_alias: Optional[DeletedAlias] = DeletedAlias.get_by(email=db_alias.email) assert deleted_alias is None + return db_alias + def ensure_alias_is_deleted( alias_id: int, @@ -205,9 +211,16 @@ def test_delete_mailbox_deletes_alias_with_user_setting( Mailbox.delete(mb.id) - ensure_alias_is_deleted( - alias_id, alias_email, 2, reason=AliasDeleteReason.MailboxDeleted - ) + if user_setting == UserAliasDeleteAction.MoveToTrash: + db_alias = ensure_alias_is_trashed( + alias, 2, reason=AliasDeleteReason.MailboxDeleted + ) + # Ensure mailbox_id has been changed to the user's default mailbox id + assert db_alias.mailbox_id == user.default_mailbox_id + elif user_setting == UserAliasDeleteAction.DeleteImmediately: + ensure_alias_is_deleted( + alias_id, alias_email, 2, reason=AliasDeleteReason.MailboxDeleted + ) # Restore alias