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();
}
+22 -11
View File
@@ -3,10 +3,17 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
import 'package:tmail_ui_user/main.dart' as app;
import 'base_scenario.dart';
class TestBase {
static final TestBase _instance = TestBase._internal();
factory TestBase() => _instance;
TestBase._internal();
void runPatrolTest({
required String description,
required Function(PatrolIntegrationTester $) test,
required BaseScenario Function(PatrolIntegrationTester $) scenarioBuilder,
}) {
patrolTest(
description,
@@ -19,15 +26,19 @@ class TestBase {
findTimeout: Duration(seconds: 10),
),
framePolicy: LiveTestWidgetsFlutterBindingFramePolicy.benchmarkLive,
($) async {
await app.runTmail();
// https://github.com/leancodepl/patrol/issues/1602#issuecomment-1665317814
final originalOnError = FlutterError.onError!;
FlutterError.onError = (FlutterErrorDetails details) {
originalOnError(details);
};
await test($);
});
($) async {
await setupTest();
await scenarioBuilder($).execute();
},
);
}
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_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/mailbox_menu_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;
AppGridScenario(
super.$,
{
required this.loginWithBasicAuthScenario
}
);
const AppGridScenario(super.$);
@override
Future<void> execute() async {
Future<void> runTestLogic() async {
final threadRobot = ThreadRobot($);
final mailboxMenuRobot = MailboxMenuRobot($);
final appGridRobot = AppGridRobot($);
await loginWithBasicAuthScenario.execute();
await threadRobot.openMailbox();
await _expectMailboxViewVisible();
await _expectAppGridViewVisible();
@@ -1,31 +1,24 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
import '../base/base_scenario.dart';
import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart';
import '../robots/email_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 {
DownloadAllAttachmentsScenario(
super.$, {
required this.loginWithBasicAuthScenario,
required this.attachmentContents,
});
class DownloadAllAttachmentsScenario extends BaseTestScenario {
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final List<String> attachmentContents;
const DownloadAllAttachmentsScenario(super.$);
@override
Future<void> execute() async {
Future<void> runTestLogic() async {
const subject = 'download all attachments subject';
final List<String> attachmentContents = ['file1', 'file2', 'file3'];
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
final threadRobot = ThreadRobot($);
final emailRobot = EmailRobot($);
await loginWithBasicAuthScenario.execute();
// Prepare attachment files
final attachmentFiles = await Future.wait(
attachmentContents.map(
@@ -36,7 +29,7 @@ class DownloadAllAttachmentsScenario extends BaseScenario with ScenarioUtilsMixi
// Provisioning email
await provisionEmail(
[ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email,
toEmail: email,
subject: subject,
content: 'download all attachments content',
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/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/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,
}
);
class ForwardEmailScenario extends BaseTestScenario {
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
const ForwardEmailScenario(super.$);
@override
Future<void> execute() async {
await loginWithBasicAuthScenario.execute();
Future<void> runTestLogic() async {
final threadRobot = ThreadRobot($);
await threadRobot.openSearchView();
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/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart';
import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart';
import '../robots/search_robot.dart';
import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario
with ScenarioUtilsMixin {
class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseTestScenario {
const SearchEmailByDatetimeAndSortOrderRelevanceScenario(
super.$,
{
required this.loginWithBasicAuthScenario,
required this.queryString,
required this.listProvisioningEmail,
}
);
const SearchEmailByDatetimeAndSortOrderRelevanceScenario(super.$);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String queryString;
final List<ProvisioningEmail> listProvisioningEmail;
static const queryString = 'relevance';
static const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
@override
Future<void> execute() async {
await loginWithBasicAuthScenario.execute();
Future<void> runTestLogic() async {
final listProvisioningEmail = listUsername
.map((username) => ProvisioningEmail(
toEmail: '${username.toLowerCase()}@example.com',
subject: queryString,
content: '$queryString to user $username',
))
.toList();
await provisionEmail(listProvisioningEmail);
await $.pumpAndSettle();
@@ -70,7 +65,7 @@ class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario
);
await _expectSearchResultEmailListVisible();
await _expectEmailListDisplayedCorrectly();
await _expectEmailListDisplayedCorrectly(listProvisioningEmail);
}
@@ -98,7 +93,7 @@ class SearchEmailByDatetimeAndSortOrderRelevanceScenario extends BaseScenario
await expectViewVisible($(#sort_filter_context_menu));
}
Future<void> _expectEmailListDisplayedCorrectly() async {
Future<void> _expectEmailListDisplayedCorrectly(List<ProvisioningEmail> listProvisioningEmail) async {
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/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart';
import '../base/base_test_scenario.dart';
import '../robots/search_robot.dart';
import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchEmailWithSortOrderScenario extends BaseScenario {
const SearchEmailWithSortOrderScenario(
super.$,
{
required this.loginWithBasicAuthScenario,
required this.queryString,
required this.listUsername,
}
);
class SearchEmailWithSortOrderScenario extends BaseTestScenario {
const SearchEmailWithSortOrderScenario(super.$);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String queryString;
final List<String> listUsername;
static const queryString = 'hello';
static const listUsername = ['Alice', 'Brian', 'Charlotte', 'David', 'Emma'];
@override
Future<void> execute() async {
await loginWithBasicAuthScenario.execute();
Future<void> runTestLogic() async {
final threadRobot = ThreadRobot($);
await threadRobot.openSearchView();
await _expectSearchViewVisible();
@@ -1,34 +1,28 @@
import 'package:core/core.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 '../robots/search_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 {
SearchResultHighlightsScenario(
super.$, {
required this.loginWithBasicAuthScenario,
required this.keyword,
required this.longEmailContents,
});
class SearchResultHighlightsScenario extends BaseTestScenario {
SearchResultHighlightsScenario(super.$);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String keyword;
final List<String> longEmailContents;
static const keyword = 'Search snippet results';
static const 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
Future<void> execute() async {
Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
// Robots
final threadRobot = ThreadRobot($);
final searchRobot = SearchRobot($);
// Login
await loginWithBasicAuthScenario.execute();
// Prepare attachment file
final file = await preparingTxtFile(keyword);
@@ -36,7 +30,7 @@ class SearchResultHighlightsScenario extends BaseScenario with ScenarioUtilsMixi
await provisionEmail(longEmailContents
.map(
(emailContent) => ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email,
toEmail: email,
subject: keyword,
content: emailContent,
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 '../base/base_scenario.dart';
import '../base/base_test_scenario.dart';
import '../models/provisioning_email.dart';
import '../robots/search_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 {
SearchSuggestionHighlightsScenario(
super.$, {
required this.loginWithBasicAuthScenario,
required this.keyword,
required this.longEmailContents,
});
class SearchSuggestionHighlightsScenario extends BaseTestScenario {
SearchSuggestionHighlightsScenario(super.$);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String keyword;
final List<String> longEmailContents;
static const keyword = 'Search snippet suggestions';
static const 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
Future<void> execute() async {
Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
// Robots
final threadRobot = ThreadRobot($);
final searchRobot = SearchRobot($);
// Login
await loginWithBasicAuthScenario.execute();
// Prepare attachment file
final file = await preparingTxtFile(keyword);
@@ -36,7 +30,7 @@ class SearchSuggestionHighlightsScenario extends BaseScenario with ScenarioUtils
await provisionEmail(longEmailContents
.map(
(emailContent) => ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email,
toEmail: email,
subject: keyword,
content: emailContent,
attachmentPaths: emailContent == longEmailContents.first
@@ -1,40 +1,29 @@
import 'package:flutter_test/flutter_test.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/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class SendEmailScenario extends BaseScenario {
const SendEmailScenario(
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;
class SendEmailScenario extends BaseTestScenario {
const SendEmailScenario(super.$);
@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 composerRobot = ComposerRobot($);
await loginWithBasicAuthScenario.execute();
await threadRobot.openComposer();
await _expectComposerViewVisible();
await composerRobot.grantContactPermission();
await composerRobot.addRecipient(loginWithBasicAuthScenario.email);
await composerRobot.addRecipient(email);
await composerRobot.addRecipient(additionalRecipient);
await composerRobot.addSubject(subject);
await composerRobot.addContent(content);
@@ -1,35 +1,27 @@
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 '../utils/scenario_utils_mixin.dart';
import 'login_with_basic_auth_scenario.dart';
class WebSocketUpdateUiScenario extends BaseScenario with ScenarioUtilsMixin {
const WebSocketUpdateUiScenario(super.$, {
required this.loginWithBasicAuthScenario,
required this.subject,
required this.content,
});
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String subject;
final String content;
class WebSocketUpdateUiScenario extends BaseTestScenario {
const WebSocketUpdateUiScenario(super.$);
@override
Future<void> execute() async {
await loginWithBasicAuthScenario.execute();
Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
const subject = 'web socket subject';
const content = 'web socket content';
await provisionEmail(
[ProvisioningEmail(
toEmail: loginWithBasicAuthScenario.email,
toEmail: email,
subject: subject,
content: content,
)],
refreshEmailView: false,
);
await $.pumpAndSettle();
await _expectEmailVisible(loginWithBasicAuthScenario.email);
await _expectEmailVisible(email);
await _expectEmailUnreadWithSubject(subject);
await _expectEmailUnstarredWithSubject(subject);
@@ -1,24 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/app_grid_scenario.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should display and navigate app grid correctly when clicked',
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 appGridScenario = AppGridScenario(
$,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
);
await appGridScenario.execute();
}
scenarioBuilder: ($) => AppGridScenario($),
);
}
@@ -1,24 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/download_all_attachments_scenario.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see save dialog when download all attachments successfully',
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 downloadAllAttachmentsScenario = DownloadAllAttachmentsScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
attachmentContents: ['file1', 'file2', 'file3'],
);
await downloadAllAttachmentsScenario.execute();
}
scenarioBuilder: ($) => DownloadAllAttachmentsScenario($),
);
}
@@ -1,23 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/no_disposition_inline_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see base64 inline image when attachment has no disposition but has cid',
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 noDispositionInlineScenario = NoDispositionInlineScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
);
await noDispositionInlineScenario.execute();
}
scenarioBuilder: ($) => NoDispositionInlineScenario($),
);
}
@@ -1,23 +1,9 @@
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();
},
scenarioBuilder: ($) => ForwardEmailScenario($),
);
}
@@ -1,24 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/send_email_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see success toast when send email successfully',
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 sendEmailScenario = SendEmailScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
additionalRecipient: const String.fromEnvironment('ADDITIONAL_MAIL_RECIPIENT'),
subject: 'Test subject',
content: 'Test content');
await sendEmailScenario.execute();
},
scenarioBuilder: ($) => SendEmailScenario($),
);
}
@@ -4,15 +4,12 @@ import '../../scenarios/login_with_basic_auth_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see thread view when login with basic auth successfully',
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'),
);
await loginWithBasicAuthScenario.execute();
}
scenarioBuilder: ($) => 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'),
),
);
}
@@ -1,44 +1,9 @@
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';
void main() {
TestBase().runPatrolTest(
description: 'Should see list email displayed by date time `Last 7 days` and sort order `Relevance` when search email successfully',
test: ($) async {
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();
},
scenarioBuilder: ($) => SearchEmailByDatetimeAndSortOrderRelevanceScenario($),
);
}
@@ -1,35 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_email_with_sort_order_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see list email displayed by sort order selected when search email successfully',
test: ($) async {
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();
},
scenarioBuilder: ($) => SearchEmailWithSortOrderScenario($),
);
}
@@ -1,36 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_result_highlights_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see highlighted keyword in search result',
test: ($) async {
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();
}
scenarioBuilder: ($) => SearchResultHighlightsScenario($),
);
}
@@ -1,36 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/search_suggestion_highlights_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see highlighted keyword in search suggestion',
test: ($) async {
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();
}
scenarioBuilder: ($) => SearchSuggestionHighlightsScenario($),
);
}
@@ -1,25 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/login_with_basic_auth_scenario.dart';
import '../../scenarios/web_socket_update_ui_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should see thread view updated per web socket message',
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 webSocketUpdateUiScenario = WebSocketUpdateUiScenario($,
loginWithBasicAuthScenario: loginWithBasicAuthScenario,
subject: 'web socket subject',
content: 'web socket content',
);
await webSocketUpdateUiScenario.execute();
}
scenarioBuilder: ($) => WebSocketUpdateUiScenario($),
);
}