TF-3493 Refactor integration test code for performance and maintainability

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-02-21 01:51:19 +07:00
committed by Dat H. Pham
parent 23f5121f03
commit abdcb614ce
25 changed files with 157 additions and 401 deletions
@@ -0,0 +1,18 @@
import '../mixin/requires_login_mixin.dart';
import '../mixin/scenario_utils_mixin.dart';
import 'base_scenario.dart';
abstract class BaseTestScenario extends BaseScenario
with RequiresLoginMixin, ScenarioUtilsMixin {
const BaseTestScenario(super.$);
@override
Future<void> execute() async {
await executeLoginScenario();
await runTestLogic();
}
Future<void> runTestLogic();
}
+21 -10
View File
@@ -3,10 +3,17 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart'; import 'package:patrol/patrol.dart';
import 'package:tmail_ui_user/main.dart' as app; import 'package:tmail_ui_user/main.dart' as app;
import 'base_scenario.dart';
class TestBase { class TestBase {
static final TestBase _instance = TestBase._internal();
factory TestBase() => _instance;
TestBase._internal();
void runPatrolTest({ void runPatrolTest({
required String description, required String description,
required Function(PatrolIntegrationTester $) test, required BaseScenario Function(PatrolIntegrationTester $) scenarioBuilder,
}) { }) {
patrolTest( patrolTest(
description, description,
@@ -19,15 +26,19 @@ class TestBase {
findTimeout: Duration(seconds: 10), findTimeout: Duration(seconds: 10),
), ),
framePolicy: LiveTestWidgetsFlutterBindingFramePolicy.benchmarkLive, framePolicy: LiveTestWidgetsFlutterBindingFramePolicy.benchmarkLive,
($) async { ($) async {
await app.runTmail(); await setupTest();
// https://github.com/leancodepl/patrol/issues/1602#issuecomment-1665317814 await scenarioBuilder($).execute();
final originalOnError = FlutterError.onError!; },
FlutterError.onError = (FlutterErrorDetails details) { );
originalOnError(details); }
};
await test($); Future<void> setupTest() async {
}); await app.runTmail();
final originalOnError = FlutterError.onError!;
FlutterError.onError = (FlutterErrorDetails details) {
originalOnError(details);
};
} }
} }
@@ -0,0 +1,15 @@
import '../base/base_scenario.dart';
import '../scenarios/login_with_basic_auth_scenario.dart';
mixin RequiresLoginMixin on BaseScenario {
Future<void> executeLoginScenario() async {
final loginScenario = 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'),
);
await loginScenario.execute();
}
}
@@ -5,31 +5,21 @@ import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../robots/app_grid_robot.dart'; import '../robots/app_grid_robot.dart';
import '../robots/mailbox_menu_robot.dart'; import '../robots/mailbox_menu_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class AppGridScenario extends BaseScenario { class AppGridScenario extends BaseTestScenario {
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; const AppGridScenario(super.$);
AppGridScenario(
super.$,
{
required this.loginWithBasicAuthScenario
}
);
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
final mailboxMenuRobot = MailboxMenuRobot($); final mailboxMenuRobot = MailboxMenuRobot($);
final appGridRobot = AppGridRobot($); final appGridRobot = AppGridRobot($);
await loginWithBasicAuthScenario.execute();
await threadRobot.openMailbox(); await threadRobot.openMailbox();
await _expectMailboxViewVisible(); await _expectMailboxViewVisible();
await _expectAppGridViewVisible(); await _expectAppGridViewVisible();
@@ -1,31 +1,24 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart'; import 'package:patrol/patrol.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart'; import '../models/provisioning_email.dart';
import '../robots/email_robot.dart'; import '../robots/email_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class DownloadAllAttachmentsScenario extends BaseScenario with ScenarioUtilsMixin { class DownloadAllAttachmentsScenario extends BaseTestScenario {
DownloadAllAttachmentsScenario(
super.$, {
required this.loginWithBasicAuthScenario,
required this.attachmentContents,
});
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; const DownloadAllAttachmentsScenario(super.$);
final List<String> attachmentContents;
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
const subject = 'download all attachments subject'; const subject = 'download all attachments subject';
final List<String> attachmentContents = ['file1', 'file2', 'file3'];
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
final emailRobot = EmailRobot($); final emailRobot = EmailRobot($);
await loginWithBasicAuthScenario.execute();
// Prepare attachment files // Prepare attachment files
final attachmentFiles = await Future.wait( final attachmentFiles = await Future.wait(
attachmentContents.map( attachmentContents.map(
@@ -36,7 +29,7 @@ class DownloadAllAttachmentsScenario extends BaseScenario with ScenarioUtilsMixi
// Provisioning email // Provisioning email
await provisionEmail( await provisionEmail(
[ProvisioningEmail( [ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email, toEmail: email,
subject: subject, subject: subject,
content: 'download all attachments content', content: 'download all attachments content',
attachmentPaths: attachmentFiles.map((file) => file.path).toList(), attachmentPaths: attachmentFiles.map((file) => file.path).toList(),
@@ -7,27 +7,18 @@ import 'package:tmail_ui_user/features/composer/presentation/view/mobile/mobile_
import 'package:tmail_ui_user/features/email/presentation/email_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 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../robots/composer_robot.dart'; import '../robots/composer_robot.dart';
import '../robots/email_robot.dart'; import '../robots/email_robot.dart';
import '../robots/search_robot.dart'; import '../robots/search_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class ForwardEmailScenario extends BaseScenario { class ForwardEmailScenario extends BaseTestScenario {
const ForwardEmailScenario(
super.$,
{
required this.loginWithBasicAuthScenario,
}
);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; const ForwardEmailScenario(super.$);
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
await loginWithBasicAuthScenario.execute();
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
await threadRobot.openSearchView(); await threadRobot.openSearchView();
await _expectSearchViewVisible(); await _expectSearchViewVisible();
File diff suppressed because one or more lines are too long
@@ -6,32 +6,27 @@ import 'package:tmail_ui_user/features/search/email/presentation/search_email_vi
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.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 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart'; import '../models/provisioning_email.dart';
import '../robots/search_robot.dart'; import '../robots/search_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseTestScenario {
with ScenarioUtilsMixin {
const SearchEmailByDatetimeAndSortOrderRelevanceScenario( const SearchEmailByDatetimeAndSortOrderRelevanceScenario(super.$);
super.$,
{
required this.loginWithBasicAuthScenario,
required this.queryString,
required this.listProvisioningEmail,
}
);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; static const queryString = 'relevance';
final String queryString; static const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
final List<ProvisioningEmail> listProvisioningEmail;
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
await loginWithBasicAuthScenario.execute(); final listProvisioningEmail = listUsername
.map((username) => ProvisioningEmail(
toEmail: '${username.toLowerCase()}@example.com',
subject: queryString,
content: '$queryString to user $username',
))
.toList();
await provisionEmail(listProvisioningEmail); await provisionEmail(listProvisioningEmail);
await $.pumpAndSettle(); await $.pumpAndSettle();
@@ -70,7 +65,7 @@ class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario
); );
await _expectSearchResultEmailListVisible(); await _expectSearchResultEmailListVisible();
await _expectEmailListDisplayedCorrectly(); await _expectEmailListDisplayedCorrectly(listProvisioningEmail);
} }
@@ -98,7 +93,7 @@ class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario
await expectViewVisible($(#sort_filter_context_menu)); await expectViewVisible($(#sort_filter_context_menu));
} }
Future<void> _expectEmailListDisplayedCorrectly() async { Future<void> _expectEmailListDisplayedCorrectly(List<ProvisioningEmail> listProvisioningEmail) async {
expect(find.byType(EmailTileBuilder), findsNWidgets(listProvisioningEmail.length)); expect(find.byType(EmailTileBuilder), findsNWidgets(listProvisioningEmail.length));
} }
@@ -7,29 +7,18 @@ import 'package:tmail_ui_user/features/search/email/presentation/search_email_vi
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.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 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../robots/search_robot.dart'; import '../robots/search_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchEmailWithSortOrderScenario extends BaseScenario { class SearchEmailWithSortOrderScenario extends BaseTestScenario {
const SearchEmailWithSortOrderScenario( const SearchEmailWithSortOrderScenario(super.$);
super.$,
{
required this.loginWithBasicAuthScenario,
required this.queryString,
required this.listUsername,
}
);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; static const queryString = 'hello';
final String queryString; static const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
final List<String> listUsername;
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
await loginWithBasicAuthScenario.execute();
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
await threadRobot.openSearchView(); await threadRobot.openSearchView();
await _expectSearchViewVisible(); await _expectSearchViewVisible();
@@ -1,34 +1,28 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart'; import '../models/provisioning_email.dart';
import '../robots/search_robot.dart'; import '../robots/search_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchResultHighlightsScenario extends BaseScenario with ScenarioUtilsMixin { class SearchResultHighlightsScenario extends BaseTestScenario {
SearchResultHighlightsScenario( SearchResultHighlightsScenario(super.$);
super.$, {
required this.loginWithBasicAuthScenario,
required this.keyword,
required this.longEmailContents,
});
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; static const keyword = 'Search snippet results';
final String keyword; static const List<String> longEmailContents = [
final List<String> longEmailContents; "$keyword Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. $keyword Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s $keyword",
];
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
// Robots // Robots
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
final searchRobot = SearchRobot($); final searchRobot = SearchRobot($);
// Login
await loginWithBasicAuthScenario.execute();
// Prepare attachment file // Prepare attachment file
final file = await preparingTxtFile(keyword); final file = await preparingTxtFile(keyword);
@@ -36,7 +30,7 @@ class SearchResultHighlightsScenario extends BaseScenario with ScenarioUtilsMixi
await provisionEmail(longEmailContents await provisionEmail(longEmailContents
.map( .map(
(emailContent) => ProvisioningEmail( (emailContent) => ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email, toEmail: email,
subject: keyword, subject: keyword,
content: emailContent, content: emailContent,
attachmentPaths: emailContent == longEmailContents.first attachmentPaths: emailContent == longEmailContents.first
@@ -1,34 +1,28 @@
import 'package:core/core.dart'; import 'package:core/presentation/views/text/rich_text_builder.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart'; import '../models/provisioning_email.dart';
import '../robots/search_robot.dart'; import '../robots/search_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchSuggestionHighlightsScenario extends BaseScenario with ScenarioUtilsMixin { class SearchSuggestionHighlightsScenario extends BaseTestScenario {
SearchSuggestionHighlightsScenario( SearchSuggestionHighlightsScenario(super.$);
super.$, {
required this.loginWithBasicAuthScenario,
required this.keyword,
required this.longEmailContents,
});
final LoginWithBasicAuthScenario loginWithBasicAuthScenario; static const keyword = 'Search snippet suggestions';
final String keyword; static const List<String> longEmailContents = [
final List<String> longEmailContents; "$keyword Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. $keyword Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s $keyword",
];
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
// Robots // Robots
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
final searchRobot = SearchRobot($); final searchRobot = SearchRobot($);
// Login
await loginWithBasicAuthScenario.execute();
// Prepare attachment file // Prepare attachment file
final file = await preparingTxtFile(keyword); final file = await preparingTxtFile(keyword);
@@ -36,7 +30,7 @@ class SearchSuggestionHighlightsScenario extends BaseScenario with ScenarioUtils
await provisionEmail(longEmailContents await provisionEmail(longEmailContents
.map( .map(
(emailContent) => ProvisioningEmail( (emailContent) => ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email, toEmail: email,
subject: keyword, subject: keyword,
content: emailContent, content: emailContent,
attachmentPaths: emailContent == longEmailContents.first attachmentPaths: emailContent == longEmailContents.first
@@ -1,40 +1,29 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../robots/composer_robot.dart'; import '../robots/composer_robot.dart';
import '../robots/thread_robot.dart'; import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class SendEmailScenario extends BaseScenario { class SendEmailScenario extends BaseTestScenario {
const SendEmailScenario( const SendEmailScenario(super.$);
super.$,
{
required this.loginWithBasicAuthScenario,
required this.additionalRecipient,
required this.subject,
required this.content
}
);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String additionalRecipient;
final String subject;
final String content;
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
const additionalRecipient = String.fromEnvironment('ADDITIONAL_MAIL_RECIPIENT');
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
const subject = 'Test subject';
const content = 'Test content';
final threadRobot = ThreadRobot($); final threadRobot = ThreadRobot($);
final composerRobot = ComposerRobot($); final composerRobot = ComposerRobot($);
await loginWithBasicAuthScenario.execute();
await threadRobot.openComposer(); await threadRobot.openComposer();
await _expectComposerViewVisible(); await _expectComposerViewVisible();
await composerRobot.grantContactPermission(); await composerRobot.grantContactPermission();
await composerRobot.addRecipient(loginWithBasicAuthScenario.email); await composerRobot.addRecipient(email);
await composerRobot.addRecipient(additionalRecipient); await composerRobot.addRecipient(additionalRecipient);
await composerRobot.addSubject(subject); await composerRobot.addSubject(subject);
await composerRobot.addContent(content); await composerRobot.addContent(content);
@@ -1,35 +1,27 @@
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart';
import '../base/base_scenario.dart'; import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart'; import '../models/provisioning_email.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class WebSocketUpdateUiScenario extends BaseScenario with ScenarioUtilsMixin { class WebSocketUpdateUiScenario extends BaseTestScenario {
const WebSocketUpdateUiScenario(super.$, { const WebSocketUpdateUiScenario(super.$);
required this.loginWithBasicAuthScenario,
required this.subject,
required this.content,
});
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String subject;
final String content;
@override @override
Future<void> execute() async { Future<void> runTestLogic() async {
await loginWithBasicAuthScenario.execute(); const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
const subject = 'web socket subject';
const content = 'web socket content';
await provisionEmail( await provisionEmail(
[ProvisioningEmail( [ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email, toEmail: email,
subject: subject, subject: subject,
content: content, content: content,
)], )],
refreshEmailView: false, refreshEmailView: false,
); );
await $.pumpAndSettle(); await $.pumpAndSettle();
await _expectEmailVisible(loginWithBasicAuthScenario.email); await _expectEmailVisible(email);
await _expectEmailUnreadWithSubject(subject); await _expectEmailUnreadWithSubject(subject);
await _expectEmailUnstarredWithSubject(subject); await _expectEmailUnstarredWithSubject(subject);
@@ -1,24 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/app_grid_scenario.dart'; import '../../scenarios/app_grid_scenario.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should display and navigate app grid correctly when clicked', description: 'Should display and navigate app grid correctly when clicked',
test: ($) async { scenarioBuilder: ($) => AppGridScenario($),
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 appGridScenario = AppGridScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
);
await appGridScenario.execute();
}
); );
} }
@@ -1,24 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/download_all_attachments_scenario.dart'; import '../../scenarios/download_all_attachments_scenario.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see save dialog when download all attachments successfully', description: 'Should see save dialog when download all attachments successfully',
test: ($) async { scenarioBuilder: ($) => DownloadAllAttachmentsScenario($),
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 downloadAllAttachmentsScenario = DownloadAllAttachmentsScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
attachmentContents: ['file1', 'file2', 'file3'],
);
await downloadAllAttachmentsScenario.execute();
}
); );
} }
@@ -1,23 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/no_disposition_inline_scenario.dart'; import '../../scenarios/no_disposition_inline_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see base64 inline image when attachment has no disposition but has cid', description: 'Should see base64 inline image when attachment has no disposition but has cid',
test: ($) async { scenarioBuilder: ($) => NoDispositionInlineScenario($),
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 noDispositionInlineScenario = NoDispositionInlineScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
);
await noDispositionInlineScenario.execute();
}
); );
} }
@@ -1,23 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/forward_email_scenario.dart'; import '../../scenarios/forward_email_scenario.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see HTML content contain enough: Subject, From, To, Cc, Bcc, Reply to', description: 'Should see HTML content contain enough: Subject, From, To, Cc, Bcc, Reply to',
test: ($) async { scenarioBuilder: ($) => ForwardEmailScenario($),
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();
},
); );
} }
@@ -1,24 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/send_email_scenario.dart'; import '../../scenarios/send_email_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see success toast when send email successfully', description: 'Should see success toast when send email successfully',
test: ($) async { scenarioBuilder: ($) => SendEmailScenario($),
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 sendEmailScenario = SendEmailScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
additionalRecipient: const String.fromEnvironment('ADDITIONAL_MAIL_RECIPIENT'),
subject: 'Test subject',
content: 'Test content');
await sendEmailScenario.execute();
},
); );
} }
@@ -4,15 +4,12 @@ import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see thread view when login with basic auth successfully', description: 'Should see thread view when login with basic auth successfully',
test: ($) async { scenarioBuilder: ($) => LoginWithBasicAuthScenario(
final loginWithBasicAuthScenario = LoginWithBasicAuthScenario($, $,
username: const String.fromEnvironment('USERNAME'), username: const String.fromEnvironment('USERNAME'),
hostUrl: const String.fromEnvironment('BASIC_AUTH_URL'), hostUrl: const String.fromEnvironment('BASIC_AUTH_URL'),
email: const String.fromEnvironment('BASIC_AUTH_EMAIL'), email: const String.fromEnvironment('BASIC_AUTH_EMAIL'),
password: const String.fromEnvironment('PASSWORD'), password: const String.fromEnvironment('PASSWORD'),
); ),
await loginWithBasicAuthScenario.execute();
}
); );
} }
@@ -1,44 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../models/provisioning_email.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_email_by_date_time_and_sort_order_relevance_scenario.dart'; import '../../scenarios/search_email_by_date_time_and_sort_order_relevance_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see list email displayed by date time `Last 7 days` and sort order `Relevance` when search email successfully', description: 'Should see list email displayed by date time `Last 7 days` and sort order `Relevance` when search email successfully',
test: ($) async { scenarioBuilder: ($) => SearchEmailByDatetimeAndSortOrderRelevanceScenario($),
const username = String.fromEnvironment('USERNAME');
const password = String.fromEnvironment('PASSWORD');
const hostUrl = String.fromEnvironment('BASIC_AUTH_URL');
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
final loginWithBasicAuthScenario = LoginWithBasicAuthScenario(
$,
username: username,
password: password,
hostUrl: hostUrl,
email: email,
);
const queryString = 'relevance';
const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
final listProvisioningEmail = listUsername
.map((username) => ProvisioningEmail(
toEmail: '${username.toLowerCase()}@example.com',
subject: queryString,
content: '$queryString to user $username',
))
.toList();
final searchEmailByDatetimeAndSortOrderRelevanceScenario = SearchEmailByDatetimeAndSortOrderRelevanceScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
queryString: queryString,
listProvisioningEmail: listProvisioningEmail,
);
await searchEmailByDatetimeAndSortOrderRelevanceScenario.execute();
},
); );
} }
@@ -1,35 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_email_with_sort_order_scenario.dart'; import '../../scenarios/search_email_with_sort_order_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see list email displayed by sort order selected when search email successfully', description: 'Should see list email displayed by sort order selected when search email successfully',
test: ($) async { scenarioBuilder: ($) => SearchEmailWithSortOrderScenario($),
const username = String.fromEnvironment('USERNAME');
const password = String.fromEnvironment('PASSWORD');
const hostUrl = String.fromEnvironment('BASIC_AUTH_URL');
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
final loginWithBasicAuthScenario = LoginWithBasicAuthScenario(
$,
username: username,
password: password,
hostUrl: hostUrl,
email: email,
);
const queryString = 'hello';
const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
final searchEmailWithSortOrderScenario = SearchEmailWithSortOrderScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
queryString: queryString,
listUsername: listUsername
);
await searchEmailWithSortOrderScenario.execute();
},
); );
} }
@@ -1,36 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_result_highlights_scenario.dart'; import '../../scenarios/search_result_highlights_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see highlighted keyword in search result', description: 'Should see highlighted keyword in search result',
test: ($) async { scenarioBuilder: ($) => SearchResultHighlightsScenario($),
const keyword = 'Search snippet results';
const longContentWithSearchKeywordAtTheStart = "$keyword Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s";
const longContentWithSearchKeywordAtTheMiddle = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. $keyword Lorem Ipsum has been the industry's standard dummy text ever since the 1500s";
const longContentWithSearchKeywordAtTheEnd = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s $keyword";
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 searchResultHighlightsScenario = SearchResultHighlightsScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
keyword: keyword,
longEmailContents: [
longContentWithSearchKeywordAtTheStart,
longContentWithSearchKeywordAtTheMiddle,
longContentWithSearchKeywordAtTheEnd
],
);
await searchResultHighlightsScenario.execute();
}
); );
} }
@@ -1,36 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_suggestion_highlights_scenario.dart'; import '../../scenarios/search_suggestion_highlights_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see highlighted keyword in search suggestion', description: 'Should see highlighted keyword in search suggestion',
test: ($) async { scenarioBuilder: ($) => SearchSuggestionHighlightsScenario($),
const keyword = 'Search snippet suggestions';
const longContentWithSearchKeywordAtTheStart = "$keyword Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s";
const longContentWithSearchKeywordAtTheMiddle = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. $keyword Lorem Ipsum has been the industry's standard dummy text ever since the 1500s";
const longContentWithSearchKeywordAtTheEnd = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s $keyword";
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 searchResultHighlightsScenario = SearchSuggestionHighlightsScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
keyword: keyword,
longEmailContents: [
longContentWithSearchKeywordAtTheStart,
longContentWithSearchKeywordAtTheMiddle,
longContentWithSearchKeywordAtTheEnd
],
);
await searchResultHighlightsScenario.execute();
}
); );
} }
@@ -1,25 +1,9 @@
import '../../base/test_base.dart'; import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/web_socket_update_ui_scenario.dart'; import '../../scenarios/web_socket_update_ui_scenario.dart';
void main() { void main() {
TestBase().runPatrolTest( TestBase().runPatrolTest(
description: 'Should see thread view updated per web socket message', description: 'Should see thread view updated per web socket message',
test: ($) async { scenarioBuilder: ($) => WebSocketUpdateUiScenario($),
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 webSocketUpdateUiScenario = WebSocketUpdateUiScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
subject: 'web socket subject',
content: 'web socket content',
);
await webSocketUpdateUiScenario.execute();
}
); );
} }