document_reminder_test.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import 'package:appflowy/generated/locale_keys.g.dart';
  2. import 'package:appflowy/plugins/document/presentation/editor_plugins/mention/mention_block.dart';
  3. import 'package:appflowy/user/application/user_settings_service.dart';
  4. import 'package:appflowy/workspace/application/settings/date_time/date_format_ext.dart';
  5. import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
  6. import 'package:appflowy_backend/protobuf/flowy-user/date_time.pbenum.dart';
  7. import 'package:appflowy_editor/appflowy_editor.dart';
  8. import 'package:calendar_view/calendar_view.dart';
  9. import 'package:easy_localization/easy_localization.dart';
  10. import 'package:flowy_infra_ui/style_widget/text_field.dart';
  11. import 'package:flutter/services.dart';
  12. import 'package:flutter_test/flutter_test.dart';
  13. import 'package:integration_test/integration_test.dart';
  14. import '../util/base.dart';
  15. import '../util/common_operations.dart';
  16. import '../util/editor_test_operations.dart';
  17. import '../util/keyboard.dart';
  18. void main() {
  19. IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  20. group('Reminder in Document', () {
  21. testWidgets('Add reminder for tomorrow, and include time', (tester) async {
  22. const time = "23:59";
  23. await tester.initializeAppFlowy();
  24. await tester.tapGoButton();
  25. final dateTimeSettings =
  26. await UserSettingsBackendService().getDateTimeSettings();
  27. await tester.editor.tapLineOfEditorAt(0);
  28. await tester.editor.getCurrentEditorState().insertNewLine();
  29. await tester.pumpAndSettle();
  30. // Trigger iline action menu and type 'remind tomorrow'
  31. final tomorrow = await _insertReminderTomorrow(tester);
  32. Node node = tester.editor.getCurrentEditorState().getNodeAtPath([1])!;
  33. Map<String, dynamic> mentionAttr =
  34. node.delta!.first.attributes![MentionBlockKeys.mention];
  35. expect(node.type, 'paragraph');
  36. expect(mentionAttr['type'], MentionType.reminder.name);
  37. expect(mentionAttr['date'], tomorrow.toIso8601String());
  38. await tester.tap(
  39. find.text(dateTimeSettings.dateFormat.formatDate(tomorrow, false)),
  40. );
  41. await tester.pumpAndSettle();
  42. await tester.tap(find.byType(Toggle));
  43. await tester.pumpAndSettle();
  44. await tester.enterText(find.byType(FlowyTextField), time);
  45. // Leave text field to submit
  46. await tester.tap(find.text(LocaleKeys.grid_field_includeTime.tr()));
  47. await tester.pumpAndSettle();
  48. node = tester.editor.getCurrentEditorState().getNodeAtPath([1])!;
  49. mentionAttr = node.delta!.first.attributes![MentionBlockKeys.mention];
  50. final tomorrowWithTime =
  51. _dateWithTime(dateTimeSettings.timeFormat, tomorrow, time);
  52. expect(node.type, 'paragraph');
  53. expect(mentionAttr['type'], MentionType.reminder.name);
  54. expect(mentionAttr['date'], tomorrowWithTime.toIso8601String());
  55. });
  56. });
  57. }
  58. Future<DateTime> _insertReminderTomorrow(WidgetTester tester) async {
  59. await tester.editor.showAtMenu();
  60. await FlowyTestKeyboard.simulateKeyDownEvent(
  61. [
  62. LogicalKeyboardKey.keyR,
  63. LogicalKeyboardKey.keyE,
  64. LogicalKeyboardKey.keyM,
  65. LogicalKeyboardKey.keyI,
  66. LogicalKeyboardKey.keyN,
  67. LogicalKeyboardKey.keyD,
  68. LogicalKeyboardKey.space,
  69. LogicalKeyboardKey.keyT,
  70. LogicalKeyboardKey.keyO,
  71. LogicalKeyboardKey.keyM,
  72. LogicalKeyboardKey.keyO,
  73. LogicalKeyboardKey.keyR,
  74. LogicalKeyboardKey.keyR,
  75. LogicalKeyboardKey.keyO,
  76. LogicalKeyboardKey.keyW,
  77. ],
  78. tester: tester,
  79. );
  80. await FlowyTestKeyboard.simulateKeyDownEvent(
  81. [LogicalKeyboardKey.enter],
  82. tester: tester,
  83. );
  84. return DateTime.now().add(const Duration(days: 1)).withoutTime;
  85. }
  86. DateTime _dateWithTime(UserTimeFormatPB format, DateTime date, String time) {
  87. final t = format == UserTimeFormatPB.TwelveHour
  88. ? DateFormat.jm().parse(time)
  89. : DateFormat.Hm().parse(time);
  90. return DateTime.parse(
  91. '${date.year}${_padZeroLeft(date.month)}${_padZeroLeft(date.day)} ${_padZeroLeft(t.hour)}:${_padZeroLeft(t.minute)}',
  92. );
  93. }
  94. String _padZeroLeft(int a) => a.toString().padLeft(2, '0');