diff --git a/integration_test/flows/auth_flows.dart b/integration_test/flows/auth_flows.dart index e16fd686..d5aebf91 100644 --- a/integration_test/flows/auth_flows.dart +++ b/integration_test/flows/auth_flows.dart @@ -1,9 +1,13 @@ import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; import '../data/environment_constants.dart'; import '../utils/fluffy_chat_tester.dart'; +Future finalLogout(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester.logout()); + extension AuthFlows on FluffyChatTester { Future login() async { await waitFor('Sign in'); @@ -18,6 +22,7 @@ extension AuthFlows on FluffyChatTester { } Future logout() async { + await ensureLoggedIn(); await tapOn(Key('accounts_and_settings_buttons')); await tapOn('Settings'); await scrollUntilVisible('Logout'); diff --git a/integration_test/flows/basic_messaging.dart b/integration_test/flows/basic_messaging.dart index eb3e0944..c0c2547c 100644 --- a/integration_test/flows/basic_messaging.dart +++ b/integration_test/flows/basic_messaging.dart @@ -1,10 +1,9 @@ -import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import '../utils/fluffy_chat_tester.dart'; import 'auth_flows.dart'; +import 'chat_flows.dart'; Future basicMessaging(WidgetTester widgetTester) => widgetTester .startFluffyChatTest() @@ -12,31 +11,13 @@ Future basicMessaging(WidgetTester widgetTester) => widgetTester extension on FluffyChatTester { Future _basicMessaging() async { - final shouldLogout = await ensureLoggedIn(); + await ensureLoggedIn(); + await ensureGroupChatCreated(); - // Create a new group chat - await tapOn(FloatingActionButton); - await tapOn('Create group'); - await enterText(TextField, 'Test Group 01'); - await tapOn('Create a group and invite users'); - await waitFor('Invite contact'); - await goBack(); - - // Send a message + await tapOn(ChatFlows.groupChatName); const testMessage = 'Hello from integration test!'; await enterText(Key('chat_input_field'), testMessage); await tapOn(Key('send_button')); - - // Ensure message is visible await waitFor(testMessage); - - // Archive the chat - await tapOn(ChatSettingsPopupMenu); - await tapOn('Leave'); - await waitFor('Are you sure?'); - await tapOn('Leave'); - await waitFor(ChatList); - - if (shouldLogout) await logout(); } } diff --git a/integration_test/flows/chat_flows.dart b/integration_test/flows/chat_flows.dart new file mode 100644 index 00000000..512a6af2 --- /dev/null +++ b/integration_test/flows/chat_flows.dart @@ -0,0 +1,35 @@ +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future archiveChats(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester._archiveChats()); + +extension ChatFlows on FluffyChatTester { + static const String groupChatName = 'Test Group 01'; + + Future ensureGroupChatCreated() async { + if (await isVisible(groupChatName)) return; + await tapOn(FloatingActionButton); + await tapOn('Create group'); + await enterText(TextField, groupChatName); + await tapOn('Create a group and invite users'); + await waitFor('Invite contact'); + await goBack(); + await goBack(); + } + + Future _archiveChats() async { + await ensureLoggedIn(); + await ensureGroupChatCreated(); + await tapOn(ChatSettingsPopupMenu); + await tapOn('Leave'); + await waitFor('Are you sure?'); + await tapOn('Leave'); + await waitFor(ChatList); + } +} diff --git a/integration_test/mobile_test.dart b/integration_test/mobile_test.dart index fe10b949..8da68b0a 100644 --- a/integration_test/mobile_test.dart +++ b/integration_test/mobile_test.dart @@ -1,7 +1,9 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; +import 'flows/auth_flows.dart'; import 'flows/basic_messaging.dart'; +import 'flows/chat_flows.dart'; import 'flows/login_and_chat_backup.dart'; void main() { @@ -10,5 +12,7 @@ void main() { group('FluffyChat Integration Tests', () { testWidgets('Login and logout flow', loginAndChatBackup); testWidgets('Basic Messaging', basicMessaging); + testWidgets('Archive chats', archiveChats); + testWidgets('Final logout', finalLogout); }); } diff --git a/integration_test/utils/fluffy_chat_tester.dart b/integration_test/utils/fluffy_chat_tester.dart index fe3f754a..b91736fc 100644 --- a/integration_test/utils/fluffy_chat_tester.dart +++ b/integration_test/utils/fluffy_chat_tester.dart @@ -67,10 +67,7 @@ extension type FluffyChatTester(WidgetTester tester) { await tester.pumpAndSettle(); } - Future goBack() async { - _print('🔙 Going a page back'); - await tester.pageBack(); - } + Future goBack() => tapOn(find.byTooltip('Back')); Future enterText(Object object, String text, {int? index}) async { final finder = await _ensureVisible(object, index: index); diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 6432bc39..731ca1b7 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -553,6 +553,7 @@ class ChatController extends State timeline?.cancelSubscriptions(); timeline = null; inputFocus.removeListener(_inputFocusListener); + if (currentlyTyping) room.setTyping(false); super.dispose(); } @@ -1289,6 +1290,7 @@ class ChatController extends State if (AppSettings.sendTypingNotifications.value) { typingCoolDown?.cancel(); typingCoolDown = Timer(const Duration(seconds: 2), () { + if (!mounted) return; typingCoolDown = null; currentlyTyping = false; room.setTyping(false);