mirror of
				https://github.com/AppFlowy-IO/AppFlowy.git
				synced 2025-11-04 12:03:28 +00:00 
			
		
		
		
	* feat: support reminder on date * feat: support reminder on date in database * fix: include time static * fix: do not force unwrap * chore: clean flutter code * test: add test for reminder in database * fix: interpret reminder option * feat: date and reminder on mobile * feat: improve notification actions and support open row * feat: support dates in document * fix: minor changes + review * feat: support reminder on mobile in document * feat: support open row on database reminder mobile * test: add more tests * fix: first part of review * fix: open row responsibility * fix: abstract application logic from presentation layer * fix: update reminder on date cell update * test: fix failing test * fix: show correct selected day after end date toggled
		
			
				
	
	
		
			275 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:appflowy/generated/locale_keys.g.dart';
 | 
						|
import 'package:appflowy/plugins/database/widgets/row/row_detail.dart';
 | 
						|
import 'package:appflowy/plugins/document/presentation/banner.dart';
 | 
						|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/document_header_node_widget.dart';
 | 
						|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/emoji_icon_widget.dart';
 | 
						|
import 'package:appflowy/workspace/application/sidebar/folder/folder_bloc.dart';
 | 
						|
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
 | 
						|
import 'package:appflowy/workspace/presentation/home/menu/view/view_item.dart';
 | 
						|
import 'package:appflowy/workspace/presentation/notifications/widgets/notification_item.dart';
 | 
						|
import 'package:appflowy/workspace/presentation/widgets/date_picker/widgets/reminder_selector.dart';
 | 
						|
import 'package:appflowy/workspace/presentation/widgets/view_title_bar.dart';
 | 
						|
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_test/flutter_test.dart';
 | 
						|
 | 
						|
import 'util.dart';
 | 
						|
 | 
						|
// const String readme = 'Read me';
 | 
						|
const String gettingStarted = 'Getting started';
 | 
						|
 | 
						|
