From 5dc38460c83b0141010936623d1f849482a5158c Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 26 Oct 2022 15:36:50 +0700 Subject: [PATCH] TF-1080 Add unit test for mappingMailboxIdToDeleted --- .../presentation/mailbox_controller.dart | 41 +-- .../presentation/utils/mailbox_utils.dart | 39 +++ ..._mapping_delete_multiple_mailbox_test.dart | 282 ++++++++++++++++++ 3 files changed, 330 insertions(+), 32 deletions(-) create mode 100644 lib/features/mailbox/presentation/utils/mailbox_utils.dart create mode 100644 test/features/mailbox/presentation/utils/generate_mapping_delete_multiple_mailbox_test.dart diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index bc23a4cb0..8d2aceef7 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -42,13 +42,13 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_inte import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/extensions/list_mailbox_node_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; @@ -603,7 +603,10 @@ class MailboxController extends BaseMailboxController { final session = mailboxDashBoardController.sessionCurrent; if (session != null && accountId != null) { - final tupleMap = _generateMapDescendantIdsAndMailboxIdList([presentationMailbox]); + final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + [presentationMailbox], + defaultMailboxTree.value, + folderMailboxTree.value); final mapDescendantIds = tupleMap.value1; final listMailboxId = tupleMap.value2; @@ -675,41 +678,15 @@ class MailboxController extends BaseMailboxController { } } - Tuple2>, List> _generateMapDescendantIdsAndMailboxIdList( - List selectedMailboxList - ) { - Map> mapDescendantIds = {}; - List allMailboxIds = []; - - for (var mailbox in selectedMailboxList) { - final currentMailboxId = mailbox.id; - - if (allMailboxIds.contains(currentMailboxId)) { - continue; - } else { - final matchedNode = findMailboxNodeById(currentMailboxId); - - if (matchedNode != null) { - final descendantIds = matchedNode.descendantsAsList().mailboxIds; - final descendantIdsReversed = descendantIds.reversed.toList(); - - mapDescendantIds[currentMailboxId] = descendantIdsReversed; - allMailboxIds.addAll(descendantIdsReversed); - } - } - } - - log('MailboxController::_generateMapDescendantIdsByMailboxList(): mapDescendantIds: $mapDescendantIds'); - - return Tuple2(mapDescendantIds, allMailboxIds); - } - void _deleteMultipleMailboxAction(List selectedMailboxList) { final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; if (session != null && accountId != null) { - final tupleMap = _generateMapDescendantIdsAndMailboxIdList(selectedMailboxList); + final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + selectedMailboxList, + defaultMailboxTree.value, + folderMailboxTree.value); final mapDescendantIds = tupleMap.value1; final listMailboxId = tupleMap.value2; consumeState(_deleteMultipleMailboxInteractor.execute( diff --git a/lib/features/mailbox/presentation/utils/mailbox_utils.dart b/lib/features/mailbox/presentation/utils/mailbox_utils.dart new file mode 100644 index 000000000..ed351fb5b --- /dev/null +++ b/lib/features/mailbox/presentation/utils/mailbox_utils.dart @@ -0,0 +1,39 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/list_mailbox_node_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; + +class MailboxUtils { + + static Tuple2>, List> generateMapDescendantIdsAndMailboxIdList( + List selectedMailboxList, + MailboxTree defaultMailboxTree, + MailboxTree folderMailboxTree, + ) { + Map> mapDescendantIds = {}; + List allMailboxIds = []; + + for (var mailbox in selectedMailboxList) { + final currentMailboxId = mailbox.id; + + if (allMailboxIds.contains(currentMailboxId)) { + continue; + } else { + final matchedNode = defaultMailboxTree.findNode((node) => node.item.id == currentMailboxId) + ?? folderMailboxTree.findNode((node) => node.item.id == currentMailboxId); + + if (matchedNode != null) { + final descendantIds = matchedNode.descendantsAsList().mailboxIds; + final descendantIdsReversed = descendantIds.reversed.toList(); + + mapDescendantIds[currentMailboxId] = descendantIdsReversed; + allMailboxIds.addAll(descendantIdsReversed); + } + } + } + log('MailboxUtils::generateMapDescendantIdsAndMailboxIdList(): mapDescendantIds: $mapDescendantIds'); + return Tuple2(mapDescendantIds, allMailboxIds); + } +} \ No newline at end of file diff --git a/test/features/mailbox/presentation/utils/generate_mapping_delete_multiple_mailbox_test.dart b/test/features/mailbox/presentation/utils/generate_mapping_delete_multiple_mailbox_test.dart new file mode 100644 index 000000000..00455d6c4 --- /dev/null +++ b/test/features/mailbox/presentation/utils/generate_mapping_delete_multiple_mailbox_test.dart @@ -0,0 +1,282 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart'; + +void main() { + group('generate mapping delete multiple mailbox test', () { + + final expectedMapOfTwoMailboxId = { + MailboxId(Id("A")): [ + MailboxId(Id('A_1_1')), + MailboxId(Id('A_1')), + MailboxId(Id('A_2_1')), + MailboxId(Id('A_2')), + MailboxId(Id('A')) + ], + MailboxId(Id("B_1")): [MailboxId(Id('B_1'))], + }; + + final expectedListMailboxId = [ + MailboxId(Id('A_1_1')), + MailboxId(Id('A_1')), + MailboxId(Id('A_2_1')), + MailboxId(Id('A_2')), + MailboxId(Id('A')), + MailboxId(Id('B_1')), + ]; + + final expectedMapOfOneMailboxId = { + MailboxId(Id("A")): [ + MailboxId(Id('A_1_1')), + MailboxId(Id('A_1')), + MailboxId(Id('A_2_1')), + MailboxId(Id('A_2')), + MailboxId(Id('A')) + ] + }; + + final expectedMapOfThreeMailboxId = { + MailboxId(Id("A")): [ + MailboxId(Id('A_1_1')), + MailboxId(Id('A_1')), + MailboxId(Id('A_2_1')), + MailboxId(Id('A_2')), + MailboxId(Id('A')) + ], + MailboxId(Id("B_1")): [MailboxId(Id('B_1'))], + MailboxId(Id("C_1")): [MailboxId(Id('C_1'))], + }; + + test('_generateMapDescendantIdsAndMailboxIdList should return map with 2 items when mailboxes belong to 2 different tree', () async { + final defaultMailboxTree = MailboxTree(MailboxNode(PresentationMailbox(MailboxId(Id('root'))))); + + final folderMailboxTree = MailboxTree( + MailboxNode( + PresentationMailbox(MailboxId(Id('root'))), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A_2')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2')))) + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_1_1')), parentId: MailboxId(Id('A_1')))) + ] + ), + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('B')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('B_2')), parentId: MailboxId(Id('B'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('B_2_1')), parentId: MailboxId(Id('B_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id('B_1')), parentId: MailboxId(Id('B')))), + ] + ) + ] + ) + ); + + final selectedMailboxList = [ + PresentationMailbox(MailboxId(Id("A")), parentId: null), + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2'))), + PresentationMailbox(MailboxId(Id("B_1")), parentId: MailboxId(Id('B'))) + ]; + + final tupleResult = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + selectedMailboxList, + defaultMailboxTree, + folderMailboxTree); + + expect(tupleResult.value1, equals(expectedMapOfTwoMailboxId)); + }); + + test('_generateMapDescendantIdsAndMailboxIdList should return list with 5 item when mailboxes belong to 2 different tree', () async { + final defaultMailboxTree = MailboxTree(MailboxNode(PresentationMailbox(MailboxId(Id('root'))))); + + final folderMailboxTree = MailboxTree( + MailboxNode( + PresentationMailbox(MailboxId(Id('root'))), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A_2')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2')))) + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_1_1')), parentId: MailboxId(Id('A_1')))) + ] + ), + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('B')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('B_2')), parentId: MailboxId(Id('B'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('B_2_1')), parentId: MailboxId(Id('B_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id('B_1')), parentId: MailboxId(Id('B')))), + ] + ) + ] + ) + ); + + final selectedMailboxList = [ + PresentationMailbox(MailboxId(Id("A")), parentId: null), + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2'))), + PresentationMailbox(MailboxId(Id("B_1")), parentId: MailboxId(Id('B'))) + ]; + + final tupleResult = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + selectedMailboxList, + defaultMailboxTree, + folderMailboxTree); + + expect(tupleResult.value2, equals(expectedListMailboxId)); + }); + + test('_generateMapDescendantIdsAndMailboxIdList should return map with 1 items when mailboxes belong to 2 different tree', () async { + final defaultMailboxTree = MailboxTree(MailboxNode(PresentationMailbox(MailboxId(Id('root'))))); + + final folderMailboxTree = MailboxTree( + MailboxNode( + PresentationMailbox(MailboxId(Id('root'))), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A_2')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2')))) + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_1_1')), parentId: MailboxId(Id('A_1')))) + ] + ), + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('B')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('B_2')), parentId: MailboxId(Id('B'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('B_2_1')), parentId: MailboxId(Id('B_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id('B_1')), parentId: MailboxId(Id('B')))), + ] + ) + ] + ) + ); + + final selectedMailboxList = [ + PresentationMailbox(MailboxId(Id("A")), parentId: null), + ]; + + final tupleResult = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + selectedMailboxList, + defaultMailboxTree, + folderMailboxTree); + + expect(tupleResult.value1, equals(expectedMapOfOneMailboxId)); + }); + + test('_generateMapDescendantIdsAndMailboxIdList should return map with 3 items when mailboxes belong to 2 different tree', () async { + final defaultMailboxTree = MailboxTree(MailboxNode(PresentationMailbox(MailboxId(Id('root'))))); + + final folderMailboxTree = MailboxTree( + MailboxNode( + PresentationMailbox(MailboxId(Id('root'))), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('A_2')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_2_1')), parentId: MailboxId(Id('A_2')))) + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('A_1')), parentId: MailboxId(Id('A'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('A_1_1')), parentId: MailboxId(Id('A_1')))) + ] + ), + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('B')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('B_2')), parentId: MailboxId(Id('B'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('B_2_1')), parentId: MailboxId(Id('B_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id('B_1')), parentId: MailboxId(Id('B')))), + ] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id('C')), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id('C_2')), parentId: MailboxId(Id('C'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id('C_2_1')), parentId: MailboxId(Id('C_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id('C_1')), parentId: MailboxId(Id('C')))), + ] + ) + ] + ) + ); + + final selectedMailboxList = [ + PresentationMailbox(MailboxId(Id("A")), parentId: null), + PresentationMailbox(MailboxId(Id("B_1")), parentId: MailboxId(Id('B'))), + PresentationMailbox(MailboxId(Id("C_1")), parentId: MailboxId(Id('C'))) + ]; + + final tupleResult = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( + selectedMailboxList, + defaultMailboxTree, + folderMailboxTree); + + expect(tupleResult.value1, equals(expectedMapOfThreeMailboxId)); + }); + }); +} \ No newline at end of file