TF-4329 Add unit test for withoutVirtualMailbox method
This commit is contained in:
@@ -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/extensions/list_presentation_mailbox_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
|
||||
void main() {
|
||||
group('ListPresentationMailboxExtension - withoutVirtualMailbox', () {
|
||||
PresentationMailbox createMailbox(
|
||||
String idVal, {
|
||||
Role? role,
|
||||
String? name,
|
||||
String? parentIdVal,
|
||||
}) {
|
||||
return PresentationMailbox(
|
||||
MailboxId(Id(idVal)),
|
||||
role: role,
|
||||
name: name != null ? MailboxName(name) : null,
|
||||
parentId: parentIdVal != null ? MailboxId(Id(parentIdVal)) : null,
|
||||
);
|
||||
}
|
||||
|
||||
late PresentationMailbox inbox;
|
||||
late PresentationMailbox sent;
|
||||
late PresentationMailbox trash;
|
||||
late PresentationMailbox customFolder;
|
||||
late PresentationMailbox favorite;
|
||||
late PresentationMailbox actionRequired;
|
||||
late PresentationMailbox subFolderOfVirtual;
|
||||
|
||||
setUp(() {
|
||||
inbox = createMailbox(
|
||||
'mb_inbox',
|
||||
role: PresentationMailbox.roleInbox,
|
||||
name: 'Inbox',
|
||||
);
|
||||
sent = createMailbox(
|
||||
'mb_sent',
|
||||
role: PresentationMailbox.roleSent,
|
||||
name: 'Sent',
|
||||
);
|
||||
trash = createMailbox(
|
||||
'mb_trash',
|
||||
role: PresentationMailbox.roleTrash,
|
||||
name: 'Trash',
|
||||
);
|
||||
customFolder = createMailbox(
|
||||
'mb_custom',
|
||||
role: null,
|
||||
name: 'User Custom Folder',
|
||||
);
|
||||
|
||||
favorite = createMailbox(
|
||||
'mb_fav',
|
||||
role: PresentationMailbox.roleFavorite,
|
||||
name: 'Starred',
|
||||
);
|
||||
actionRequired = createMailbox(
|
||||
'mb_act',
|
||||
role: PresentationMailbox.roleActionRequired,
|
||||
name: 'Needs Action',
|
||||
);
|
||||
|
||||
subFolderOfVirtual = createMailbox(
|
||||
'mb_sub',
|
||||
parentIdVal: 'mb_fav',
|
||||
role: null,
|
||||
name: 'Sub of Favorite',
|
||||
);
|
||||
});
|
||||
|
||||
test('Should remove "Favorite" (Starred) folder', () {
|
||||
final input = [inbox, favorite, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, containsAll([inbox, sent]));
|
||||
expect(result, isNot(contains(favorite)));
|
||||
});
|
||||
|
||||
test('Should remove "Action Required" folder', () {
|
||||
final input = [inbox, actionRequired, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, containsAll([inbox, sent]));
|
||||
expect(result, isNot(contains(actionRequired)));
|
||||
});
|
||||
|
||||
test('Should remove BOTH virtual folders if present', () {
|
||||
final input = [inbox, favorite, actionRequired, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, containsAll([inbox, sent]));
|
||||
});
|
||||
|
||||
test('Should keep all standard folders (Inbox, Sent, Trash, Custom)', () {
|
||||
final input = [inbox, sent, trash, customFolder];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 4);
|
||||
expect(result, equals(input));
|
||||
});
|
||||
|
||||
test('Should return empty list if input is empty', () {
|
||||
final List<PresentationMailbox> input = [];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('Should return empty list if input contains ONLY virtual folders', () {
|
||||
final input = [favorite, actionRequired];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('Should handle duplicates of virtual folders (remove all instances)',
|
||||
() {
|
||||
final input = [inbox, favorite, favorite, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, containsAll([inbox, sent]));
|
||||
});
|
||||
|
||||
test(
|
||||
'Should NOT remove folders with similar role names (e.g., "favorites" vs "favorite")',
|
||||
() {
|
||||
final similarRoleBox = createMailbox('mb_sim', role: Role('favorites'));
|
||||
|
||||
final input = [inbox, similarRoleBox];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, contains(similarRoleBox));
|
||||
});
|
||||
|
||||
test(
|
||||
'Should NOT remove folders with different case roles (e.g., "FAVORITE")',
|
||||
() {
|
||||
final upperCaseRoleBox =
|
||||
createMailbox('mb_upper', role: Role('FAVORITE'));
|
||||
|
||||
final input = [inbox, upperCaseRoleBox];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 2);
|
||||
expect(result, contains(upperCaseRoleBox));
|
||||
});
|
||||
|
||||
test('Should NOT mutate the original list', () {
|
||||
final input = [inbox, favorite, sent];
|
||||
final originalLength = input.length;
|
||||
|
||||
final _ = input.withoutVirtualMailbox;
|
||||
|
||||
expect(input.length, originalLength);
|
||||
expect(input, contains(favorite));
|
||||
});
|
||||
|
||||
test('Should preserve object identity (return same instances)', () {
|
||||
final input = [inbox, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result[0], same(inbox));
|
||||
expect(result[1], same(sent));
|
||||
});
|
||||
|
||||
test('Should preserve the relative order of remaining items', () {
|
||||
final input = [inbox, favorite, customFolder, actionRequired, sent];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 3);
|
||||
expect(result[0], inbox);
|
||||
expect(result[1], customFolder);
|
||||
expect(result[2], sent);
|
||||
});
|
||||
|
||||
test('Should NOT remove a child folder just because its parent is virtual',
|
||||
() {
|
||||
final input = [favorite, subFolderOfVirtual];
|
||||
final result = input.withoutVirtualMailbox;
|
||||
|
||||
expect(result.length, 1);
|
||||
expect(result.first, subFolderOfVirtual);
|
||||
});
|
||||
|
||||
test('Should handle large lists efficiently', () {
|
||||
final largeList = List.generate(1000, (index) {
|
||||
if (index % 2 == 0) {
|
||||
return createMailbox(
|
||||
'id_$index',
|
||||
role: PresentationMailbox.roleInbox,
|
||||
);
|
||||
} else {
|
||||
return createMailbox(
|
||||
'id_$index',
|
||||
role: PresentationMailbox.roleFavorite,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
final stopwatch = Stopwatch()..start();
|
||||
final result = largeList.withoutVirtualMailbox;
|
||||
stopwatch.stop();
|
||||
|
||||
expect(result.length, 500);
|
||||
expect(stopwatch.elapsedMilliseconds, lessThan(100));
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user