diff --git a/integration_test/base/test_base.dart b/integration_test/base/test_base.dart index a40a8469b..127cddd37 100644 --- a/integration_test/base/test_base.dart +++ b/integration_test/base/test_base.dart @@ -15,7 +15,10 @@ class TestBase { visibleTimeout: Duration(minutes: 1), ), nativeAutomatorConfig: - nativeAutomatorConfig ?? const NativeAutomatorConfig(), + nativeAutomatorConfig ?? + const NativeAutomatorConfig( + keyboardBehavior: KeyboardBehavior.alternative, + ), framePolicy: LiveTestWidgetsFlutterBindingFramePolicy.fullyLive, ($) async { await initTwakeChat(); diff --git a/integration_test/robots/login_robot.dart b/integration_test/robots/login_robot.dart index db8e29c93..328b8716a 100644 --- a/integration_test/robots/login_robot.dart +++ b/integration_test/robots/login_robot.dart @@ -16,7 +16,8 @@ class LoginRobot extends CoreRobot { } } - Future tapOnUseYourCompanyServer() async { + Future + tapOnUseYourCompanyServer() async { await $('Use your company server').tap(); } diff --git a/integration_test/robots/send_text_message_robot.dart b/integration_test/robots/send_text_message_robot.dart new file mode 100644 index 000000000..54e12c091 --- /dev/null +++ b/integration_test/robots/send_text_message_robot.dart @@ -0,0 +1,73 @@ +import 'package:fluffychat/pages/chat/chat_input_row.dart'; +import 'package:fluffychat/pages/chat/chat_input_row_send_btn.dart'; +import 'package:fluffychat/pages/chat/input_bar/input_bar.dart'; +import 'package:fluffychat/widgets/twake_components/twake_icon_button.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:linagora_design_flutter/images_picker/image_item_widget.dart'; +import 'package:patrol/patrol.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +import '../base/core_robot.dart'; + +class SendTextMessageRobot extends CoreRobot { + SendTextMessageRobot(super.$); + + Future enterTextMessage(String message) async { + try { + await $.enterText($(InputBar), message); + } catch (e) { + ignoreException(); + } + } + + Future tapOnSendButton() async { + try { + await $.tap($(ChatInputRowSendBtn)); + } catch (e) { + ignoreException(); + } + } + + Future tapOnAddAttachmentButton() async { + try { + await $.tap($(ChatInputRow).$(TwakeIconButton)); + } catch (e) { + ignoreException(); + } + } + + Future selectImage() async { + try { + await $.tap($(ImagePickerItemWidget)); + } catch (e) { + ignoreException(); + } + } + + Future sendImage() async { + try { + await $.tap($((SvgPicture))); + } catch (e) { + ignoreException(); + } + } + + Future dismissMediaPopUp() async { + try { + await $.tap($('Next')); + } catch (e) { + ignoreException(); + } + } + + Future grantPhotosAndVideosPermission( + NativeAutomator nativeAutomator, + ) async { + if (await nativeAutomator.isPermissionDialogVisible( + timeout: const Duration(seconds: 15), + )) { + await nativeAutomator.grantPermissionWhenInUse(); + } + } + +} diff --git a/integration_test/scenarios/login_scenario.dart b/integration_test/scenarios/login_scenario.dart index 1912fdb1c..d1f0193cc 100644 --- a/integration_test/scenarios/login_scenario.dart +++ b/integration_test/scenarios/login_scenario.dart @@ -1,6 +1,7 @@ import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart'; import 'package:fluffychat/pages/twake_welcome/twake_welcome.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patrol/patrol.dart'; import '../base/base_scenario.dart'; @@ -34,6 +35,16 @@ class LoginScenario extends BaseScenario { await loginRobot.pressSignInSsoLogin(); await _handleWaitUntilVisibleHomeServerPickerView(loginRobot); await loginRobot.grantNotificationPermission($.nativeAutomator); + try{ + await $.tap( + find.descendant( + of: find.byType(AppBar), + matching: find.byType(IconButton), + ), + ); + }catch(e){ + loginRobot.ignoreException(); + } await expectViewVisible($(ChatList)); } diff --git a/integration_test/scenarios/send_image_scenario.dart b/integration_test/scenarios/send_image_scenario.dart new file mode 100644 index 000000000..42c24fbe4 --- /dev/null +++ b/integration_test/scenarios/send_image_scenario.dart @@ -0,0 +1,31 @@ +import 'package:fluffychat/pages/chat/chat_view.dart'; +import 'package:fluffychat/pages/chat/events/images_builder/image_bubble.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:linagora_design_flutter/images_picker/images_picker_grid.dart'; +import '../base/base_scenario.dart'; +import '../robots/send_text_message_robot.dart'; +import 'login_scenario.dart'; + +class SendImageScenario extends BaseScenario { + LoginScenario loginScenario; + SendImageScenario( + super.$, { + required this.loginScenario, + }); + + @override + Future execute() async { + final SendTextMessageRobot sendMessageRobot = SendTextMessageRobot($); + await loginScenario.execute(); + await $.tap($(ChatListItem)); + await $.waitUntilVisible($(ChatView)); + await sendMessageRobot.tapOnAddAttachmentButton(); + await sendMessageRobot.dismissMediaPopUp(); + await sendMessageRobot.grantPhotosAndVideosPermission($.nativeAutomator); + await $.waitUntilVisible($(ImagesPickerGrid)); + await sendMessageRobot.selectImage(); + await sendMessageRobot.sendImage(); + expect(ImageBubble, findsAtLeast(1)); + } +} diff --git a/integration_test/scenarios/send_text_message_scenario.dart b/integration_test/scenarios/send_text_message_scenario.dart new file mode 100644 index 000000000..cb046d9de --- /dev/null +++ b/integration_test/scenarios/send_text_message_scenario.dart @@ -0,0 +1,32 @@ +import 'package:fluffychat/pages/chat/chat_view.dart'; +import 'package:fluffychat/pages/chat/events/message/message.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import '../base/base_scenario.dart'; +import '../robots/send_text_message_robot.dart'; +import 'login_scenario.dart'; + +class SendTextMessageScenario extends BaseScenario { + LoginScenario loginScenario; + SendTextMessageScenario( + super.$, { + required this.loginScenario, + }); + + @override + Future execute() async { + final SendTextMessageRobot sendTextMessageRobot = SendTextMessageRobot($); + await loginScenario.execute(); + await $.pumpAndSettle(); + await $.tap($(ChatListItem)); + await $.waitUntilVisible($(ChatView)); + final messagesCount = $(ListView).$(Message).evaluate().length; + await sendTextMessageRobot.enterTextMessage('Hello World'); + await sendTextMessageRobot.tapOnSendButton(); + await $.pumpAndSettle(); + await Future.delayed(const Duration(seconds: 5)); + final messagesCountAfterSending = $(ListView).$(Message).evaluate().length; + expect(messagesCountAfterSending, messagesCount + 1); + } +} diff --git a/integration_test/tests/chat/send_image_test.dart b/integration_test/tests/chat/send_image_test.dart new file mode 100644 index 000000000..146f6798a --- /dev/null +++ b/integration_test/tests/chat/send_image_test.dart @@ -0,0 +1,22 @@ +import '../../base/test_base.dart'; +import '../../scenarios/login_scenario.dart'; +import '../../scenarios/send_image_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see Message image after sending image in chat', + test: ($) async { + final loginScenario = LoginScenario( + $, + username: const String.fromEnvironment('USERNAME'), + serverUrl: const String.fromEnvironment('SERVER_URL'), + password: const String.fromEnvironment('PASSWORD'), + ); + final sendImageScenario = SendImageScenario( + $, + loginScenario: loginScenario, + ); + await sendImageScenario.execute(); + }, + ); +} diff --git a/integration_test/tests/chat/send_text_message_test.dart b/integration_test/tests/chat/send_text_message_test.dart new file mode 100644 index 000000000..696d7b121 --- /dev/null +++ b/integration_test/tests/chat/send_text_message_test.dart @@ -0,0 +1,22 @@ +import '../../base/test_base.dart'; +import '../../scenarios/login_scenario.dart'; +import '../../scenarios/send_text_message_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see Message bubble after sending text message', + test: ($) async { + final loginScenario = LoginScenario( + $, + username: const String.fromEnvironment('USERNAME'), + serverUrl: const String.fromEnvironment('SERVER_URL'), + password: const String.fromEnvironment('PASSWORD'), + ); + final sendTextMessageScenario = SendTextMessageScenario( + $, + loginScenario: loginScenario, + ); + await sendTextMessageScenario.execute(); + }, + ); +}