Skip to content

TF-3558 E2E mailbox switch and pull to refresh #3562

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: patrol-integration-test
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion integration_test/mixin/scenario_utils_mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ 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';
import 'package:jmap_dart_client/jmap/mail/email/set/set_email_method.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:path_provider/path_provider.dart';
import 'package:tmail_ui_user/features/composer/domain/state/upload_attachment_state.dart';
Expand All @@ -31,6 +32,7 @@ mixin ScenarioUtilsMixin {
List<ProvisioningEmail> provisioningEmails, {
bool refreshEmailView = true,
bool requestReadReceipt = true,
Role? sentLocation,
}) async {
ComposerBindings().dependencies();

Expand All @@ -56,7 +58,9 @@ mixin ScenarioUtilsMixin {
emailContent: provisioningEmail.content,
toRecipients: {EmailAddress(null, provisioningEmail.toEmail)},
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId,
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[
sentLocation ?? PresentationMailbox.roleSent
],
identity: identity,
attachments: attachments,
hasRequestReadReceipt: requestReadReceipt,
Expand Down
15 changes: 15 additions & 0 deletions integration_test/robots/thread_robot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,19 @@ class ThreadRobot extends CoreRobot {
Future<void> openMailbox() async {
await $(#mobile_mailbox_menu_button).tap();
}

Future<void> pullToRefreshByEmailSubject(String subject) async {
await $(subject).waitUntilVisible();
await $.tester.fling(
$(subject),
const Offset(0, 300),
1000,
);
await $.pumpAndSettle();
}

Future<void> tapOnMailboxWithName(String name) async {
await $(name).tap();
await $.pumpAndSettle();
}
}
50 changes: 50 additions & 0 deletions integration_test/scenarios/mailbox/pull_to_refresh_scenario.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter_test/flutter_test.dart';

import '../../base/base_test_scenario.dart';
import '../../models/provisioning_email.dart';
import '../../robots/thread_robot.dart';

class PullToRefreshScenario extends BaseTestScenario {
const PullToRefreshScenario(super.$);

@override
Future<void> runTestLogic() async {
const toEmail = String.fromEnvironment('BASIC_AUTH_EMAIL');
const visibleBeforePullToRefresh = 'before pull to refresh';
const visibleAfterPullToRefresh = 'after pull to refresh';

final threadRobot = ThreadRobot($);

await provisionEmail(
[ProvisioningEmail(
toEmail: toEmail,
subject: visibleBeforePullToRefresh,
content: '',
)],
);
await $.pumpAndSettle();
_expectEmailWithSubjectVisible(visibleBeforePullToRefresh);

await provisionEmail(
[ProvisioningEmail(
toEmail: toEmail,
subject: visibleAfterPullToRefresh,
content: '',
)],
refreshEmailView: false,
);
await $.pumpAndSettle();
_expectEmailWithSubjectInvisible(visibleAfterPullToRefresh);

await threadRobot.pullToRefreshByEmailSubject(visibleBeforePullToRefresh);
_expectEmailWithSubjectVisible(visibleAfterPullToRefresh);
}

_expectEmailWithSubjectVisible(String subject) {
expect($(subject), findsOneWidget);
}

_expectEmailWithSubjectInvisible(String subject) {
expect($(subject), findsNothing);
}
}
50 changes: 50 additions & 0 deletions integration_test/scenarios/mailbox/switch_mailbox_scenario.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

import '../../base/base_test_scenario.dart';
import '../../models/provisioning_email.dart';
import '../../robots/thread_robot.dart';

class SwitchMailboxScenario extends BaseTestScenario {
const SwitchMailboxScenario(super.$);

@override
Future<void> runTestLogic() async {
const toEmail = String.fromEnvironment('BASIC_AUTH_EMAIL');
const sentEmailSubject = 'sent subject';
const trashEmailSubject = 'trash subject';

final threadRobot = ThreadRobot($);
final appLocalizations = AppLocalizations();

await provisionEmail(
[ProvisioningEmail(
toEmail: toEmail,
subject: sentEmailSubject,
content: '',
)],
);
await provisionEmail(
[ProvisioningEmail(
toEmail: toEmail,
subject: trashEmailSubject,
content: '',
)],
sentLocation: PresentationMailbox.roleTrash,
);

await threadRobot.openMailbox();
await threadRobot.tapOnMailboxWithName(appLocalizations.sentMailboxDisplayName);
await _expectEmailWithSubjectVisible(sentEmailSubject);

await threadRobot.openMailbox();
await threadRobot.tapOnMailboxWithName(appLocalizations.trashMailboxDisplayName);
await _expectEmailWithSubjectVisible(trashEmailSubject);
}

Future<void> _expectEmailWithSubjectVisible(String subject) async {
await $.pumpAndSettle(duration: const Duration(seconds: 2));
expect($(subject), findsOneWidget);
}
}
9 changes: 9 additions & 0 deletions integration_test/tests/mailbox/pull_to_refresh_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/mailbox/pull_to_refresh_scenario.dart';

void main() {
TestBase().runPatrolTest(
description: 'Should refresh email list when pull to refresh',
scenarioBuilder: ($) => PullToRefreshScenario($),
);
}
9 changes: 9 additions & 0 deletions integration_test/tests/mailbox/switch_mailbox_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/mailbox/switch_mailbox_scenario.dart';

void main() {
TestBase().runPatrolTest(
description: 'Should switch and see emails in mailboxes',
scenarioBuilder: ($) => SwitchMailboxScenario($),
);
}
Loading