From 5b375505038036d92d29b3d77e57ff445d5f9445 Mon Sep 17 00:00:00 2001 From: DatDang Date: Mon, 9 Sep 2024 11:24:48 +0700 Subject: [PATCH] TF-3035 Unit test draft with identity --- ..._save_email_to_drafts_interactor_test.dart | 114 ++++++++++++++++++ ...te_new_and_send_email_interactor_test.dart | 64 ++++++++++ .../create_email_request_extension_test.dart | 64 ++++++++++ 3 files changed, 242 insertions(+) create mode 100644 test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart create mode 100644 test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart create mode 100644 test/features/composer/presentation/extensions/create_email_request_extension_test.dart diff --git a/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart b/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart new file mode 100644 index 0000000000..0869982c1e --- /dev/null +++ b/test/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor_test.dart @@ -0,0 +1,114 @@ +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:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_save_email_to_drafts_interactor.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; + +import '../../../../fixtures/account_fixtures.dart'; +import '../../../../fixtures/session_fixtures.dart'; +import 'create_new_and_save_email_to_drafts_interactor_test.mocks.dart'; + +@GenerateNiceMocks([ + MockSpec(), + MockSpec(), + MockSpec(), +]) +void main() { + late MockEmailRepository emailRepository; + late MockMailboxRepository mailboxRepository; + late MockComposerRepository composerRepository; + late CreateNewAndSaveEmailToDraftsInteractor createNewAndSaveEmailToDraftsInteractor; + + setUp(() { + emailRepository = MockEmailRepository(); + mailboxRepository = MockMailboxRepository(); + composerRepository = MockComposerRepository(); + createNewAndSaveEmailToDraftsInteractor = CreateNewAndSaveEmailToDraftsInteractor( + emailRepository, + mailboxRepository, + composerRepository); + }); + + group('create new and save email to drafts interactor test:', () { + test( + 'should call generateEmail from composerRepository with withIdentityHeader is true ' + 'when execute is called ' + 'and draftsEmailId != null', + () async { + // arrange + final createEmailRequest = CreateEmailRequest( + session: SessionFixtures.aliceSession, + accountId: AccountFixtures.aliceAccountId, + emailActionType: EmailActionType.editDraft, + subject: 'subject', + emailContent: 'emailContent', + fromSender: {}, + toRecipients: {}, + ccRecipients: {}, + bccRecipients: {}, + draftsEmailId: EmailId(Id('some-id')) + ); + when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) + .thenAnswer((_) async => Email()); + when(emailRepository.updateEmailDrafts(any, any, any, any)) + .thenAnswer((_) async => Email()); + + // act + createNewAndSaveEmailToDraftsInteractor + .execute(createEmailRequest: createEmailRequest) + .last; + await untilCalled(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'))); + + // assert + verify(composerRepository.generateEmail( + createEmailRequest, + withIdentityHeader: true) + ).called(1); + }); + + test( + 'should call generateEmail from composerRepository with withIdentityHeader is true ' + 'when execute is called ' + 'and draftsEmailId == null', + () async { + // arrange + final createEmailRequest = CreateEmailRequest( + session: SessionFixtures.aliceSession, + accountId: AccountFixtures.aliceAccountId, + emailActionType: EmailActionType.editDraft, + subject: 'subject', + emailContent: 'emailContent', + fromSender: {}, + toRecipients: {}, + ccRecipients: {}, + bccRecipients: {}, + ); + when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) + .thenAnswer((_) async => Email()); + when(emailRepository.saveEmailAsDrafts(any, any, any)) + .thenAnswer((_) async => Email()); + + // act + createNewAndSaveEmailToDraftsInteractor + .execute(createEmailRequest: createEmailRequest) + .last; + await untilCalled(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'))); + + // assert + verify(composerRepository.generateEmail( + createEmailRequest, + withIdentityHeader: true) + ).called(1); + }); + }); +} \ No newline at end of file diff --git a/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart b/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart new file mode 100644 index 0000000000..72027e6f49 --- /dev/null +++ b/test/features/composer/domain/usecases/create_new_and_send_email_interactor_test.dart @@ -0,0 +1,64 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/composer_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; + +import '../../../../fixtures/account_fixtures.dart'; +import '../../../../fixtures/session_fixtures.dart'; +import 'create_new_and_send_email_interactor_test.mocks.dart'; + +@GenerateNiceMocks([ + MockSpec(), + MockSpec(), + MockSpec(), +]) +void main() { + final emailRepository = MockEmailRepository(); + final mailboxRepository = MockMailboxRepository(); + final composerRepository = MockComposerRepository(); + final createNewAndSendEmailInteractor = CreateNewAndSendEmailInteractor( + emailRepository, + mailboxRepository, + composerRepository); + group('create new and send email interactor test:', () { + test( + 'should call generateEmail from composerRepository with withIdentityHeader is false ' + 'when execute is called', + () async { + // arrange + final createEmailRequest = CreateEmailRequest( + session: SessionFixtures.aliceSession, + accountId: AccountFixtures.aliceAccountId, + emailActionType: EmailActionType.editDraft, + subject: 'subject', + emailContent: 'emailContent', + fromSender: {}, + toRecipients: {}, + ccRecipients: {}, + bccRecipients: {}, + ); + when(composerRepository.generateEmail(any, withIdentityHeader: anyNamed('withIdentityHeader'))) + .thenAnswer((_) async => Email()); + + // act + createNewAndSendEmailInteractor + .execute(createEmailRequest: createEmailRequest) + .last; + await untilCalled(composerRepository.generateEmail( + any, + withIdentityHeader: anyNamed('withIdentityHeader'))); + + // assert + verify(composerRepository.generateEmail( + createEmailRequest, + withIdentityHeader: false) + ).called(1); + }); + }); +} \ No newline at end of file diff --git a/test/features/composer/presentation/extensions/create_email_request_extension_test.dart b/test/features/composer/presentation/extensions/create_email_request_extension_test.dart new file mode 100644 index 0000000000..84aa860197 --- /dev/null +++ b/test/features/composer/presentation/extensions/create_email_request_extension_test.dart @@ -0,0 +1,64 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart'; +import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/create_email_request_extension.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart'; + +import '../../../../fixtures/account_fixtures.dart'; +import '../../../../fixtures/session_fixtures.dart'; + +void main() { + final createEmailRequest = CreateEmailRequest( + session: SessionFixtures.aliceSession, + accountId: AccountFixtures.aliceAccountId, + emailActionType: EmailActionType.editDraft, + subject: 'subject', + emailContent: 'emailContent', + fromSender: {}, + toRecipients: {}, + ccRecipients: {}, + bccRecipients: {}, + ); + + group('create email request extension test:', () { + test( + 'should return email with identity header ' + 'when generateEmail is called ' + 'and withIdentityHeader is true', + () { + // act + final result = createEmailRequest.generateEmail( + newEmailContent: 'newEmailContent', + newEmailAttachments: {}, + userAgent: 'userAgent', + partId: PartId('value'), + withIdentityHeader: true + ); + + // assert + expect( + result.identityHeader?.containsKey( + IndividualHeaderIdentifier.identityHeader), + isTrue); + }); + + test( + 'should return email without identity header ' + 'when generateEmail is called ' + 'and withIdentityHeader is false', + () { + // act + final result = createEmailRequest.generateEmail( + newEmailContent: 'newEmailContent', + newEmailAttachments: {}, + userAgent: 'userAgent', + partId: PartId('value'), + withIdentityHeader: false + ); + + // assert + expect(result.identityHeader, isNull); + }); + }); +} \ No newline at end of file