diff --git a/backend-docker/docker-compose.yaml b/backend-docker/docker-compose.yaml index 36f851616..9ab8f28d8 100644 --- a/backend-docker/docker-compose.yaml +++ b/backend-docker/docker-compose.yaml @@ -10,8 +10,8 @@ services: - ./mailetcontainer.xml:/root/conf/mailetcontainer.xml - ./imapserver.xml:/root/conf/imapserver.xml - ./jmap.properties:/root/conf/jmap.properties - - ../provisioning/integration_test/search_email_with_sort_order/provisioning.sh:/root/conf/integration_test/search_email_with_sort_order/provisioning.sh - - ../provisioning/integration_test/search_email_with_sort_order/eml:/root/conf/integration_test/search_email_with_sort_order/eml + - ../provisioning/integration_test/provisioning.sh:/root/conf/integration_test/provisioning.sh + - ../provisioning/integration_test/eml:/root/conf/integration_test/eml ports: - "80:80" environment: diff --git a/integration_test/robots/email_robot.dart b/integration_test/robots/email_robot.dart new file mode 100644 index 000000000..2ada2436b --- /dev/null +++ b/integration_test/robots/email_robot.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../base/core_robot.dart'; + +class EmailRobot extends CoreRobot { + EmailRobot(super.$); + + Future onTapForwardEmail() async { + await $(#forward_email_button).tap(); + await $.pump(const Duration(seconds: 2)); + } +} \ No newline at end of file diff --git a/integration_test/robots/search_robot.dart b/integration_test/robots/search_robot.dart index 549ad0f60..363efe594 100644 --- a/integration_test/robots/search_robot.dart +++ b/integration_test/robots/search_robot.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:core/presentation/views/text/text_field_builder.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import '../base/core_robot.dart'; @@ -39,4 +40,27 @@ class SearchRobot extends CoreRobot { await $.waitUntilVisible($(AppLocalizations().showingResultsFor)); await $(AppLocalizations().showingResultsFor).tap(); } + + Future scrollToDateTimeButtonFilter() async { + await $.scrollUntilVisible( + finder: $(#mobile_dateTime_search_filter_button), + view: $(#search_filter_list_view), + scrollDirection: AxisDirection.right, + delta: 300, + ); + } + + Future openDateTimeBottomDialog() async { + await $(#mobile_dateTime_search_filter_button).tap(); + } + + Future selectDateTime(String dateTimeType) async { + await $(find.text(dateTimeType)).tap(); + await $.pump(const Duration(seconds: 2)); + } + + Future openEmail(String subject) async { + await $(find.byType(EmailTileBuilder)).first.tap(); + await $.pump(const Duration(seconds: 2)); + } } \ No newline at end of file diff --git a/integration_test/scenarios/forward_email_scenario.dart b/integration_test/scenarios/forward_email_scenario.dart new file mode 100644 index 000000000..c38f04e62 --- /dev/null +++ b/integration_test/scenarios/forward_email_scenario.dart @@ -0,0 +1,107 @@ + +import 'package:flutter_test/flutter_test.dart'; +import 'package:rich_text_composer/rich_text_composer.dart'; +import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; +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/email/presentation/email_view.dart'; +import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; + +import '../base/base_scenario.dart'; +import '../robots/composer_robot.dart'; +import '../robots/email_robot.dart'; +import '../robots/search_robot.dart'; +import '../robots/thread_robot.dart'; +import 'login_with_basic_auth_scenario.dart'; + +class ForwardEmailScenario extends BaseScenario { + const ForwardEmailScenario( + super.$, + { + required this.loginWithBasicAuthScenario, + } + ); + + final LoginWithBasicAuthScenario loginWithBasicAuthScenario; + + @override + Future execute() async { + await loginWithBasicAuthScenario.execute(); + + final threadRobot = ThreadRobot($); + await threadRobot.openSearchView(); + await _expectSearchViewVisible(); + + final searchRobot = SearchRobot($); + await searchRobot.enterQueryString('Forward email'); + await _expectSuggestionSearchListViewVisible(); + await searchRobot.tapOnShowAllResultsText(); + await _expectSearchResultEmailListVisible(); + + await searchRobot.openEmail('Fwd: Forward email'); + await _expectEmailViewVisible(); + await _expectForwardEmailButtonVisible(); + + final emailRobot = EmailRobot($); + await emailRobot.onTapForwardEmail(); + await _expectComposerViewVisible(); + + final composerRobot = ComposerRobot($); + await composerRobot.grantContactPermission(); + await _expectMobileEditorViewVisible(); + + await _expectForwardEmailContentDisplayedCorrectly(); + } + + Future _expectSearchViewVisible() async { + await expectViewVisible($(SearchEmailView)); + } + + Future _expectSuggestionSearchListViewVisible() async { + await expectViewVisible($(#suggestion_search_list_view)); + } + + Future _expectSearchResultEmailListVisible() async { + await expectViewVisible($(#search_email_list_notification_listener)); + await $.pump(const Duration(seconds: 3)); + } + + Future _expectEmailViewVisible() async { + await expectViewVisible($(EmailView)); + } + + Future _expectForwardEmailButtonVisible() async { + await expectViewVisible($(#forward_email_button)); + await $.pump(const Duration(seconds: 3)); + } + + Future _expectComposerViewVisible() async { + await expectViewVisible($(ComposerView)); + } + + Future _expectMobileEditorViewVisible() async { + await expectViewVisible($(#mobile_editor)); + } + + Future _expectForwardEmailContentDisplayedCorrectly() async { + ComposerController? composerController; + await $(ComposerView) + .which((widget) { + composerController = widget.controller; + return true; + }) + .$(MobileEditorView) + .$(HtmlEditor) + .$(InAppWebView).tap(); + + await composerController?.htmlEditorApi?.requestFocusLastChild(); + + final contentHtml = await composerController?.htmlEditorApi?.getText(); + + expect(contentHtml, contains('Subject')); + expect(contentHtml, contains('From')); + expect(contentHtml, contains('To')); + expect(contentHtml, contains('Cc')); + expect(contentHtml, contains('Bcc')); + } +} \ No newline at end of file diff --git a/integration_test/tests/compose/forward_email_test.dart b/integration_test/tests/compose/forward_email_test.dart new file mode 100644 index 000000000..c24a0549f --- /dev/null +++ b/integration_test/tests/compose/forward_email_test.dart @@ -0,0 +1,23 @@ +import '../../base/test_base.dart'; +import '../../scenarios/forward_email_scenario.dart'; +import '../../scenarios/login_with_basic_auth_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see HTML content contain enough: Subject, From, To, Cc, Bcc, Reply to', + test: ($) async { + final loginWithBasicAuthScenario = LoginWithBasicAuthScenario($, + username: const String.fromEnvironment('USERNAME'), + hostUrl: const String.fromEnvironment('BASIC_AUTH_URL'), + email: const String.fromEnvironment('BASIC_AUTH_EMAIL'), + password: const String.fromEnvironment('PASSWORD'), + ); + final forwardEmailScenario = ForwardEmailScenario( + $, + loginWithBasicAuthScenario: loginWithBasicAuthScenario, + ); + + await forwardEmailScenario.execute(); + }, + ); +} \ No newline at end of file diff --git a/provisioning/integration_test/eml/forward_email/0.eml b/provisioning/integration_test/eml/forward_email/0.eml new file mode 100644 index 000000000..54646e17d --- /dev/null +++ b/provisioning/integration_test/eml/forward_email/0.eml @@ -0,0 +1,42 @@ +Return-Path: +MIME-Version: 1.0 +References: +Subject: Fwd: Forward email to Bob +From: emma@example.com +To: "bob@example.com" +Cc: "alice@example.com" +Bcc: "brian@example.com" +Reply-To: emma@example.com +Date: Tue, 17 Dec 2024 16:31:00 +0000 +Message-ID: +User-Agent: Twake-Mail/0.13.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; + rv:131.0) Gecko/20100101 Firefox/131.0 +Content-Type: multipart/alternative; + boundary="-=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=-" + +---=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=- +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable +Accept-Language: fr-FR, en-US, vi-VN, ru-RU, ar-TN, it-IT +Content-Language: en-US + +Forward email to Bob + +Invite you in to a meeting: Event OPEN TECH TALK: INNOVATION FOR THE TWAKE WORKPLACE + +Our 3rd Open Tech Talk in 2024! + + ► Topic: "Enhancing Multi-Tenancy Security" + ► Topic: "Bringing Desktop Synchronization into TDrive" + ► Topic: "Websocket: Real-time Update + +We are waiting for you! + +---=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=- +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable +Accept-Language: fr-FR, en-US, vi-VN, ru-RU, ar-TN, it-IT +Content-Language: en-US + + +---=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=--- diff --git a/provisioning/integration_test/search_email_with_sort_order/eml/0.eml b/provisioning/integration_test/eml/search_email_with_sort_order/0.eml similarity index 100% rename from provisioning/integration_test/search_email_with_sort_order/eml/0.eml rename to provisioning/integration_test/eml/search_email_with_sort_order/0.eml diff --git a/provisioning/integration_test/search_email_with_sort_order/eml/1.eml b/provisioning/integration_test/eml/search_email_with_sort_order/1.eml similarity index 100% rename from provisioning/integration_test/search_email_with_sort_order/eml/1.eml rename to provisioning/integration_test/eml/search_email_with_sort_order/1.eml diff --git a/provisioning/integration_test/search_email_with_sort_order/eml/2.eml b/provisioning/integration_test/eml/search_email_with_sort_order/2.eml similarity index 100% rename from provisioning/integration_test/search_email_with_sort_order/eml/2.eml rename to provisioning/integration_test/eml/search_email_with_sort_order/2.eml diff --git a/provisioning/integration_test/search_email_with_sort_order/eml/3.eml b/provisioning/integration_test/eml/search_email_with_sort_order/3.eml similarity index 100% rename from provisioning/integration_test/search_email_with_sort_order/eml/3.eml rename to provisioning/integration_test/eml/search_email_with_sort_order/3.eml diff --git a/provisioning/integration_test/search_email_with_sort_order/eml/4.eml b/provisioning/integration_test/eml/search_email_with_sort_order/4.eml similarity index 100% rename from provisioning/integration_test/search_email_with_sort_order/eml/4.eml rename to provisioning/integration_test/eml/search_email_with_sort_order/4.eml diff --git a/provisioning/integration_test/provisioning.sh b/provisioning/integration_test/provisioning.sh new file mode 100755 index 000000000..20b2dac80 --- /dev/null +++ b/provisioning/integration_test/provisioning.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Define users and folders +users=("alice" "bob" "brian" "charlotte" "david" "emma") +bobFolders=("Search Emails" "Forward Emails") + +# Add users +for user in "${users[@]}"; do + james-cli AddUser "$user@example.com" "$user" +done + +# Create folders for user Bob +for folderName in "${bobFolders[@]}"; do + echo "Creating $folderName folder for user bob" + james-cli CreateMailbox \#private "bob@example.com" "$folderName" & +done + +# For test search email with sort order +# Import emails into 'Search Emails' folder for user Bob +for eml in {0..4}; do + echo "Importing $eml.eml into 'Search Emails' folder for user bob" + james-cli ImportEml \#private "bob@example.com" "Search Emails" "/root/conf/integration_test/eml/search_email_with_sort_order/$eml.eml" & +done + +# For test forward email +# Import emails into 'Forward Emails' folder for user Bob +echo "Importing 0.eml into 'Forward Emails' folder for user bob" +james-cli ImportEml \#private "bob@example.com" "Forward Emails" "/root/conf/integration_test/eml/forward_email/0.eml" \ No newline at end of file diff --git a/provisioning/integration_test/search_email_with_sort_order/provisioning.sh b/provisioning/integration_test/search_email_with_sort_order/provisioning.sh deleted file mode 100755 index e09ff2200..000000000 --- a/provisioning/integration_test/search_email_with_sort_order/provisioning.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Define users and folders -users=("alice" "bob" "brian" "charlotte" "david" "emma") - -# Add users -for user in "${users[@]}"; do - james-cli AddUser "$user@example.com" "$user" -done - -# Create search folder for user Bob -james-cli CreateMailbox \#private "bob@example.com" "search" - -# Import emails into search folder for user Bob -for eml in {0..4}; do - echo "Importing $eml.eml into search folder for user bob" - james-cli ImportEml \#private "bob@example.com" "search" "/root/conf/integration_test/search_email_with_sort_order/eml/$eml.eml" & -done diff --git a/scripts/patrol-integration-test-with-docker.sh b/scripts/patrol-integration-test-with-docker.sh index 244248cbc..3fb401127 100755 --- a/scripts/patrol-integration-test-with-docker.sh +++ b/scripts/patrol-integration-test-with-docker.sh @@ -41,7 +41,7 @@ export BOB="bob" export ALICE="alice" export DOMAIN="example.com" -docker exec tmail-backend ./root/conf/integration_test/search_email_with_sort_order/provisioning.sh +docker exec tmail-backend ./root/conf/integration_test/provisioning.sh cd .. diff --git a/scripts/patrol-local-integration-test-with-docker.sh b/scripts/patrol-local-integration-test-with-docker.sh index 72b8c589d..50ddd8241 100755 --- a/scripts/patrol-local-integration-test-with-docker.sh +++ b/scripts/patrol-local-integration-test-with-docker.sh @@ -41,7 +41,7 @@ export BOB="bob" export ALICE="alice" export DOMAIN="example.com" -docker exec tmail-backend ./root/conf/integration_test/search_email_with_sort_order/provisioning.sh +docker exec tmail-backend ./root/conf/integration_test/provisioning.sh cd ..