extension Expectation on WidgetTester {
 | 
						|
  /// Expect to see the home page and with a default read me page.
 | 
						|
  Future<void> expectToSeeHomePageWithGetStartedPage() async {
 | 
						|
    final finder = find.byType(HomeStack);
 | 
						|
    await pumpUntilFound(finder);
 | 
						|
    expect(finder, findsOneWidget);
 | 
						|
 | 
						|
    final docFinder = find.textContaining(gettingStarted);
 | 
						|
    await pumpUntilFound(docFinder);
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> expectToSeeHomePage() async {
 | 
						|
    final finder = find.byType(HomeStack);
 | 
						|
    await pumpUntilFound(finder);
 | 
						|
    expect(finder, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Expect to see the page name on the home page.
 | 
						|
  void expectToSeePageName(
 | 
						|
    String name, {
 | 
						|
    String? parentName,
 | 
						|
    ViewLayoutPB layout = ViewLayoutPB.Document,
 | 
						|
    ViewLayoutPB parentLayout = ViewLayoutPB.Document,
 | 
						|
  }) {
 | 
						|
    final pageName = findPageName(
 | 
						|
      name,
 | 
						|
      layout: layout,
 | 
						|
      parentName: parentName,
 | 
						|
      parentLayout: parentLayout,
 | 
						|
    );
 | 
						|
    expect(pageName, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Expect not to see the page name on the home page.
 | 
						|
  void expectNotToSeePageName(
 | 
						|
    String name, {
 | 
						|
    String? parentName,
 | 
						|
    ViewLayoutPB layout = ViewLayoutPB.Document,
 | 
						|
    ViewLayoutPB parentLayout = ViewLayoutPB.Document,
 | 
						|
  }) {
 | 
						|
    final pageName = findPageName(
 | 
						|
      name,
 | 
						|
      layout: layout,
 | 
						|
      parentName: parentName,
 | 
						|
      parentLayout: parentLayout,
 | 
						|
    );
 | 
						|
    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.text == LocaleKeys.settings_files_exportFileSuccess.tr(),
 | 
						|
    );
 | 
						|
    expect(exportSuccess, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Expect to see the add button and icon button in the cover toolbar
 | 
						|
  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 document header toolbar empty
 | 
						|
  void expectToSeeEmptyDocumentHeaderToolbar() {
 | 
						|
    final addCover = find.textContaining(
 | 
						|
      LocaleKeys.document_plugins_cover_addCover.tr(),
 | 
						|
    );
 | 
						|
    final addIcon = find.textContaining(
 | 
						|
      LocaleKeys.document_plugins_cover_addIcon.tr(),
 | 
						|
    );
 | 
						|
    expect(addCover, findsNothing);
 | 
						|
    expect(addIcon, findsNothing);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectToSeeDocumentIcon(String? emoji) {
 | 
						|
    if (emoji == null) {
 | 
						|
      final iconWidget = find.byType(EmojiIconWidget);
 | 
						|
      expect(iconWidget, findsNothing);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    final iconWidget = find.byWidgetPredicate(
 | 
						|
      (widget) => widget is EmojiIconWidget && widget.emoji == emoji,
 | 
						|
    );
 | 
						|
    expect(iconWidget, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectDocumentIconNotNull() {
 | 
						|
    final iconWidget = find.byWidgetPredicate(
 | 
						|
      (widget) => widget is EmojiIconWidget && widget.emoji.isNotEmpty,
 | 
						|
    );
 | 
						|
    expect(iconWidget, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectToSeeDocumentCover(CoverType type) {
 | 
						|
    final findCover = find.byWidgetPredicate(
 | 
						|
      (widget) => widget is DocumentCover && widget.coverType == type,
 | 
						|
    );
 | 
						|
    expect(findCover, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectToSeeNoDocumentCover() {
 | 
						|
    final findCover = find.byType(DocumentCover);
 | 
						|
    expect(findCover, findsNothing);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectChangeCoverAndDeleteButton() {
 | 
						|
    final findChangeCover = find.text(
 | 
						|
      LocaleKeys.document_plugins_cover_changeCover.tr(),
 | 
						|
    );
 | 
						|
    final findRemoveIcon = find.byType(DeleteCoverButton);
 | 
						|
    expect(findChangeCover, findsOneWidget);
 | 
						|
    expect(findRemoveIcon, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Expect to see the user name on the home page
 | 
						|
  void expectToSeeUserName(String name) {
 | 
						|
    final userName = find.byWidgetPredicate(
 | 
						|
      (widget) => widget is FlowyText && widget.text == name,
 | 
						|
    );
 | 
						|
    expect(userName, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Expect to see a text
 | 
						|
  void expectToSeeText(String text) {
 | 
						|
    Finder textWidget = find.textContaining(text, findRichText: true);
 | 
						|
    if (textWidget.evaluate().isEmpty) {
 | 
						|
      textWidget = find.byWidgetPredicate(
 | 
						|
        (widget) => widget is FlowyText && widget.text == text,
 | 
						|
      );
 | 
						|
    }
 | 
						|
    expect(textWidget, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  /// Find if the page is favorite
 | 
						|
  Finder findFavoritePageName(
 | 
						|
    String name, {
 | 
						|
    ViewLayoutPB layout = ViewLayoutPB.Document,
 | 
						|
    String? parentName,
 | 
						|
    ViewLayoutPB parentLayout = ViewLayoutPB.Document,
 | 
						|
  }) {
 | 
						|
    return find.byWidgetPredicate(
 | 
						|
      (widget) =>
 | 
						|
          widget is SingleInnerViewItem &&
 | 
						|
          widget.view.isFavorite &&
 | 
						|
          widget.categoryType == FolderCategoryType.favorite &&
 | 
						|
          widget.view.name == name &&
 | 
						|
          widget.view.layout == layout,
 | 
						|
      skipOffstage: false,
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  Finder findAllFavoritePages() {
 | 
						|
    return find.byWidgetPredicate(
 | 
						|
      (widget) =>
 | 
						|
          widget is SingleInnerViewItem &&
 | 
						|
          widget.view.isFavorite &&
 | 
						|
          widget.categoryType == FolderCategoryType.favorite,
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  Finder findPageName(
 | 
						|
    String name, {
 | 
						|
    ViewLayoutPB layout = ViewLayoutPB.Document,
 | 
						|
    String? parentName,
 | 
						|
    ViewLayoutPB parentLayout = ViewLayoutPB.Document,
 | 
						|
  }) {
 | 
						|
    if (parentName == null) {
 | 
						|
      return find.byWidgetPredicate(
 | 
						|
        (widget) =>
 | 
						|
            widget is SingleInnerViewItem &&
 | 
						|
            widget.view.name == name &&
 | 
						|
            widget.view.layout == layout,
 | 
						|
        skipOffstage: false,
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    return find.descendant(
 | 
						|
      of: find.byWidgetPredicate(
 | 
						|
        (widget) =>
 | 
						|
            widget is InnerViewItem &&
 | 
						|
            widget.view.name == parentName &&
 | 
						|
            widget.view.layout == parentLayout,
 | 
						|
        skipOffstage: false,
 | 
						|
      ),
 | 
						|
      matching: findPageName(name, layout: layout),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  void expectViewHasIcon(String name, ViewLayoutPB layout, String emoji) {
 | 
						|
    final pageName = findPageName(
 | 
						|
      name,
 | 
						|
      layout: layout,
 | 
						|
    );
 | 
						|
    final icon = find.descendant(
 | 
						|
      of: pageName,
 | 
						|
      matching: find.text(emoji),
 | 
						|
    );
 | 
						|
    expect(icon, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectViewTitleHasIcon(String name, ViewLayoutPB layout, String emoji) {
 | 
						|
    final icon = find.descendant(
 | 
						|
      of: find.byType(ViewTitleBar),
 | 
						|
      matching: find.text(emoji),
 | 
						|
    );
 | 
						|
    expect(icon, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectSelectedReminder(ReminderOption option) {
 | 
						|
    final findSelectedText = find.descendant(
 | 
						|
      of: find.byType(ReminderSelector),
 | 
						|
      matching: find.text(option.label),
 | 
						|
    );
 | 
						|
 | 
						|
    expect(findSelectedText, findsOneWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  void expectNotificationItems(int amount) {
 | 
						|
    final findItems = find.byType(NotificationItem);
 | 
						|
 | 
						|
    expect(findItems, findsNWidgets(amount));
 | 
						|
  }
 | 
						|
 | 
						|
  void expectToSeeRowDetailsPageDialog() {
 | 
						|
    expect(
 | 
						|
      find.descendant(
 | 
						|
        of: find.byType(RowDetailPage),
 | 
						|
        matching: find.byType(SimpleDialog),
 | 
						|
      ),
 | 
						|
      findsOneWidget,
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |