TF-3235 Create SeachSnippets for presentation emails and update at interactors
This commit is contained in:
@@ -37,7 +37,10 @@ class QuickSearchEmailInteractor {
|
|||||||
properties: properties);
|
properties: properties);
|
||||||
|
|
||||||
final presentationEmailList = emailList
|
final presentationEmailList = emailList
|
||||||
.map((email) => email.toPresentationEmail())
|
.map((email) => email.toPresentationEmail(
|
||||||
|
searchSnippetSubject: email.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: email.searchSnippetPreview,
|
||||||
|
))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
return Right(QuickSearchEmailSuccess(presentationEmailList));
|
return Right(QuickSearchEmailSuccess(presentationEmailList));
|
||||||
|
|||||||
+4
-1
@@ -42,7 +42,10 @@ class RefreshChangesSearchEmailInteractor {
|
|||||||
properties: properties);
|
properties: properties);
|
||||||
|
|
||||||
final presentationEmailList = emailList
|
final presentationEmailList = emailList
|
||||||
.map((email) => email.toPresentationEmail())
|
.map((email) => email.toPresentationEmail(
|
||||||
|
searchSnippetSubject: email.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: email.searchSnippetPreview,
|
||||||
|
))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
yield Right(RefreshChangesSearchEmailSuccess(presentationEmailList));
|
yield Right(RefreshChangesSearchEmailSuccess(presentationEmailList));
|
||||||
|
|||||||
@@ -47,7 +47,10 @@ class SearchEmailInteractor {
|
|||||||
properties: properties);
|
properties: properties);
|
||||||
|
|
||||||
final presentationEmailList = emailList
|
final presentationEmailList = emailList
|
||||||
.map((email) => email.toPresentationEmail())
|
.map((email) => email.toPresentationEmail(
|
||||||
|
searchSnippetSubject: email.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: email.searchSnippetPreview,
|
||||||
|
))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
yield Right(SearchEmailSuccess(presentationEmailList));
|
yield Right(SearchEmailSuccess(presentationEmailList));
|
||||||
|
|||||||
@@ -44,7 +44,10 @@ class SearchMoreEmailInteractor {
|
|||||||
|
|
||||||
final presentationEmailList = emailList
|
final presentationEmailList = emailList
|
||||||
.where((email) => email.id != lastEmailId)
|
.where((email) => email.id != lastEmailId)
|
||||||
.map((email) => email.toPresentationEmail())
|
.map((email) => email.toPresentationEmail(
|
||||||
|
searchSnippetSubject: email.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: email.searchSnippetPreview,
|
||||||
|
))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
yield Right(SearchMoreEmailSuccess(presentationEmailList));
|
yield Right(SearchMoreEmailSuccess(presentationEmailList));
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ import 'package:model/extensions/keyword_identifier_extension.dart';
|
|||||||
import 'package:model/extensions/media_type_nullable_extension.dart';
|
import 'package:model/extensions/media_type_nullable_extension.dart';
|
||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
import 'package:model/mailbox/select_mode.dart';
|
import 'package:model/mailbox/select_mode.dart';
|
||||||
|
import 'package:model/mixin/search_snippet_mixin.dart';
|
||||||
|
|
||||||
class PresentationEmail with EquatableMixin {
|
class PresentationEmail with EquatableMixin, SearchSnippetMixin {
|
||||||
|
|
||||||
final EmailId? id;
|
final EmailId? id;
|
||||||
final Id? blobId;
|
final Id? blobId;
|
||||||
@@ -172,5 +173,7 @@ class PresentationEmail with EquatableMixin {
|
|||||||
htmlBody,
|
htmlBody,
|
||||||
bodyValues,
|
bodyValues,
|
||||||
headerCalendarEvent,
|
headerCalendarEvent,
|
||||||
|
searchSnippetSubject,
|
||||||
|
searchSnippetPreview,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,11 @@ extension EmailExtension on Email {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail toPresentationEmail({SelectMode selectMode = SelectMode.INACTIVE}) {
|
PresentationEmail toPresentationEmail({
|
||||||
|
SelectMode selectMode = SelectMode.INACTIVE,
|
||||||
|
String? searchSnippetSubject,
|
||||||
|
String? searchSnippetPreview,
|
||||||
|
}) {
|
||||||
return PresentationEmail(
|
return PresentationEmail(
|
||||||
id: id,
|
id: id,
|
||||||
blobId: blobId,
|
blobId: blobId,
|
||||||
@@ -114,7 +118,9 @@ extension EmailExtension on Email {
|
|||||||
selectMode: selectMode,
|
selectMode: selectMode,
|
||||||
emailHeader: headers?.toList(),
|
emailHeader: headers?.toList(),
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
Email combineEmail(Email newEmail, Properties updatedProperties) {
|
Email combineEmail(Email newEmail, Properties updatedProperties) {
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain: mailboxContain,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail toSelectedEmail({required SelectMode selectMode}) {
|
PresentationEmail toSelectedEmail({required SelectMode selectMode}) {
|
||||||
@@ -88,7 +90,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain: mailboxContain,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
Email toEmail() {
|
Email toEmail() {
|
||||||
@@ -169,7 +173,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: matchedMailbox,
|
mailboxContain: matchedMailbox,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) {
|
PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) {
|
||||||
@@ -206,7 +212,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain: mailboxContain,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail updateKeywords(Map<KeyWordIdentifier, bool>? newKeywords) {
|
PresentationEmail updateKeywords(Map<KeyWordIdentifier, bool>? newKeywords) {
|
||||||
@@ -230,7 +238,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain: mailboxContain,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail syncPresentationEmail({PresentationMailbox? mailboxContain, Uri? routeWeb}) {
|
PresentationEmail syncPresentationEmail({PresentationMailbox? mailboxContain, Uri? routeWeb}) {
|
||||||
@@ -254,7 +264,9 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
routeWeb: routeWeb,
|
routeWeb: routeWeb,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain: mailboxContain,
|
||||||
headerCalendarEvent: headerCalendarEvent
|
headerCalendarEvent: headerCalendarEvent
|
||||||
);
|
)
|
||||||
|
..searchSnippetSubject = searchSnippetSubject
|
||||||
|
..searchSnippetPreview = searchSnippetPreview;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBelongToOneOfTheMailboxes(List<MailboxId> mailboxIdsSource) {
|
bool isBelongToOneOfTheMailboxes(List<MailboxId> mailboxIdsSource) {
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
mixin SearchSnippetMixin {
|
||||||
|
String? searchSnippetSubject;
|
||||||
|
String? searchSnippetPreview;
|
||||||
|
}
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:model/extensions/email_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/search_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
|
||||||
|
import '../../../../fixtures/account_fixtures.dart';
|
||||||
|
import '../../../../fixtures/session_fixtures.dart';
|
||||||
|
import 'quick_search_email_interactor_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<ThreadRepository>()])
|
||||||
|
void main() {
|
||||||
|
final threadRepository = MockThreadRepository();
|
||||||
|
final quickSearchEmailInteractor = QuickSearchEmailInteractor(threadRepository);
|
||||||
|
|
||||||
|
group('quick search email interactor test:', () {
|
||||||
|
test(
|
||||||
|
'should return list of presentation emails '
|
||||||
|
'when threadRepository.searchEmails returns list of emails',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
final searchEmail = SearchEmail(
|
||||||
|
id: EmailId(Id('someId')),
|
||||||
|
searchSnippetSubject: 'searchSnippetSubject',
|
||||||
|
searchSnippetPreview: 'searchSnippetPreview',
|
||||||
|
);
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenAnswer((_) async => [searchEmail]);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await quickSearchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
equals(Right(QuickSearchEmailSuccess([searchEmail.toPresentationEmail(
|
||||||
|
searchSnippetSubject: searchEmail.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: searchEmail.searchSnippetPreview,
|
||||||
|
)]))),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return failure '
|
||||||
|
'when threadRepository.searchEmails throws exception',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
final exception = Exception();
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenThrow(exception);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await quickSearchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
equals(Left(QuickSearchEmailFailure(exception))),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
+98
@@ -0,0 +1,98 @@
|
|||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:model/extensions/email_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/search_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
|
||||||
|
import '../../../../../fixtures/account_fixtures.dart';
|
||||||
|
import '../../../../../fixtures/session_fixtures.dart';
|
||||||
|
import 'refresh_changes_search_email_interactor_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<ThreadRepository>()])
|
||||||
|
void main() {
|
||||||
|
final threadRepository = MockThreadRepository();
|
||||||
|
final refreshChangesSearchEmailInteractor = RefreshChangesSearchEmailInteractor(
|
||||||
|
threadRepository);
|
||||||
|
|
||||||
|
group('refresh changes search email interactor test:', () {
|
||||||
|
test(
|
||||||
|
'should return list of presentation emails '
|
||||||
|
'when threadRepository.searchEmails returns list of emails',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final searchEmail = SearchEmail(
|
||||||
|
searchSnippetSubject: 'searchSnippetSubject',
|
||||||
|
searchSnippetPreview: 'searchSnippetPreview',
|
||||||
|
);
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenAnswer((_) async => [searchEmail]);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = refreshChangesSearchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(RefreshingChangeSearchEmailState()),
|
||||||
|
Right(RefreshChangesSearchEmailSuccess([searchEmail.toPresentationEmail(
|
||||||
|
searchSnippetSubject: searchEmail.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: searchEmail.searchSnippetPreview,
|
||||||
|
)])),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return failure '
|
||||||
|
'when threadRepository.searchEmails throw exception',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final exception = Exception();
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenThrow(exception);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = refreshChangesSearchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(RefreshingChangeSearchEmailState()),
|
||||||
|
Left(RefreshChangesSearchEmailFailure(exception)),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:model/model.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/search_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
||||||
|
|
||||||
|
import '../../../../fixtures/account_fixtures.dart';
|
||||||
|
import '../../../../fixtures/session_fixtures.dart';
|
||||||
|
import 'search_email_interactor_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<ThreadRepository>()])
|
||||||
|
void main() {
|
||||||
|
final threadRepository = MockThreadRepository();
|
||||||
|
final searchEmailInteractor = SearchEmailInteractor(threadRepository);
|
||||||
|
|
||||||
|
group('search email interactor test:', () {
|
||||||
|
test(
|
||||||
|
'should return list of presentation emails '
|
||||||
|
'when threadRepository.searchEmails returns list of emails with search snippets',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final searchEmail = SearchEmail(
|
||||||
|
searchSnippetSubject: 'searchSnippetSubject',
|
||||||
|
searchSnippetPreview: 'searchSnippetPreview',
|
||||||
|
);
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenAnswer((_) async => [searchEmail]);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = searchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(SearchingState()),
|
||||||
|
Right(SearchEmailSuccess(
|
||||||
|
[searchEmail.toPresentationEmail(
|
||||||
|
searchSnippetSubject: searchEmail.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: searchEmail.searchSnippetPreview,
|
||||||
|
)],
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return list of presentation emails '
|
||||||
|
'when threadRepository.searchEmails returns list of emails without search snippets',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final searchEmail = SearchEmail(
|
||||||
|
searchSnippetSubject: null,
|
||||||
|
searchSnippetPreview: null,
|
||||||
|
);
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenAnswer((_) async => [searchEmail]);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = searchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(SearchingState()),
|
||||||
|
Right(SearchEmailSuccess([searchEmail.toPresentationEmail()]))
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return Failure when threadRepository.searchEmails returns Failure',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final exception = Exception();
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenThrow(exception);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = searchEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(SearchingState()),
|
||||||
|
Left(SearchEmailFailure(exception)),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:model/model.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/search_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
||||||
|
|
||||||
|
import '../../../../fixtures/account_fixtures.dart';
|
||||||
|
import '../../../../fixtures/session_fixtures.dart';
|
||||||
|
import 'search_more_email_interactor_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<ThreadRepository>()])
|
||||||
|
void main() {
|
||||||
|
final threadRepository = MockThreadRepository();
|
||||||
|
final searchMoreEmailInteractor = SearchMoreEmailInteractor(threadRepository);
|
||||||
|
group('search more email interactor test:', () {
|
||||||
|
test(
|
||||||
|
'should return list of presentation emails '
|
||||||
|
'when threadRepository.searchEmails returns list of emails',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final searchEmail = SearchEmail(
|
||||||
|
id: EmailId(Id('someId')),
|
||||||
|
searchSnippetSubject: 'searchSnippetSubject',
|
||||||
|
searchSnippetPreview: 'searchSnippetPreview',
|
||||||
|
);
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenAnswer((_) async => [searchEmail]);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = searchMoreEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(SearchingMoreState()),
|
||||||
|
Right(SearchMoreEmailSuccess(
|
||||||
|
[searchEmail.toPresentationEmail(
|
||||||
|
searchSnippetSubject: searchEmail.searchSnippetSubject,
|
||||||
|
searchSnippetPreview: searchEmail.searchSnippetPreview,
|
||||||
|
)]
|
||||||
|
)),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return failure '
|
||||||
|
'when threadRepository.searchEmails throw exception',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final exception = Exception();
|
||||||
|
when(
|
||||||
|
threadRepository.searchEmails(
|
||||||
|
any,
|
||||||
|
any,
|
||||||
|
limit: anyNamed('limit'),
|
||||||
|
sort: anyNamed('sort'),
|
||||||
|
filter: anyNamed('filter'),
|
||||||
|
properties: anyNamed('properties'),
|
||||||
|
),
|
||||||
|
).thenThrow(exception);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = searchMoreEmailInteractor.execute(
|
||||||
|
SessionFixtures.aliceSession,
|
||||||
|
AccountFixtures.aliceAccountId,
|
||||||
|
filter: EmailFilterCondition(text: 'test'),
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(
|
||||||
|
result,
|
||||||
|
emitsInOrder([
|
||||||
|
Right(SearchingMoreState()),
|
||||||
|
Left(SearchMoreEmailFailure(exception)),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user