194 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:fluffychat/config/setting_keys.dart';
 | |
| import 'package:fluffychat/pages/chat/chat_view.dart';
 | |
| import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
 | |
| import 'package:fluffychat/pages/chat_list/search_title.dart';
 | |
| import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart';
 | |
| 
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_test/flutter_test.dart';
 | |
| import 'package:hive_flutter/hive_flutter.dart';
 | |
| import 'package:integration_test/integration_test.dart';
 | |
| 
 | |
| import 'package:fluffychat/main.dart' as app;
 | |
| import 'package:shared_preferences/shared_preferences.dart';
 | |
| 
 | |
| import 'extensions/default_flows.dart';
 | |
| import 'extensions/wait_for.dart';
 | |
| import 'users.dart';
 | |
| 
 | |
| void main() {
 | |
|   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 | |
| 
 | |
|   group(
 | |
|     'Integration Test',
 | |
|     () {
 | |
|       setUpAll(
 | |
|         () async {
 | |
|           // this random dialog popping up is super hard to cover in tests
 | |
|           SharedPreferences.setMockInitialValues({
 | |
|             SettingKeys.showNoGoogle: false,
 | |
|           });
 | |
|           try {
 | |
|             Hive.deleteFromDisk();
 | |
|             Hive.initFlutter();
 | |
|           } catch (_) {}
 | |
|         },
 | |
|       );
 | |
| 
 | |
|       testWidgets(
 | |
|         'Start app, login and logout',
 | |
|         (WidgetTester tester) async {
 | |
|           app.main();
 | |
|           await tester.ensureAppStartedHomescreen();
 | |
|           await tester.ensureLoggedOut();
 | |
|         },
 | |
|       );
 | |
| 
 | |
|       testWidgets(
 | |
|         'Login again',
 | |
|         (WidgetTester tester) async {
 | |
|           app.main();
 | |
|           await tester.ensureAppStartedHomescreen();
 | |
|         },
 | |
|       );
 | |
| 
 | |
|       testWidgets(
 | |
|         'Start chat and send message',
 | |
|         (WidgetTester tester) async {
 | |
|           app.main();
 | |
|           await tester.ensureAppStartedHomescreen();
 | |
|           await tester.waitFor(find.byType(TextField));
 | |
|           await tester.enterText(find.byType(TextField), Users.user2.name);
 | |
|           await tester.pumpAndSettle();
 | |
| 
 | |
|           await tester.scrollUntilVisible(
 | |
|             find.text('Chats').first,
 | |
|             500,
 | |
|             scrollable: find
 | |
|                 .descendant(
 | |
|                   of: find.byType(ChatListViewBody),
 | |
|                   matching: find.byType(Scrollable),
 | |
|                 )
 | |
|                 .first,
 | |
|           );
 | |
|           await tester.pumpAndSettle();
 | |
|           await tester.tap(find.text('Chats'));
 | |
|           await tester.pumpAndSettle();
 | |
|           await tester.waitFor(find.byType(SearchTitle));
 | |
|           await tester.pumpAndSettle();
 | |
| 
 | |
|           await tester.scrollUntilVisible(
 | |
|             find.text(Users.user2.name).first,
 | |
|             500,
 | |
|             scrollable: find
 | |
|                 .descendant(
 | |
|                   of: find.byType(ChatListViewBody),
 | |
|                   matching: find.byType(Scrollable),
 | |
|                 )
 | |
|                 .first,
 | |
|           );
 | |
|           await tester.pumpAndSettle();
 | |
|           await tester.tap(find.text(Users.user2.name).first);
 | |
| 
 | |
|           try {
 | |
|             await tester.waitFor(
 | |
|               find.byType(ChatView),
 | |
|               timeout: const Duration(seconds: 5),
 | |
|             );
 | |
|           } catch (_) {
 | |
|             // in case the homeserver sends the username as search result
 | |
|             if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) {
 | |
|               await tester.tap(find.byIcon(Icons.send_outlined));
 | |
|               await tester.pumpAndSettle();
 | |
|             }
 | |
|           }
 | |
| 
 | |
|           await tester.waitFor(find.byType(ChatView));
 | |
|           await tester.enterText(find.byType(TextField).last, 'Test');
 | |
|           await tester.pumpAndSettle();
 | |
|           try {
 | |
|             await tester.waitFor(find.byIcon(Icons.send_outlined));
 | |
|             await tester.tap(find.byIcon(Icons.send_outlined));
 | |
|           } catch (_) {
 | |
|             await tester.testTextInput.receiveAction(TextInputAction.done);
 | |
|           }
 | |
|           await tester.pumpAndSettle();
 | |
|           await tester.waitFor(find.text('Test'));
 | |
|           await tester.pumpAndSettle();
 | |
|         },
 | |
|       );
 | |
| 
 | |
|       testWidgets('Spaces', (tester) async {
 | |
|         app.main();
 | |
|         await tester.ensureAppStartedHomescreen();
 | |
| 
 | |
|         await tester.waitFor(find.byTooltip('Show menu'));
 | |
|         await tester.tap(find.byTooltip('Show menu'));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(find.byIcon(Icons.workspaces_outlined));
 | |
|         await tester.tap(find.byIcon(Icons.workspaces_outlined));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(find.byType(TextField));
 | |
|         await tester.enterText(find.byType(TextField).last, 'Test Space');
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.testTextInput.receiveAction(TextInputAction.done);
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(find.text('Invite contact'));
 | |
| 
 | |
|         await tester.tap(find.text('Invite contact'));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(
 | |
|           find.descendant(
 | |
|             of: find.byType(InvitationSelectionView),
 | |
|             matching: find.byType(TextField),
 | |
|           ),
 | |
|         );
 | |
|         await tester.enterText(
 | |
|           find.descendant(
 | |
|             of: find.byType(InvitationSelectionView),
 | |
|             matching: find.byType(TextField),
 | |
|           ),
 | |
|           Users.user2.name,
 | |
|         );
 | |
| 
 | |
|         await Future.delayed(const Duration(milliseconds: 250));
 | |
|         await tester.testTextInput.receiveAction(TextInputAction.done);
 | |
| 
 | |
|         await Future.delayed(const Duration(milliseconds: 1000));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.tap(
 | |
|           find
 | |
|               .descendant(
 | |
|                 of: find.descendant(
 | |
|                   of: find.byType(InvitationSelectionView),
 | |
|                   matching: find.byType(ListTile),
 | |
|                 ),
 | |
|                 matching: find.text(Users.user2.name),
 | |
|               )
 | |
|               .last,
 | |
|         );
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(find.maybeUppercaseText('Yes'));
 | |
|         await tester.tap(find.maybeUppercaseText('Yes'));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.tap(find.byTooltip('Back'));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         await tester.waitFor(find.text('Load 2 more participants'));
 | |
|         await tester.tap(find.text('Load 2 more participants'));
 | |
|         await tester.pumpAndSettle();
 | |
| 
 | |
|         expect(find.text(Users.user2.name), findsOneWidget);
 | |
|       });
 | |
|     },
 | |
|   );
 | |
| }
 |