You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			172 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			172 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:developer';
 | 
						|
 | 
						|
import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
 | 
						|
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_test/flutter_test.dart';
 | 
						|
 | 
						|
import '../users.dart';
 | 
						|
import 'wait_for.dart';
 | 
						|
 | 
						|
extension DefaultFlowExtensions on WidgetTester {
 | 
						|
  Future<void> login() async {
 | 
						|
    final tester = this;
 | 
						|
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
 | 
						|
    await tester.waitFor(find.text('Let\'s start'));
 | 
						|
 | 
						|
    expect(find.text('Let\'s start'), findsOneWidget);
 | 
						|
 | 
						|
    final input = find.byType(TextField);
 | 
						|
 | 
						|
    expect(input, findsOneWidget);
 | 
						|
 | 
						|
    // getting the placeholder in place
 | 
						|
    await tester.tap(find.byIcon(Icons.search));
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
    await tester.enterText(input, homeserver);
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
    await tester.testTextInput.receiveAction(TextInputAction.done);
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
 | 
						|
    // in case registration is allowed
 | 
						|
    // try {
 | 
						|
    await Future.delayed(const Duration(milliseconds: 50));
 | 
						|
 | 
						|
    await tester.scrollUntilVisible(
 | 
						|
      find.text('Login'),
 | 
						|
      500,
 | 
						|
      scrollable: find.descendant(
 | 
						|
        of: find.byKey(const Key('ConnectPageListView')),
 | 
						|
        matching: find.byType(Scrollable).first,
 | 
						|
      ),
 | 
						|
    );
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
 | 
						|
    await tester.tap(find.text('Login'));
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
    /*} catch (e) {
 | 
						|
      log('Registration is not allowed. Proceeding with login...');
 | 
						|
    }*/
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
 | 
						|
    await Future.delayed(const Duration(milliseconds: 50));
 | 
						|
 | 
						|
    final inputs = find.byType(TextField);
 | 
						|
 | 
						|
    await tester.enterText(inputs.first, Users.user1.name);
 | 
						|
    await tester.enterText(inputs.last, Users.user1.password);
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
    await tester.testTextInput.receiveAction(TextInputAction.done);
 | 
						|
 | 
						|
    try {
 | 
						|
      // pumpAndSettle does not work in here as setState is called
 | 
						|
      // asynchronously
 | 
						|
      await tester.waitFor(
 | 
						|
        find.byType(LinearProgressIndicator),
 | 
						|
        timeout: const Duration(milliseconds: 1500),
 | 
						|
        skipPumpAndSettle: true,
 | 
						|
      );
 | 
						|
    } catch (_) {
 | 
						|
      // in case the input action does not work on the desired platform
 | 
						|
      if (find.text('Login').evaluate().isNotEmpty) {
 | 
						|
        await tester.tap(find.text('Login'));
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    try {
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
    } catch (_) {
 | 
						|
      // may fail because of ongoing animation below dialog
 | 
						|
    }
 | 
						|
 | 
						|
    await tester.waitFor(
 | 
						|
      find.byType(ChatListViewBody),
 | 
						|
      skipPumpAndSettle: true,
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  /// ensure PushProvider check passes
 | 
						|
  Future<void> acceptPushWarning() async {
 | 
						|
    final tester = this;
 | 
						|
 | 
						|
    final matcher = find.maybeUppercaseText('Do not show again');
 | 
						|
 | 
						|
    try {
 | 
						|
      await tester.waitFor(matcher, timeout: const Duration(seconds: 5));
 | 
						|
 | 
						|
      // the FCM push error dialog to be handled...
 | 
						|
      await tester.tap(matcher);
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
    } catch (_) {}
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> ensureLoggedOut() async {
 | 
						|
    final tester = this;
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
    if (find.byType(ChatListViewBody).evaluate().isNotEmpty) {
 | 
						|
      await tester.tap(find.byTooltip('Show menu'));
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
      await tester.tap(find.text('Settings'));
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
      await tester.scrollUntilVisible(
 | 
						|
        find.text('Account'),
 | 
						|
        500,
 | 
						|
        scrollable: find.descendant(
 | 
						|
          of: find.byKey(const Key('SettingsListViewContent')),
 | 
						|
          matching: find.byType(Scrollable),
 | 
						|
        ),
 | 
						|
      );
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
      await tester.tap(find.text('Logout'));
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
      await tester.tap(find.maybeUppercaseText('Yes'));
 | 
						|
      await tester.pumpAndSettle();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> ensureAppStartedHomescreen({
 | 
						|
    Duration timeout = const Duration(seconds: 20),
 | 
						|
  }) async {
 | 
						|
    final tester = this;
 | 
						|
    await tester.pumpAndSettle();
 | 
						|
 | 
						|
    final homeserverPickerFinder = find.byType(HomeserverPicker);
 | 
						|
    final chatListFinder = find.byType(ChatListViewBody);
 | 
						|
 | 
						|
    final end = DateTime.now().add(timeout);
 | 
						|
 | 
						|
    log(
 | 
						|
      'Waiting for HomeserverPicker or ChatListViewBody...',
 | 
						|
      name: 'Test Runner',
 | 
						|
    );
 | 
						|
    do {
 | 
						|
      if (DateTime.now().isAfter(end)) {
 | 
						|
        throw Exception(
 | 
						|
          'Timed out waiting for HomeserverPicker or ChatListViewBody',
 | 
						|
        );
 | 
						|
      }
 | 
						|
 | 
						|
      await pumpAndSettle();
 | 
						|
      await Future.delayed(const Duration(milliseconds: 100));
 | 
						|
    } while (homeserverPickerFinder.evaluate().isEmpty &&
 | 
						|
        chatListFinder.evaluate().isEmpty);
 | 
						|
 | 
						|
    if (homeserverPickerFinder.evaluate().isNotEmpty) {
 | 
						|
      log(
 | 
						|
        'Found HomeserverPicker, performing login.',
 | 
						|
        name: 'Test Runner',
 | 
						|
      );
 | 
						|
      await tester.login();
 | 
						|
    } else {
 | 
						|
      log(
 | 
						|
        'Found ChatListViewBody, skipping login.',
 | 
						|
        name: 'Test Runner',
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    await tester.acceptPushWarning();
 | 
						|
  }
 | 
						|
}
 |