TF-3341 Integration test web socket for mobile
This commit is contained in:
@@ -1 +1,3 @@
|
|||||||
url.prefix=https://a872-222-252-23-73.ngrok-free.app
|
authentication.strategy.rfc8621=BasicAuthenticationStrategy,com.linagora.tmail.james.jmap.ticket.TicketAuthenticationStrategy
|
||||||
|
url.prefix=
|
||||||
|
websocket.url.prefix=
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart';
|
||||||
|
|
||||||
|
import '../base/base_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;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> execute() async {
|
||||||
|
await loginWithBasicAuthScenario.execute();
|
||||||
|
|
||||||
|
await provisionEmail(
|
||||||
|
[ProvisioningEmail(
|
||||||
|
toEmail: loginWithBasicAuthScenario.email,
|
||||||
|
subject: subject,
|
||||||
|
content: content,
|
||||||
|
)],
|
||||||
|
refreshEmailView: false,
|
||||||
|
);
|
||||||
|
await $.pumpAndSettle();
|
||||||
|
await _expectEmailVisible(loginWithBasicAuthScenario.email);
|
||||||
|
await _expectEmailUnreadWithSubject(subject);
|
||||||
|
await _expectEmailUnstarredWithSubject(subject);
|
||||||
|
|
||||||
|
await simulateUpdateFlagsOfEmailsWithSubjectsFromOutsideCurrentClient(
|
||||||
|
subjects: [subject],
|
||||||
|
isRead: true,
|
||||||
|
);
|
||||||
|
await $.pumpAndSettle();
|
||||||
|
await _expectEmailReadWithSubject(subject);
|
||||||
|
|
||||||
|
await simulateUpdateFlagsOfEmailsWithSubjectsFromOutsideCurrentClient(
|
||||||
|
subjects: [subject],
|
||||||
|
isStar: true,
|
||||||
|
);
|
||||||
|
await $.pumpAndSettle();
|
||||||
|
await _expectEmailStarredWithSubject(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _expectEmailVisible(String email) => expectViewVisible($(email));
|
||||||
|
|
||||||
|
Future<void> _expectEmailUnreadWithSubject(String subject) => expectViewVisible(
|
||||||
|
$(EmailTileBuilder)
|
||||||
|
.which<EmailTileBuilder>(
|
||||||
|
(widget) => widget.presentationEmail.subject == subject
|
||||||
|
&& !widget.presentationEmail.hasRead
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<void> _expectEmailReadWithSubject(String subject) => expectViewVisible(
|
||||||
|
$(EmailTileBuilder)
|
||||||
|
.which<EmailTileBuilder>(
|
||||||
|
(widget) => widget.presentationEmail.subject == subject
|
||||||
|
&& widget.presentationEmail.hasRead
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<void> _expectEmailUnstarredWithSubject(String subject) => expectViewVisible(
|
||||||
|
$(EmailTileBuilder)
|
||||||
|
.which<EmailTileBuilder>(
|
||||||
|
(widget) => widget.presentationEmail.subject == subject
|
||||||
|
&& !widget.presentationEmail.hasStarred
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<void> _expectEmailStarredWithSubject(String subject) => expectViewVisible(
|
||||||
|
$(EmailTileBuilder)
|
||||||
|
.which<EmailTileBuilder>(
|
||||||
|
(widget) => widget.presentationEmail.subject == subject
|
||||||
|
&& widget.presentationEmail.hasStarred
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,16 +1,15 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io' hide HttpClient;
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:jmap_dart_client/http/http_client.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
import 'package:model/email/attachment.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/set/set_email_method.dart';
|
||||||
import 'package:model/email/email_action_type.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:model/extensions/session_extension.dart';
|
|
||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
|
||||||
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
|
||||||
import 'package:model/upload/file_info.dart';
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/state/upload_attachment_state.dart';
|
import 'package:tmail_ui_user/features/composer/domain/state/upload_attachment_state.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart';
|
import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart';
|
||||||
@@ -22,11 +21,15 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_ident
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
||||||
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
|
|
||||||
import '../models/provisioning_email.dart';
|
import '../models/provisioning_email.dart';
|
||||||
|
|
||||||
mixin ScenarioUtilsMixin {
|
mixin ScenarioUtilsMixin {
|
||||||
Future<void> provisionEmail(List<ProvisioningEmail> provisioningEmails) async {
|
Future<void> provisionEmail(
|
||||||
|
List<ProvisioningEmail> provisioningEmails, {
|
||||||
|
bool refreshEmailView = true,
|
||||||
|
}) async {
|
||||||
ComposerBindings().dependencies();
|
ComposerBindings().dependencies();
|
||||||
|
|
||||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||||
@@ -62,11 +65,62 @@ mixin ScenarioUtilsMixin {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
// Refresh view after provisioning emails
|
// Refresh view after provisioning emails
|
||||||
threadController.refreshAllEmail();
|
if (refreshEmailView) {
|
||||||
|
threadController.refreshAllEmail();
|
||||||
|
}
|
||||||
|
|
||||||
ComposerBindings().dispose();
|
ComposerBindings().dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> simulateUpdateFlagsOfEmailsWithSubjectsFromOutsideCurrentClient({
|
||||||
|
required List<String> subjects,
|
||||||
|
bool? isRead,
|
||||||
|
bool? isStar,
|
||||||
|
}) async {
|
||||||
|
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||||
|
final emails = mailboxDashBoardController
|
||||||
|
.emailsInCurrentMailbox
|
||||||
|
.where((presentationEmail) => subjects.contains(
|
||||||
|
presentationEmail.subject
|
||||||
|
))
|
||||||
|
.toList();
|
||||||
|
final session = mailboxDashBoardController.sessionCurrent;
|
||||||
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
if (session == null || accountId == null) return;
|
||||||
|
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
Get.find<HttpClient>(),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final capabilities = <CapabilityIdentifier>{};
|
||||||
|
|
||||||
|
// Mark as read/unread
|
||||||
|
if (isRead != null) {
|
||||||
|
final markEmailAsReadMethod = SetEmailMethod(accountId)
|
||||||
|
..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsRead(
|
||||||
|
isRead ? ReadActions.markAsRead : ReadActions.markAsUnread
|
||||||
|
));
|
||||||
|
requestBuilder.invocation(markEmailAsReadMethod);
|
||||||
|
capabilities.addAll(markEmailAsReadMethod
|
||||||
|
.requiredCapabilities
|
||||||
|
.toCapabilitiesSupportTeamMailboxes(session, accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark as star/unstar
|
||||||
|
if (isStar != null) {
|
||||||
|
final markEmailAsStarMethod = SetEmailMethod(accountId)
|
||||||
|
..addUpdates(emails.listEmailIds.generateMapUpdateObjectMarkAsStar(
|
||||||
|
isStar ? MarkStarAction.markStar : MarkStarAction.unMarkStar
|
||||||
|
));
|
||||||
|
requestBuilder.invocation(markEmailAsStarMethod);
|
||||||
|
capabilities.addAll(markEmailAsStarMethod
|
||||||
|
.requiredCapabilities
|
||||||
|
.toCapabilitiesSupportTeamMailboxes(session, accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
await (requestBuilder..usings(capabilities)).build().execute();
|
||||||
|
}
|
||||||
|
|
||||||
Future<File> preparingTxtFile(String content) async {
|
Future<File> preparingTxtFile(String content) async {
|
||||||
final directory = await getTemporaryDirectory();
|
final directory = await getTemporaryDirectory();
|
||||||
final file = File('${directory.path}/test.txt');
|
final file = File('${directory.path}/test.txt');
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out jwt_privatekey
|
|||||||
openssl rsa -in jwt_privatekey -pubout -out jwt_publickey
|
openssl rsa -in jwt_privatekey -pubout -out jwt_publickey
|
||||||
|
|
||||||
# Replace content of jmap.properties with url.prefix=$BASIC_AUTH_URL
|
# Replace content of jmap.properties with url.prefix=$BASIC_AUTH_URL
|
||||||
|
# and websocket.url.prefix=ws${BASIC_AUTH_URL:4}
|
||||||
sed -i "s|url.prefix=.*|url.prefix=$BASIC_AUTH_URL|" jmap.properties
|
sed -i "s|url.prefix=.*|url.prefix=$BASIC_AUTH_URL|" jmap.properties
|
||||||
|
sed -i '' "s|websocket.url.prefix=.*|websocket.url.prefix=ws${BASIC_AUTH_URL:4}|" jmap.properties
|
||||||
|
|
||||||
echo "Starting services and adding users..."
|
echo "Starting services and adding users..."
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out jwt_privatekey
|
|||||||
openssl rsa -in jwt_privatekey -pubout -out jwt_publickey
|
openssl rsa -in jwt_privatekey -pubout -out jwt_publickey
|
||||||
|
|
||||||
# Replace content of jmap.properties with url.prefix=$BASIC_AUTH_URL
|
# Replace content of jmap.properties with url.prefix=$BASIC_AUTH_URL
|
||||||
|
# and websocket.url.prefix=ws${BASIC_AUTH_URL:4}
|
||||||
sed -i '' "s|url.prefix=.*|url.prefix=$BASIC_AUTH_URL|" jmap.properties
|
sed -i '' "s|url.prefix=.*|url.prefix=$BASIC_AUTH_URL|" jmap.properties
|
||||||
|
sed -i '' "s|websocket.url.prefix=.*|websocket.url.prefix=ws${BASIC_AUTH_URL:4}|" jmap.properties
|
||||||
|
|
||||||
echo "Starting services and adding users..."
|
echo "Starting services and adding users..."
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|||||||
Reference in New Issue
Block a user