Skip to content

Commit 51b9ffd

Browse files
dab246hoangdat
authored andcommitted
TF-4329 Add unit test for withoutVirtualMailbox method
1 parent 0db3845 commit 51b9ffd

File tree

1 file changed

+212
-0
lines changed

1 file changed

+212
-0
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:jmap_dart_client/jmap/core/id.dart';
3+
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
4+
import 'package:model/extensions/list_presentation_mailbox_extension.dart';
5+
import 'package:model/mailbox/presentation_mailbox.dart';
6+
7+
void main() {
8+
group('ListPresentationMailboxExtension - withoutVirtualMailbox', () {
9+
PresentationMailbox createMailbox(
10+
String idVal, {
11+
Role? role,
12+
String? name,
13+
String? parentIdVal,
14+
}) {
15+
return PresentationMailbox(
16+
MailboxId(Id(idVal)),
17+
role: role,
18+
name: name != null ? MailboxName(name) : null,
19+
parentId: parentIdVal != null ? MailboxId(Id(parentIdVal)) : null,
20+
);
21+
}
22+
23+
late PresentationMailbox inbox;
24+
late PresentationMailbox sent;
25+
late PresentationMailbox trash;
26+
late PresentationMailbox customFolder;
27+
late PresentationMailbox favorite;
28+
late PresentationMailbox actionRequired;
29+
late PresentationMailbox subFolderOfVirtual;
30+
31+
setUp(() {
32+
inbox = createMailbox(
33+
'mb_inbox',
34+
role: PresentationMailbox.roleInbox,
35+
name: 'Inbox',
36+
);
37+
sent = createMailbox(
38+
'mb_sent',
39+
role: PresentationMailbox.roleSent,
40+
name: 'Sent',
41+
);
42+
trash = createMailbox(
43+
'mb_trash',
44+
role: PresentationMailbox.roleTrash,
45+
name: 'Trash',
46+
);
47+
customFolder = createMailbox(
48+
'mb_custom',
49+
role: null,
50+
name: 'User Custom Folder',
51+
);
52+
53+
favorite = createMailbox(
54+
'mb_fav',
55+
role: PresentationMailbox.roleFavorite,
56+
name: 'Starred',
57+
);
58+
actionRequired = createMailbox(
59+
'mb_act',
60+
role: PresentationMailbox.roleActionRequired,
61+
name: 'Needs Action',
62+
);
63+
64+
subFolderOfVirtual = createMailbox(
65+
'mb_sub',
66+
parentIdVal: 'mb_fav',
67+
role: null,
68+
name: 'Sub of Favorite',
69+
);
70+
});
71+
72+
test('Should remove "Favorite" (Starred) folder', () {
73+
final input = [inbox, favorite, sent];
74+
final result = input.withoutVirtualMailbox;
75+
76+
expect(result.length, 2);
77+
expect(result, containsAll([inbox, sent]));
78+
expect(result, isNot(contains(favorite)));
79+
});
80+
81+
test('Should remove "Action Required" folder', () {
82+
final input = [inbox, actionRequired, sent];
83+
final result = input.withoutVirtualMailbox;
84+
85+
expect(result.length, 2);
86+
expect(result, containsAll([inbox, sent]));
87+
expect(result, isNot(contains(actionRequired)));
88+
});
89+
90+
test('Should remove BOTH virtual folders if present', () {
91+
final input = [inbox, favorite, actionRequired, sent];
92+
final result = input.withoutVirtualMailbox;
93+
94+
expect(result.length, 2);
95+
expect(result, containsAll([inbox, sent]));
96+
});
97+
98+
test('Should keep all standard folders (Inbox, Sent, Trash, Custom)', () {
99+
final input = [inbox, sent, trash, customFolder];
100+
final result = input.withoutVirtualMailbox;
101+
102+
expect(result.length, 4);
103+
expect(result, equals(input));
104+
});
105+
106+
test('Should return empty list if input is empty', () {
107+
final List<PresentationMailbox> input = [];
108+
final result = input.withoutVirtualMailbox;
109+
expect(result, isEmpty);
110+
});
111+
112+
test('Should return empty list if input contains ONLY virtual folders', () {
113+
final input = [favorite, actionRequired];
114+
final result = input.withoutVirtualMailbox;
115+
expect(result, isEmpty);
116+
});
117+
118+
test('Should handle duplicates of virtual folders (remove all instances)',
119+
() {
120+
final input = [inbox, favorite, favorite, sent];
121+
final result = input.withoutVirtualMailbox;
122+
123+
expect(result.length, 2);
124+
expect(result, containsAll([inbox, sent]));
125+
});
126+
127+
test(
128+
'Should NOT remove folders with similar role names (e.g., "favorites" vs "favorite")',
129+
() {
130+
final similarRoleBox = createMailbox('mb_sim', role: Role('favorites'));
131+
132+
final input = [inbox, similarRoleBox];
133+
final result = input.withoutVirtualMailbox;
134+
135+
expect(result.length, 2);
136+
expect(result, contains(similarRoleBox));
137+
});
138+
139+
test(
140+
'Should NOT remove folders with different case roles (e.g., "FAVORITE")',
141+
() {
142+
final upperCaseRoleBox =
143+
createMailbox('mb_upper', role: Role('FAVORITE'));
144+
145+
final input = [inbox, upperCaseRoleBox];
146+
final result = input.withoutVirtualMailbox;
147+
148+
expect(result.length, 2);
149+
expect(result, contains(upperCaseRoleBox));
150+
});
151+
152+
test('Should NOT mutate the original list', () {
153+
final input = [inbox, favorite, sent];
154+
final originalLength = input.length;
155+
156+
final _ = input.withoutVirtualMailbox;
157+
158+
expect(input.length, originalLength);
159+
expect(input, contains(favorite));
160+
});
161+
162+
test('Should preserve object identity (return same instances)', () {
163+
final input = [inbox, sent];
164+
final result = input.withoutVirtualMailbox;
165+
166+
expect(result[0], same(inbox));
167+
expect(result[1], same(sent));
168+
});
169+
170+
test('Should preserve the relative order of remaining items', () {
171+
final input = [inbox, favorite, customFolder, actionRequired, sent];
172+
final result = input.withoutVirtualMailbox;
173+
174+
expect(result.length, 3);
175+
expect(result[0], inbox);
176+
expect(result[1], customFolder);
177+
expect(result[2], sent);
178+
});
179+
180+
test('Should NOT remove a child folder just because its parent is virtual',
181+
() {
182+
final input = [favorite, subFolderOfVirtual];
183+
final result = input.withoutVirtualMailbox;
184+
185+
expect(result.length, 1);
186+
expect(result.first, subFolderOfVirtual);
187+
});
188+
189+
test('Should handle large lists efficiently', () {
190+
final largeList = List.generate(1000, (index) {
191+
if (index % 2 == 0) {
192+
return createMailbox(
193+
'id_$index',
194+
role: PresentationMailbox.roleInbox,
195+
);
196+
} else {
197+
return createMailbox(
198+
'id_$index',
199+
role: PresentationMailbox.roleFavorite,
200+
);
201+
}
202+
});
203+
204+
final stopwatch = Stopwatch()..start();
205+
final result = largeList.withoutVirtualMailbox;
206+
stopwatch.stop();
207+
208+
expect(result.length, 500);
209+
expect(stopwatch.elapsedMilliseconds, lessThan(100));
210+
});
211+
});
212+
}

0 commit comments

Comments
 (0)