TF-3685 Add integration test for case change identity in draft email

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-04-23 11:40:59 +07:00
committed by Dat H. Pham
parent 80dff51c77
commit ef1f979c4b
10 changed files with 312 additions and 112 deletions
@@ -6,6 +6,7 @@ import 'package:core/utils/app_logger.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
@@ -19,13 +20,19 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/upload_attachmen
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:uuid/uuid.dart';
import '../models/provisioning_email.dart';
import '../models/provisioning_identity.dart';
mixin ScenarioUtilsMixin {
Future<void> provisionEmail(
@@ -212,4 +219,36 @@ mixin ScenarioUtilsMixin {
return emails.length == allowedEmails.length && emails.containsAll(allowedEmails);
}
Future<void> provisionIdentities(List<ProvisioningIdentity> provisioningIdentities) async {
IdentityInteractorsBindings().dependencies();
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final createNewIdentityInteractor = Get.find<CreateNewIdentityInteractor>();
final createNewDefaultIdentityInteractor = Get.find<CreateNewDefaultIdentityInteractor>();
const uuid = Uuid();
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final listIdentityRequest = provisioningIdentities
.map((provisioningIdentity) => CreateNewIdentityRequest(
Id(uuid.v1()),
provisioningIdentity.identity,
isDefaultIdentity: provisioningIdentity.isDefault,
));
for (var identityRequest in listIdentityRequest) {
if (identityRequest.isDefaultIdentity) {
await createNewDefaultIdentityInteractor
.execute(session!, accountId!, identityRequest)
.last;
} else {
await createNewIdentityInteractor
.execute(session!, accountId!, identityRequest)
.last;
}
}
IdentityInteractorsBindings().dispose();
}
}
@@ -0,0 +1,11 @@
import 'package:jmap_dart_client/jmap/identities/identity.dart';
class ProvisioningIdentity {
final Identity identity;
final bool isDefault;
ProvisioningIdentity({
required this.identity,
this.isDefault = false,
});
}
@@ -1,5 +1,6 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:model/email/prefix_email_address.dart';
import 'package:rich_text_composer/rich_text_composer.dart';
@@ -7,6 +8,7 @@ import 'package:tmail_ui_user/features/composer/presentation/composer_controller
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/view/mobile/mobile_editor_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/from_composer_mobile_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart';
@@ -97,4 +99,16 @@ class ComposerRobot extends CoreRobot {
Future<void> tapReadReceiptPopupItemOnMenu() async {
await $(#read_receipt_popup_item).tap();
}
Future<void> tapSaveAsDraftPopupItemOnMenu() async {
await $(#save_as_draft_popup_item).tap();
}
Future<void> tapRecipientExpandButton() async {
await $(#prefix_to_recipient_expand_button).tap();
}
Future<void> tapFromFieldPopupMenu() async {
await $(FromComposerMobileWidget).$(InkWell).tap();
}
}
@@ -0,0 +1,12 @@
import 'package:flutter_test/flutter_test.dart';
import '../base/core_robot.dart';
class IdentitiesListMenuRobot extends CoreRobot {
IdentitiesListMenuRobot(super.$);
Future<void> selectIdentityByName(String name) async {
await $(find.text(name)).tap();
}
}
@@ -0,0 +1,108 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/from_composer_mobile_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../../base/base_test_scenario.dart';
import '../../models/provisioning_identity.dart';
import '../../robots/composer_robot.dart';
import '../../robots/identities_list_menu_robot.dart';
import '../../robots/mailbox_menu_robot.dart';
import '../../robots/thread_robot.dart';
class ChangeIdentityInDraftEmailScenario extends BaseTestScenario {
const ChangeIdentityInDraftEmailScenario(super.$);
@override
Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
const subject = 'Change identity in draft email';
final threadRobot = ThreadRobot($);
final composerRobot = ComposerRobot($);
final mailboxMenuRobot = MailboxMenuRobot($);
final identitiesListMenuRobot = IdentitiesListMenuRobot($);
final imagePaths = ImagePaths();
final appLocalizations = AppLocalizations();
final identity1 = Identity(
name: 'Identity 1',
email: email,
htmlSignature: Signature('Signature 1'),
sortOrder: UnsignedInt(0),
);
final identity2 = Identity(
name: 'Identity 2',
email: email,
htmlSignature: Signature('Signature 2'),
sortOrder: UnsignedInt(100),
);
await provisionIdentities([
ProvisioningIdentity(identity: identity1, isDefault: true),
ProvisioningIdentity(identity: identity2),
]);
await $.pumpAndSettle();
await threadRobot.openComposer();
await $.pumpAndSettle();
await _expectComposerViewVisible();
await composerRobot.grantContactPermission();
await composerRobot.addSubject(subject);
await composerRobot.addContent(subject);
await composerRobot.tapRecipientExpandButton();
await $.pumpAndSettle();
await _expectIdentityVisible(identity1);
await composerRobot.tapFromFieldPopupMenu();
await identitiesListMenuRobot.selectIdentityByName(identity2.name!);
await $.pumpAndSettle();
await _expectIdentityVisible(identity2);
await composerRobot.tapMoreOptionOnAppBar();
await _expectSaveAsDraftOptionPopupMenuVisible();
await composerRobot.tapSaveAsDraftPopupItemOnMenu();
await _expectSaveAsDraftEmailSuccessToast(appLocalizations);
await composerRobot.tapCloseComposer(imagePaths);
await threadRobot.openMailbox();
await mailboxMenuRobot
.openFolderByName(appLocalizations.draftsMailboxDisplayName);
await threadRobot.openEmailWithSubject(subject);
await _expectComposerViewVisible();
await composerRobot.grantContactPermission();
await composerRobot.tapRecipientExpandButton();
await $.pumpAndSettle();
await _expectIdentityVisible(identity2);
}
Future<void> _expectComposerViewVisible() =>
expectViewVisible($(ComposerView));
Future<void> _expectSaveAsDraftOptionPopupMenuVisible() =>
expectViewVisible($(#save_as_draft_popup_item));
Future<void> _expectSaveAsDraftEmailSuccessToast(
AppLocalizations appLocalizations,
) =>
expectViewVisible($(appLocalizations.drafts_saved));
Future<void> _expectIdentityVisible(Identity identity) async {
expect(
$(FromComposerMobileWidget).which<FromComposerMobileWidget>(
(widget) => widget.selectedIdentity?.name == identity.name
).visible,
isTrue,
);
}
}
@@ -0,0 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/composer/change_identity_in_draft_email_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see new identity in From field when select new identity and save as draft successfully',
scenarioBuilder: ($) => ChangeIdentityInDraftEmailScenario($),
);
}