[bugfix] TF-2316 Can not delete folder when its children are hidden (#2519)

This commit is contained in:
Bùi Trung Hiếu
2026-04-06 13:18:34 +07:00
committed by GitHub
parent 7cf61ac2f0
commit ea7b9fed33
7 changed files with 785 additions and 371 deletions
+403
View File
@@ -107,4 +107,407 @@ class MailboxFixtures {
PresentationMailbox.actionRequiredFolder;
static final currentState = State('2c9f1b12-b35a-43e6-9af2-0106fb53a943');
static final selectedFolderToDelete = Mailbox(
id: MailboxId(Id('folderToDelete')),
name: MailboxName('folderToDelete'),
parentId: null,
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(true)
);
static final selectedFolderToDelete_1 = Mailbox(
id: MailboxId(Id('folderToDelete_1')),
name: MailboxName('folderToDelete_1'),
parentId: MailboxId(Id("folderToDelete")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_2 = Mailbox(
id: MailboxId(Id('folderToDelete_2')),
name: MailboxName('folderToDelete_2'),
parentId: MailboxId(Id("folderToDelete_1")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_3 = Mailbox(
id: MailboxId(Id('folderToDelete_3')),
name: MailboxName('folderToDelete_3'),
parentId: MailboxId(Id("folderToDelete")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(true)
);
static final selectedFolderToDelete_4 = Mailbox(
id: MailboxId(Id('folderToDelete_4')),
name: MailboxName('folderToDelete_4'),
parentId: MailboxId(Id("folderToDelete_3")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_5 = Mailbox(
id: MailboxId(Id('folderToDelete_5')),
name: MailboxName('folderToDelete_5'),
parentId: MailboxId(Id("folderToDelete_3")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_6 = Mailbox(
id: MailboxId(Id('folderToDelete_6')),
name: MailboxName('folderToDelete_6'),
parentId: MailboxId(Id("folderToDelete_5")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_7 = Mailbox(
id: MailboxId(Id('folderToDelete_7')),
name: MailboxName('folderToDelete_7'),
parentId: MailboxId(Id("folderToDelete_6")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_8 = Mailbox(
id: MailboxId(Id('folderToDelete_8')),
name: MailboxName('folderToDelete_8'),
parentId: null,
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(true)
);
static final selectedFolderToDelete_9 = Mailbox(
id: MailboxId(Id('folderToDelete_9')),
name: MailboxName('folderToDelete_9'),
parentId: MailboxId(Id("folderToDelete_8")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final selectedFolderToDelete_10 = Mailbox(
id: MailboxId(Id('folderToDelete_10')),
name: MailboxName('folderToDelete_10'),
parentId: MailboxId(Id("folderToDelete_8")),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(123)),
unreadEmails: UnreadEmails(UnsignedInt(12)),
totalThreads: TotalThreads(UnsignedInt(123)),
unreadThreads: UnreadThreads(UnsignedInt(12)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true
),
isSubscribed: IsSubscribed(false)
);
static final listMailboxIdToDelete = [
MailboxId(Id('folderToDelete_7')),
MailboxId(Id('folderToDelete_6')),
MailboxId(Id('folderToDelete_5')),
MailboxId(Id('folderToDelete_4')),
MailboxId(Id('folderToDelete_3')),
MailboxId(Id('folderToDelete_2')),
MailboxId(Id('folderToDelete_1')),
MailboxId(Id('folderToDelete')),
MailboxId(Id('folderToDelete_10')),
MailboxId(Id('folderToDelete_9')),
MailboxId(Id('folderToDelete_8'))
];
static final listDescendantMailboxForSelectedFolder = <MailboxId>[
MailboxId(Id('folderToDelete_7')),
MailboxId(Id('folderToDelete_6')),
MailboxId(Id('folderToDelete_5')),
MailboxId(Id('folderToDelete_4')),
MailboxId(Id('folderToDelete_3')),
MailboxId(Id('folderToDelete_2')),
MailboxId(Id('folderToDelete_1')),
MailboxId(Id('folderToDelete')),
];
static final listDescendantMailboxForSelectedFolder2 = <MailboxId>[
MailboxId(Id('folderToDelete_10')),
MailboxId(Id('folderToDelete_9')),
MailboxId(Id('folderToDelete_8'))
];
static final listMailboxIdsToDelete = <MailboxId>[
selectedFolderToDelete.id!,
selectedFolderToDelete_8.id!,
];
// Fixtures for "no hidden children" scenario — all mailboxes are subscribed.
static final subscribedFolder = Mailbox(
id: MailboxId(Id('subscribedFolder')),
name: MailboxName('subscribedFolder'),
parentId: null,
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(true),
);
static final subscribedChild = Mailbox(
id: MailboxId(Id('subscribedChild')),
name: MailboxName('subscribedChild'),
parentId: MailboxId(Id('subscribedFolder')),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(true),
);
static final listMailboxIdsForSubscribedOnly = <MailboxId>[
MailboxId(Id('subscribedFolder')),
];
static final expectedDeleteListSubscribedOnly = <MailboxId>[
MailboxId(Id('subscribedChild')),
MailboxId(Id('subscribedFolder')),
];
// Fixtures for "3-level unsubscribed nesting" scenario.
// Tree: parentFolder (subscribed) → level1 (unsubscribed) → level2 (unsubscribed) → level3 (unsubscribed)
static final parentFolder = Mailbox(
id: MailboxId(Id('parentFolder')),
name: MailboxName('parentFolder'),
parentId: null,
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(true),
);
static final hiddenLevel1 = Mailbox(
id: MailboxId(Id('hiddenLevel1')),
name: MailboxName('hiddenLevel1'),
parentId: MailboxId(Id('parentFolder')),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(false),
);
static final hiddenLevel2 = Mailbox(
id: MailboxId(Id('hiddenLevel2')),
name: MailboxName('hiddenLevel2'),
parentId: MailboxId(Id('hiddenLevel1')),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(false),
);
static final hiddenLevel3 = Mailbox(
id: MailboxId(Id('hiddenLevel3')),
name: MailboxName('hiddenLevel3'),
parentId: MailboxId(Id('hiddenLevel2')),
role: null,
sortOrder: SortOrder(sortValue: 1000),
totalEmails: TotalEmails(UnsignedInt(0)),
unreadEmails: UnreadEmails(UnsignedInt(0)),
totalThreads: TotalThreads(UnsignedInt(0)),
unreadThreads: UnreadThreads(UnsignedInt(0)),
myRights: MailboxRights(true, true, true, true, true, true, true, true, true),
isSubscribed: IsSubscribed(false),
);
static final expectedDeleteListThreeLevelNesting = <MailboxId>[
MailboxId(Id('hiddenLevel3')),
MailboxId(Id('hiddenLevel2')),
MailboxId(Id('hiddenLevel1')),
MailboxId(Id('parentFolder')),
];
}