base.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'dart:io';
  2. import 'package:appflowy/startup/entry_point.dart';
  3. import 'package:appflowy/startup/startup.dart';
  4. import 'package:appflowy/workspace/application/settings/prelude.dart';
  5. import 'package:flowy_infra/uuid.dart';
  6. import 'package:flowy_infra_ui/flowy_infra_ui.dart';
  7. import 'package:flutter/gestures.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:flutter/services.dart';
  10. import 'package:flutter_test/flutter_test.dart';
  11. import 'package:path_provider/path_provider.dart';
  12. class FlowyTestContext {
  13. FlowyTestContext({
  14. required this.applicationDataDirectory,
  15. });
  16. final String applicationDataDirectory;
  17. }
  18. extension AppFlowyTestBase on WidgetTester {
  19. Future<FlowyTestContext> initializeAppFlowy({
  20. // use to append after the application data directory
  21. String? pathExtension,
  22. }) async {
  23. mockHotKeyManagerHandlers();
  24. final directory = await mockApplicationDataStorage(
  25. pathExtension: pathExtension,
  26. );
  27. WidgetsFlutterBinding.ensureInitialized();
  28. await FlowyRunner.run(
  29. FlowyApp(),
  30. IntegrationMode.integrationTest,
  31. );
  32. await wait(3000);
  33. await pumpAndSettle(const Duration(seconds: 2));
  34. return FlowyTestContext(
  35. applicationDataDirectory: directory,
  36. );
  37. }
  38. void mockHotKeyManagerHandlers() {
  39. TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
  40. .setMockMethodCallHandler(const MethodChannel('hotkey_manager'),
  41. (MethodCall methodCall) async {
  42. if (methodCall.method == 'unregisterAll') {
  43. // do nothing
  44. }
  45. return;
  46. });
  47. }
  48. Future<String> mockApplicationDataStorage({
  49. // use to append after the application data directory
  50. String? pathExtension,
  51. }) async {
  52. final dir = await getTemporaryDirectory();
  53. // Use a random uuid to avoid conflict.
  54. String path = '${dir.path}/appflowy_integration_test/${uuid()}';
  55. if (pathExtension != null && pathExtension.isNotEmpty) {
  56. path = '$path/$pathExtension';
  57. }
  58. final directory = Directory(path);
  59. if (!directory.existsSync()) {
  60. await directory.create(recursive: true);
  61. }
  62. MockApplicationDataStorage.initialPath = directory.path;
  63. return directory.path;
  64. }
  65. Future<void> tapButton(
  66. Finder finder, {
  67. int? pointer,
  68. int buttons = kPrimaryButton,
  69. bool warnIfMissed = true,
  70. int milliseconds = 500,
  71. }) async {
  72. await tap(
  73. finder,
  74. buttons: buttons,
  75. warnIfMissed: warnIfMissed,
  76. );
  77. await pumpAndSettle(Duration(milliseconds: milliseconds));
  78. return;
  79. }
  80. Future<void> tapButtonWithName(
  81. String tr, {
  82. int milliseconds = 500,
  83. }) async {
  84. Finder button = find.text(
  85. tr,
  86. findRichText: true,
  87. skipOffstage: false,
  88. );
  89. if (button.evaluate().isEmpty) {
  90. button = find.byWidgetPredicate(
  91. (widget) => widget is FlowyText && widget.text == tr,
  92. );
  93. }
  94. await tapButton(
  95. button,
  96. milliseconds: milliseconds,
  97. );
  98. return;
  99. }
  100. Future<void> tapButtonWithTooltip(
  101. String tr, {
  102. int milliseconds = 500,
  103. }) async {
  104. final button = find.byTooltip(tr);
  105. await tapButton(
  106. button,
  107. milliseconds: milliseconds,
  108. );
  109. return;
  110. }
  111. Future<void> doubleTapButton(
  112. Finder finder, {
  113. int? pointer,
  114. int buttons = kPrimaryButton,
  115. bool warnIfMissed = true,
  116. int milliseconds = 500,
  117. }) async {
  118. await tapButton(
  119. finder,
  120. pointer: pointer,
  121. buttons: buttons,
  122. warnIfMissed: warnIfMissed,
  123. milliseconds: kDoubleTapMinTime.inMilliseconds,
  124. );
  125. await tapButton(
  126. finder,
  127. pointer: pointer,
  128. buttons: buttons,
  129. warnIfMissed: warnIfMissed,
  130. milliseconds: milliseconds,
  131. );
  132. }
  133. Future<void> wait(int milliseconds) async {
  134. await pumpAndSettle(Duration(milliseconds: milliseconds));
  135. return;
  136. }
  137. }
  138. extension AppFlowyFinderTestBase on CommonFinders {
  139. Finder findTextInFlowyText(String text) {
  140. return find.byWidgetPredicate(
  141. (widget) => widget is FlowyText && widget.text == text,
  142. );
  143. }
  144. }