| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | import 'dart:io';import 'package:appflowy/core/config/kv_keys.dart';import 'package:appflowy/startup/entry_point.dart';import 'package:appflowy/startup/startup.dart';import 'package:appflowy/startup/tasks/prelude.dart';import 'package:flowy_infra_ui/flowy_infra_ui.dart';import 'package:flutter/gestures.dart';import 'package:flutter/material.dart';import 'package:flutter/services.dart';import 'package:flutter_test/flutter_test.dart';import 'package:path_provider/path_provider.dart';import 'package:shared_preferences/shared_preferences.dart';class TestFolder {  /// Location / Path  /// Set a given AppFlowy data storage location under test environment.  ///  /// To pass null means clear the location.  ///  /// The file_picker is a system component and can't be tapped, so using logic instead of tapping.  ///  static Future<void> setTestLocation(String? name) async {    final location = await testLocation(name);    SharedPreferences.setMockInitialValues({      KVKeys.pathLocation: location.path,    });    return;  }  /// Clean the location.  static Future<void> cleanTestLocation(String? name) async {    final dir = await testLocation(name);    await dir.delete(recursive: true);    return;  }  /// Get current using location.  static Future<String> currentLocation() async {    final prefs = await SharedPreferences.getInstance();    return prefs.getString(KVKeys.pathLocation)!;  }  /// Get default location under development environment.  static Future<String> defaultDevelopmentLocation() async {    final dir = await appFlowyDocumentDirectory();    return dir.path;  }  /// Get default location under test environment.  static Future<Directory> testLocation(String? name) async {    final dir = await getApplicationDocumentsDirectory();    var path = '${dir.path}/flowy_test';    if (name != null) {      path += '/$name';    }    return Directory(path).create(recursive: true);  }}extension AppFlowyTestBase on WidgetTester {  Future<void> initializeAppFlowy() async {    TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger        .setMockMethodCallHandler(const MethodChannel('hotkey_manager'),            (MethodCall methodCall) async {      if (methodCall.method == 'unregisterAll') {        // do nothing      }      return;    });    WidgetsFlutterBinding.ensureInitialized();    await FlowyRunner.run(FlowyApp(), IntegrationMode.integrationTest);    await wait(3000);    await pumpAndSettle(const Duration(seconds: 2));  }  Future<void> tapButton(    Finder finder, {    int? pointer,    int buttons = kPrimaryButton,    bool warnIfMissed = true,    int milliseconds = 500,  }) async {    await tap(finder);    await pumpAndSettle(Duration(milliseconds: milliseconds));    return;  }  Future<void> tapButtonWithName(    String tr, {    int milliseconds = 500,  }) async {    Finder button = find.text(      tr,      findRichText: true,      skipOffstage: false,    );    if (button.evaluate().isEmpty) {      button = find.byWidgetPredicate(        (widget) => widget is FlowyText && widget.title == tr,      );    }    await tapButton(      button,      milliseconds: milliseconds,    );    return;  }  Future<void> tapButtonWithTooltip(    String tr, {    int milliseconds = 500,  }) async {    final button = find.byTooltip(tr);    await tapButton(      button,      milliseconds: milliseconds,    );    return;  }  Future<void> wait(int milliseconds) async {    await pumpAndSettle(Duration(milliseconds: milliseconds));    return;  }}extension AppFlowyFinderTestBase on CommonFinders {  Finder findTextInFlowyText(String text) {    return find.byWidgetPredicate(      (widget) => widget is FlowyText && widget.title == text,    );  }}
 |