TF-3864 Support pasting multiple address with multiple format mixed

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-08-04 02:24:32 +07:00
committed by Dat H. Pham
parent f1ae5b58b2
commit aeeb47a6f8
11 changed files with 616 additions and 100 deletions
@@ -0,0 +1,93 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_address_extension.dart';
void main() {
group('ListAddressExtension.toFilteredEmailAddressList', () {
test('removes existing emails and duplicates', () {
final addresses = [
'a@example.com',
'b@example.com',
'B@EXAMPLE.COM', // duplicate in different case
'c@example.com',
];
final existingEmails = [
EmailAddress('B', 'b@example.com'),
EmailAddress('X', 'x@example.com'),
];
final result = addresses.toFilteredEmailAddressList(existingEmails);
expect(result.map((e) => e.emailAddress), [
'a@example.com',
'c@example.com',
]);
});
test('keeps all unique and non-existing emails', () {
final addresses = [
'a@example.com',
'b@example.com',
'c@example.com',
];
final existingEmails = [
EmailAddress('Someone', 'z@example.com'),
];
final result = addresses.toFilteredEmailAddressList(existingEmails);
expect(result.map((e) => e.emailAddress), [
'a@example.com',
'b@example.com',
'c@example.com',
]);
});
test('skips invalid emails', () {
final addresses = [
'invalid-email',
'valid@example.com',
];
final existingEmails = <EmailAddress>[];
final result = addresses.toFilteredEmailAddressList(existingEmails);
expect(result.length, 2);
expect(result[0].emailAddress, 'invalid-email');
expect(result[0].name, isNull);
expect(result[1].emailAddress, 'valid@example.com');
});
test('removes duplicates within the list', () {
final addresses = [
'a@example.com',
'A@EXAMPLE.COM', // duplicate in different case
'b@example.com',
'b@example.com',
];
final existingEmails = <EmailAddress>[];
final result = addresses.toFilteredEmailAddressList(existingEmails);
expect(result.map((e) => e.emailAddress), [
'a@example.com',
'b@example.com',
]);
});
test('removes addresses matching normalized existingEmails', () {
final addresses = [
' A@Example.Com ',
'b@example.com',
];
final existingEmails = [
EmailAddress('A', 'a@example.com'),
];
final result = addresses.toFilteredEmailAddressList(existingEmails);
expect(result.map((e) => e.emailAddress), ['b@example.com']);
});
});
}
@@ -0,0 +1,76 @@
import 'package:core/utils/mail/named_address.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_named_address_extension.dart';
void main() {
group('ListNamedAddressExtension.toFilteredEmailAddressList', () {
test('filters out emails already in existingEmails list', () {
final namedList = [
NamedAddress(name: 'A', address: 'a@example.com'),
NamedAddress(name: 'B', address: 'b@example.com'),
NamedAddress(name: 'C', address: 'c@example.com'),
];
final existingEmails = [
EmailAddress('B', 'b@example.com'),
];
final result = namedList.toFilteredEmailAddressList(existingEmails);
expect(
result.map((e) => e.emailAddress),
containsAll(['a@example.com', 'c@example.com']),
);
expect(
result.map((e) => e.emailAddress),
isNot(contains('b@example.com')),
);
});
test('removes duplicate emails within the same list', () {
final namedList = [
NamedAddress(name: 'A1', address: 'a@example.com'),
NamedAddress(name: 'A2', address: 'A@Example.com'),
// Duplicate with different case
NamedAddress(name: 'B', address: 'b@example.com'),
];
final result = namedList.toFilteredEmailAddressList([]);
expect(result.length, 2);
expect(
result.map((e) => e.emailAddress),
containsAll(['a@example.com', 'b@example.com']),
);
});
test('returns empty list if all emails are either existing or duplicates',
() {
final namedList = [
NamedAddress(name: 'A', address: 'a@example.com'),
NamedAddress(name: 'A2', address: 'A@Example.com'),
];
final existingEmails = [
EmailAddress('Existing A', 'a@example.com'),
];
final result = namedList.toFilteredEmailAddressList(existingEmails);
expect(result, isEmpty);
});
test('handles emails with empty name fields', () {
final namedList = [
NamedAddress(name: '', address: 'test@example.com'),
];
final result = namedList.toFilteredEmailAddressList([]);
expect(result.length, 1);
expect(result.first.emailAddress, 'test@example.com');
});
});
}