TF-3493 Refactor integration test code for performance and maintainability
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
@@ -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
+15
-20
@@ -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
-36
@@ -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($),
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user