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
@@ -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);