Init mailbox feature add presentation layer

This commit is contained in:
dab246
2021-07-27 12:56:27 +07:00
committed by Dat H. Pham
parent 8772126a3f
commit cab53453b5
18 changed files with 1170 additions and 1 deletions
@@ -0,0 +1,4 @@
import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class MockMailboxRepository extends Mock implements MailboxRepository {}
@@ -0,0 +1,48 @@
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';
void main() {
group('mailbox node test', () {
test('addChild should add mailbox to a node', () async {
final parentMailbox = PresentationMailbox(MailboxId(Id('1')));
final node = MailboxNode(parentMailbox);
final childMailbox = PresentationMailbox(MailboxId(Id('11')), parentId: MailboxId(Id('1')));
final childNode = node.addChild(childMailbox);
expect(node.childrenItems.length, equals(1));
expect(node.childrenItems[0], equals(childNode));
});
test('addChild should add new mailbox to a node', () async {
final parentMailbox = PresentationMailbox(MailboxId(Id('1')));
final node = MailboxNode(parentMailbox);
final childMailbox = PresentationMailbox(MailboxId(Id('11')), parentId: MailboxId(Id('1')));
final childNode = node.addChild(childMailbox);
final childMailbox2 = PresentationMailbox(MailboxId(Id('12')), parentId: MailboxId(Id('1')));
final childNode2 = node.addChild(childMailbox2);
expect(node.childrenItems.length, equals(2));
expect(node.childrenItems, containsAll({childNode, childNode2}));
});
test('addChild add new mailbox without parentId to a node should return null', () async {
final parentMailbox = PresentationMailbox(MailboxId(Id('1')));
final node = MailboxNode(parentMailbox);
final orphanMailbox = PresentationMailbox(MailboxId(Id('22')));
expect(node.addChild(orphanMailbox), null);
});
test('addChild add new mailbox with other parentId to a node should return null', () async {
final parentMailbox = PresentationMailbox(MailboxId(Id('1')));
final node = MailboxNode(parentMailbox);
final orphanMailbox = PresentationMailbox(MailboxId(Id('21')), parentId: MailboxId(Id('2')));
expect(node.addChild(orphanMailbox), null);
});
});
}
@@ -0,0 +1,212 @@
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/model/mailbox_tree_builder.dart';
void main() {
group('generate mailbox tree: ', () {
final expectedTree = MailboxTree(
MailboxNode(
PresentationMailbox(MailboxId(Id('root'))),
child: [
MailboxNode(
PresentationMailbox(MailboxId(Id("1")), parentId: null),
child: [
MailboxNode(PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1')))),
MailboxNode(
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
child: [
MailboxNode(PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))))
]
),
]
),
MailboxNode(
PresentationMailbox(MailboxId(Id("2")), parentId: null),
child: [
MailboxNode(PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
child: [
MailboxNode(
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
child: [MailboxNode(PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))))]
),
MailboxNode(PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))))
]
),
MailboxNode(PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))))
]
),
MailboxNode(
PresentationMailbox(MailboxId(Id("3")), parentId: null),
child: [
MailboxNode(
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
child: [
MailboxNode(PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))))
]
),
MailboxNode(
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
child: [MailboxNode(PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))))]
)
]
),
]
)
);
test('list mailbox is in ordered, parent come first, then children', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree, equals(expectedTree));
});
test('list mailbox is not in ordered, parent come first, then children, then grandpa', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree.root.childrenItems, containsAll(expectedTree.root.childrenItems));
expect(generatedTree.root.childrenItems[2], equals(expectedTree.root.childrenItems[0]));
});
test('list mailbox is not in ordered, parent come first, then grandpa, then children', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree.root.childrenItems, containsAll(expectedTree.root.childrenItems));
expect(generatedTree.root.childrenItems[2], equals(expectedTree.root.childrenItems[0]));
});
test('list mailbox is not in ordered, children come first, then grandpa, then parent', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree.root.childrenItems, containsAll(expectedTree.root.childrenItems));
expect(generatedTree.root.childrenItems[2], equals(expectedTree.root.childrenItems[0]));
});
test('list mailbox is not in ordered, children come first, then parent, then grandpa', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree.root.childrenItems, containsAll(expectedTree.root.childrenItems));
expect(generatedTree.root.childrenItems[2], equals(expectedTree.root.childrenItems[0]));
});
test('item have parent but not found in tree will become root child', () async {
final testCase = [
PresentationMailbox(MailboxId(Id("2")), parentId: null),
PresentationMailbox(MailboxId(Id("3")), parentId: null),
PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2'))),
PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))),
PresentationMailbox(MailboxId(Id("1")), parentId: null),
PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2'))),
PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))),
PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1'))),
PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))),
PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1'))),
PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))),
PresentationMailbox(MailboxId(Id("e3_2_1")), parentId: MailboxId(Id('id42')))
];
final generatedTree = await TreeBuilder().generateMailboxTree(testCase);
expect(generatedTree.root.childrenItems.length, equals(4));
expect(generatedTree.root.childrenItems,
contains(MailboxNode(PresentationMailbox(MailboxId(Id("e3_2_1")), parentId: MailboxId(Id('id42'))))));
});
});
}
@@ -0,0 +1,101 @@
import 'dart:io';
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';
void main() {
group('test findNode in mailbox tree', () {
late MailboxTree? tree;
final level1Node = PresentationMailbox(MailboxId(Id('1')));
final level1Node1 = PresentationMailbox(MailboxId(Id('1_1')));
final level1Node2 = PresentationMailbox(MailboxId(Id('1_2')));
final level2Node1 = PresentationMailbox(MailboxId(Id('2_1')), parentId: MailboxId(Id('1')));
final level3Node1 = PresentationMailbox(MailboxId(Id('3_1')), parentId: MailboxId(Id('2_1')));
setUp(() {
tree = MailboxTree(MailboxNode.root());
tree!.insertNode(level1Node);
tree!.insertNode(level1Node1);
tree!.insertNode(level1Node2);
tree!.insertNode(level2Node1);
tree!.insertNode(level3Node1);
});
test('findNode should find a node in tree at level 1', () {
final node1 = tree!.findNode(MailboxId(Id('1')));
expect(node1!.item, equals(level1Node));
});
test('findNode should find a node in tree at level 2', () {
final node1 = tree!.findNode(MailboxId(Id('1_2')));
expect(node1!.item, equals(level1Node2));
});
test('findNode should find a leaf in tree', () {
final node1 = tree!.findNode(MailboxId(Id('3_1')));
expect(node1!.item, equals(level3Node1));
});
test('findNode should find a node which have children in tree', () {
final node1 = tree!.findNode(MailboxId(Id('2_1')));
expect(node1!.item, equals(level2Node1));
expect(node1.childrenItems.length, equals(1));
expect(node1.childrenItems[0].item, equals(level3Node1));
});
test('findNode should not find a node not in tree', () {
expect(tree!.findNode(MailboxId(Id('4_1'))), null);
});
tearDown(() {
tree = null;
});
});
group('test insertNode in mailbox tree', () {
test('insertNode should insert a node without parent at level 1', () {
final tree = MailboxTree(MailboxNode.root());
final mailbox = PresentationMailbox(MailboxId(Id("1")));
final insertedNode = tree.insertNode(mailbox);
expect(tree.root.childrenItems, contains(insertedNode));
});
test('insertNode should insert a node to correctly parent', () {
final tree = MailboxTree(MailboxNode.root());
final level1Node = PresentationMailbox(MailboxId(Id('1')));
final level1Node1 = PresentationMailbox(MailboxId(Id('1_1')));
final level1Node2 = PresentationMailbox(MailboxId(Id('1_2')));
tree.insertNode(level1Node);
tree.insertNode(level1Node1);
tree.insertNode(level1Node2);
final insertedNode = tree.insertNode(PresentationMailbox(MailboxId(Id('2_1_2')), parentId: MailboxId(Id('1_2'))));
final foundLevel1Node2 = tree.findNode(MailboxId(Id('1_2')));
expect(foundLevel1Node2?.childrenItems.length, equals(1));
expect(foundLevel1Node2?.childrenItems, contains(insertedNode));
});
test('insertNode should insert a node to root if parent not found', () {
final tree = MailboxTree(MailboxNode.root());
final level1Node = PresentationMailbox(MailboxId(Id('1')));
final level1Node1 = PresentationMailbox(MailboxId(Id('1_1')));
final level1Node2 = PresentationMailbox(MailboxId(Id('1_2')));
tree.insertNode(level1Node);
tree.insertNode(level1Node1);
tree.insertNode(level1Node2);
final insertedNode = tree.insertNode(PresentationMailbox(MailboxId(Id('1_1_1_exp')), parentId: MailboxId(Id('e1_2'))));
expect(tree.root.childrenItems.length, equals(4));
expect(tree.root.childrenItems.map((childNode) => childNode.item).toList(),
containsAll({level1Node, level1Node2, level1Node1, insertedNode!.item}));
});
});
}