Quellcode durchsuchen

chore: optimize the integration test UI

Lucas.Xu vor 1 Jahr
Ursprung
Commit
aca3c90eb3

+ 2 - 1
frontend/appflowy_flutter/integration_test/cover_image_test.dart

@@ -29,7 +29,8 @@ void main() {
 
       await tester.tapGoButton();
       await tester.hoverOnCoverPluginAddButton();
-      await tester.expectToSeePluginAddCoverAndIconButton();
+
+      tester.expectToSeePluginAddCoverAndIconButton();
     });
   });
 }

+ 5 - 5
frontend/appflowy_flutter/integration_test/switch_folder_test.dart

@@ -35,7 +35,7 @@ void main() {
       await tester.initializeAppFlowy();
 
       await tester.tapGoButton();
-      tester.expectToSeeWelcomePage();
+      tester.expectToSeeHomePage();
 
       // switch to user B
       {
@@ -51,7 +51,7 @@ void main() {
         await mockGetDirectoryPath(userB);
         await tester.tapCustomLocationButton();
         await tester.pumpAndSettle();
-        tester.expectToSeeWelcomePage();
+        tester.expectToSeeHomePage();
 
         // set user name to userB
         await tester.openSettings();
@@ -69,7 +69,7 @@ void main() {
         await tester.tapCustomLocationButton();
 
         await tester.pumpAndSettle();
-        tester.expectToSeeWelcomePage();
+        tester.expectToSeeHomePage();
         tester.expectToSeeUserName(userA);
       }
 
@@ -84,7 +84,7 @@ void main() {
         await tester.tapCustomLocationButton();
 
         await tester.pumpAndSettle();
-        tester.expectToSeeWelcomePage();
+        tester.expectToSeeHomePage();
         tester.expectToSeeUserName(userB);
       }
 
@@ -98,7 +98,7 @@ void main() {
       await tester.tapGoButton();
 
       // home and readme document
-      tester.expectToSeeWelcomePage();
+      tester.expectToSeeHomePage();
 
       // open settings and restore the location
       await tester.openSettings();

+ 50 - 79
frontend/appflowy_flutter/integration_test/util/common_operations.dart

@@ -1,103 +1,102 @@
 import 'dart:ui';
 
 import 'package:appflowy/generated/locale_keys.g.dart';
-import 'package:appflowy/plugins/document/presentation/banner.dart';
 import 'package:appflowy/plugins/document/presentation/share/share_button.dart';
 import 'package:appflowy/user/presentation/skip_log_in_screen.dart';
-import 'package:appflowy/workspace/presentation/home/home_stack.dart';
 import 'package:appflowy/workspace/presentation/home/menu/app/header/add_button.dart';
 import 'package:appflowy/workspace/presentation/home/menu/app/section/item.dart';
 import 'package:appflowy_editor/appflowy_editor.dart';
 import 'package:easy_localization/easy_localization.dart';
-import 'package:flowy_infra_ui/flowy_infra_ui.dart';
 import 'package:flowy_infra_ui/widget/buttons/primary_button.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 
-import 'base.dart';
-
-const String readme = 'Read me';
+import 'util.dart';
 
 extension CommonOperations on WidgetTester {
+  /// Get current file location of AppFlowy.
   Future<String> currentFileLocation() async {
     return TestFolder.currentLocation();
   }
 
+  /// Tap the GetStart button on the launch page.
   Future<void> tapGoButton() async {
     final goButton = find.byType(GoButton);
     await tapButton(goButton);
   }
 
-  Future<void> tapCreateButton() async {
-    await tapButtonWithName(LocaleKeys.settings_files_create.tr());
-  }
-
-  void expectToSeeWelcomePage() {
-    expect(find.byType(HomeStack), findsOneWidget);
-    expect(find.textContaining('Read me'), findsOneWidget);
-  }
-
+  /// Tap the + button on the home page.
   Future<void> tapAddButton() async {
     final addButton = find.byType(AddButton);
     await tapButton(addButton);
   }
 
+  /// Tap the create document button.
+  ///
+  /// Must call [tapAddButton] first.
   Future<void> tapCreateDocumentButton() async {
     await tapButtonWithName(LocaleKeys.document_menuName.tr());
   }
 
+  /// Tap the import button.
+  ///
+  /// Must call [tapAddButton] first.
   Future<void> tapImportButton() async {
     await tapButtonWithName(LocaleKeys.moreAction_import.tr());
   }
 
+  /// Tap the import from text & markdown button.
+  ///
+  /// Must call [tapImportButton] first.
   Future<void> tapTextAndMarkdownButton() async {
     await tapButtonWithName(LocaleKeys.importPanel_textAndMarkdown.tr());
   }
 
-  Finder findPageName(String name) {
-    return find.byWidgetPredicate(
-      (widget) => widget is ViewSectionItem && widget.view.name == name,
-    );
-  }
-
-  void expectToSeePageName(String name) {
-    final pageName = findPageName(name);
-    expect(pageName, findsOneWidget);
-  }
-
-  void expectNotToSeePageName(String name) {
-    final pageName = findPageName(name);
-    expect(pageName, findsNothing);
-  }
-
-  Future<void> hoverOnPageName(String name) async {
-    final pageName = find.byWidgetPredicate(
-      (widget) => widget is ViewSectionItem && widget.view.name == name,
-    );
-
+  /// Hover on the widget.
+  Future<void> hoverOnWidget(
+    Finder finder, {
+    Offset? offset,
+  }) async {
     final gesture = await createGesture(kind: PointerDeviceKind.mouse);
     await gesture.addPointer(location: Offset.zero);
     addTearDown(gesture.removePointer);
     await pump();
-    await gesture.moveTo(getCenter(pageName));
+    await gesture.moveTo(offset ?? getCenter(finder));
     await pumpAndSettle();
   }
 
+  /// Hover on the page name.
+  Future<void> hoverOnPageName(String name) async {
+    await hoverOnWidget(findPageName(name));
+  }
+
+  /// Tap the ... button beside the page name.
+  ///
+  /// Must call [hoverOnPageName] first.
   Future<void> tapPageOptionButton() async {
     final optionButton = find.byType(ViewDisclosureButton);
     await tapButton(optionButton);
   }
 
+  /// Tap the delete page button.
+  ///
+  /// Must call [tapPageOptionButton] first.
   Future<void> tapDeletePageButton() async {
     await tapPageOptionButton();
     await tapButtonWithName(ViewDisclosureAction.delete.name);
   }
 
+  /// Tap the rename page button.
+  ///
+  /// Must call [tapPageOptionButton] first.
   Future<void> tapRenamePageButton() async {
     await tapPageOptionButton();
     await tapButtonWithName(ViewDisclosureAction.rename.name);
   }
 
+  /// Rename the page.
+  ///
+  /// Must call [tapPageOptionButton] first.
   Future<void> renamePage(String name) async {
     await tapRenamePageButton();
     await enterText(find.byType(TextFormField), name);
@@ -113,14 +112,9 @@ extension CommonOperations on WidgetTester {
     await tapButton(okButton);
   }
 
-  void expectToSeeDocumentBanner() {
-    expect(find.byType(DocumentBanner), findsOneWidget);
-  }
-
-  void expectNotToSeeDocumentBanner() {
-    expect(find.byType(DocumentBanner), findsNothing);
-  }
-
+  /// Tap the restore button.
+  ///
+  /// the restore button will show after the current page is deleted.
   Future<void> tapRestoreButton() async {
     final restoreButton = find.textContaining(
       LocaleKeys.deletePagePrompt_restore.tr(),
@@ -128,6 +122,9 @@ extension CommonOperations on WidgetTester {
     await tapButton(restoreButton);
   }
 
+  /// Tap the delete permanently button.
+  ///
+  /// the restore button will show after the current page is deleted.
   Future<void> tapDeletePermanentlyButton() async {
     final restoreButton = find.textContaining(
       LocaleKeys.deletePagePrompt_deletePermanent.tr(),
@@ -135,6 +132,7 @@ extension CommonOperations on WidgetTester {
     await tapButton(restoreButton);
   }
 
+  /// Tap the share button above the document page.
   Future<void> tapShareButton() async {
     final shareButton = find.byWidgetPredicate(
       (widget) => widget is DocumentShareButton,
@@ -142,6 +140,9 @@ extension CommonOperations on WidgetTester {
     await tapButton(shareButton);
   }
 
+  /// Tap the export markdown button
+  ///
+  /// Must call [tapShareButton] first.
   Future<void> tapMarkdownButton() async {
     final markdownButton = find.textContaining(
       LocaleKeys.shareAction_markdown.tr(),
@@ -149,44 +150,14 @@ extension CommonOperations on WidgetTester {
     await tapButton(markdownButton);
   }
 
-  void expectToExportSuccess() {
-    final exportSuccess = find.byWidgetPredicate(
-      (widget) =>
-          widget is FlowyText &&
-          widget.title == LocaleKeys.settings_files_exportFileSuccess.tr(),
-    );
-    expect(exportSuccess, findsOneWidget);
-  }
-
+  /// Hover on cover plugin button above the document
   Future<void> hoverOnCoverPluginAddButton() async {
     final editor = find.byWidgetPredicate(
       (widget) => widget is AppFlowyEditor,
     );
-
-    final gesture = await createGesture(kind: PointerDeviceKind.mouse);
-    await gesture.addPointer(location: Offset.zero);
-    addTearDown(gesture.removePointer);
-    await pump();
-    final topLeft = getTopLeft(editor).translate(20, 20);
-    await gesture.moveTo(topLeft);
-    await pumpAndSettle();
-  }
-
-  Future<void> expectToSeePluginAddCoverAndIconButton() async {
-    final addCover = find.textContaining(
-      LocaleKeys.document_plugins_cover_addCover.tr(),
-    );
-    final addIcon = find.textContaining(
-      LocaleKeys.document_plugins_cover_addIcon.tr(),
-    );
-    expect(addCover, findsOneWidget);
-    expect(addIcon, findsOneWidget);
-  }
-
-  void expectToSeeUserName(String name) {
-    final userName = find.byWidgetPredicate(
-      (widget) => widget is FlowyText && widget.title == name,
+    await hoverOnWidget(
+      editor,
+      offset: getTopLeft(editor).translate(20, 20),
     );
-    expect(userName, findsOneWidget);
   }
 }

+ 76 - 0
frontend/appflowy_flutter/integration_test/util/expectation.dart

@@ -0,0 +1,76 @@
+import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/plugins/document/presentation/banner.dart';
+import 'package:appflowy/workspace/presentation/home/home_stack.dart';
+import 'package:appflowy/workspace/presentation/home/menu/app/section/item.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flowy_infra_ui/flowy_infra_ui.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+const String readme = 'Read me';
+
+extension Expectation on WidgetTester {
+  /// Expect to see the home page and with a default read me page.
+  void expectToSeeHomePage() {
+    expect(find.byType(HomeStack), findsOneWidget);
+    expect(find.textContaining(readme), findsOneWidget);
+  }
+
+  /// Expect to see the page name on the home page.
+  void expectToSeePageName(String name) {
+    final pageName = findPageName(name);
+    expect(pageName, findsOneWidget);
+  }
+
+  /// Expect not to see the page name on the home page.
+  void expectNotToSeePageName(String name) {
+    final pageName = findPageName(name);
+    expect(pageName, findsNothing);
+  }
+
+  /// Expect to see the document banner.
+  void expectToSeeDocumentBanner() {
+    expect(find.byType(DocumentBanner), findsOneWidget);
+  }
+
+  /// Expect not to see the document banner.
+  void expectNotToSeeDocumentBanner() {
+    expect(find.byType(DocumentBanner), findsNothing);
+  }
+
+  /// Expect to the markdown file export success dialog.
+  void expectToExportSuccess() {
+    final exportSuccess = find.byWidgetPredicate(
+      (widget) =>
+          widget is FlowyText &&
+          widget.title == LocaleKeys.settings_files_exportFileSuccess.tr(),
+    );
+    expect(exportSuccess, findsOneWidget);
+  }
+
+  /// Expect to see the add button and icon button inside the document.
+  void expectToSeePluginAddCoverAndIconButton() {
+    final addCover = find.textContaining(
+      LocaleKeys.document_plugins_cover_addCover.tr(),
+    );
+    final addIcon = find.textContaining(
+      LocaleKeys.document_plugins_cover_addIcon.tr(),
+    );
+    expect(addCover, findsOneWidget);
+    expect(addIcon, findsOneWidget);
+  }
+
+  /// Expect to see the user name on the home page
+  void expectToSeeUserName(String name) {
+    final userName = find.byWidgetPredicate(
+      (widget) => widget is FlowyText && widget.title == name,
+    );
+    expect(userName, findsOneWidget);
+  }
+
+  /// Find the page name on the home page.
+  Finder findPageName(String name) {
+    return find.byWidgetPredicate(
+      (widget) => widget is ViewSectionItem && widget.view.name == name,
+    );
+  }
+}

+ 1 - 0
frontend/appflowy_flutter/integration_test/util/util.dart

@@ -2,3 +2,4 @@ export 'base.dart';
 export 'common_operations.dart';
 export 'settings.dart';
 export 'data.dart';
+export 'expectation.dart';