sidebar_favorites_test.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import 'package:appflowy/workspace/application/sidebar/folder/folder_bloc.dart';
  2. import 'package:appflowy/workspace/presentation/home/menu/sidebar/folder/favorite_folder.dart';
  3. import 'package:appflowy/workspace/presentation/home/menu/view/view_item.dart';
  4. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  5. import 'package:appflowy_popover/appflowy_popover.dart';
  6. import 'package:flowy_infra_ui/style_widget/hover.dart';
  7. import 'package:flutter_test/flutter_test.dart';
  8. import 'package:integration_test/integration_test.dart';
  9. import '../util/base.dart';
  10. import '../util/common_operations.dart';
  11. import '../util/expectation.dart';
  12. void main() {
  13. IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  14. group('Favorites', () {
  15. testWidgets(
  16. 'Toggle favorites for views creates / removes the favorite header along with favorite views',
  17. (tester) async {
  18. await tester.initializeAppFlowy();
  19. await tester.tapGoButton();
  20. // no favorite folder
  21. expect(find.byType(FavoriteFolder), findsNothing);
  22. // create the nested views
  23. final names = [
  24. 1,
  25. 2,
  26. ].map((e) => 'document_$e').toList();
  27. for (var i = 0; i < names.length; i++) {
  28. final parentName = i == 0 ? gettingStated : names[i - 1];
  29. await tester.createNewPageWithName(
  30. name: names[i],
  31. parentName: parentName,
  32. layout: ViewLayoutPB.Document,
  33. );
  34. tester.expectToSeePageName(
  35. names[i],
  36. parentName: parentName,
  37. layout: ViewLayoutPB.Document,
  38. parentLayout: ViewLayoutPB.Document,
  39. );
  40. }
  41. await tester.favoriteViewByName(gettingStated);
  42. expect(
  43. tester.findFavoritePageName(gettingStated),
  44. findsOneWidget,
  45. );
  46. await tester.favoriteViewByName(names[1]);
  47. expect(
  48. tester.findFavoritePageName(names[1]),
  49. findsNWidgets(2),
  50. );
  51. await tester.unfavoriteViewByName(gettingStated);
  52. expect(
  53. tester.findFavoritePageName(gettingStated),
  54. findsNothing,
  55. );
  56. expect(
  57. tester.findFavoritePageName(
  58. names[1],
  59. ),
  60. findsOneWidget,
  61. );
  62. await tester.unfavoriteViewByName(names[1]);
  63. expect(
  64. tester.findFavoritePageName(
  65. names[1],
  66. ),
  67. findsNothing,
  68. );
  69. });
  70. testWidgets(
  71. 'renaming a favorite view updates name under favorite header',
  72. (tester) async {
  73. await tester.initializeAppFlowy();
  74. await tester.tapGoButton();
  75. const name = 'test';
  76. await tester.favoriteViewByName(gettingStated);
  77. await tester.hoverOnPageName(
  78. gettingStated,
  79. layout: ViewLayoutPB.Document,
  80. onHover: () async {
  81. await tester.renamePage(name);
  82. await tester.pumpAndSettle();
  83. },
  84. );
  85. expect(
  86. tester.findPageName(name),
  87. findsNWidgets(2),
  88. );
  89. expect(
  90. tester.findFavoritePageName(name),
  91. findsNothing,
  92. );
  93. },
  94. );
  95. testWidgets(
  96. 'deleting first level favorite view removes its instance from favorite header, deleting root level views leads to removal of all favorites that are its children',
  97. (tester) async {
  98. await tester.initializeAppFlowy();
  99. await tester.tapGoButton();
  100. final names = [1, 2].map((e) => 'document_$e').toList();
  101. for (var i = 0; i < names.length; i++) {
  102. final parentName = i == 0 ? gettingStated : names[i - 1];
  103. await tester.createNewPageWithName(
  104. name: names[i],
  105. parentName: parentName,
  106. layout: ViewLayoutPB.Document,
  107. );
  108. tester.expectToSeePageName(names[i], parentName: parentName);
  109. }
  110. await tester.favoriteViewByName(gettingStated);
  111. await tester.favoriteViewByName(names[0]);
  112. await tester.favoriteViewByName(names[1]);
  113. expect(
  114. find.byWidgetPredicate(
  115. (widget) =>
  116. widget is ViewItem &&
  117. widget.view.isFavorite &&
  118. widget.categoryType == FolderCategoryType.favorite,
  119. ),
  120. findsNWidgets(6),
  121. );
  122. await tester.hoverOnPageName(
  123. names[1],
  124. layout: ViewLayoutPB.Document,
  125. onHover: () async {
  126. await tester.tapDeletePageButton();
  127. await tester.pumpAndSettle();
  128. },
  129. );
  130. expect(
  131. find.byWidgetPredicate(
  132. (widget) =>
  133. widget is ViewItem &&
  134. widget.view.isFavorite &&
  135. widget.categoryType == FolderCategoryType.favorite,
  136. ),
  137. findsNWidgets(3),
  138. );
  139. await tester.hoverOnPageName(
  140. gettingStated,
  141. layout: ViewLayoutPB.Document,
  142. onHover: () async {
  143. await tester.tapDeletePageButton();
  144. await tester.pumpAndSettle();
  145. },
  146. );
  147. expect(
  148. find.byWidgetPredicate(
  149. (widget) =>
  150. widget is ViewItem &&
  151. widget.view.isFavorite &&
  152. widget.categoryType == FolderCategoryType.favorite,
  153. ),
  154. findsNothing,
  155. );
  156. },
  157. );
  158. testWidgets(
  159. 'view selection is synced between favorites and personal folder',
  160. (tester) async {
  161. await tester.initializeAppFlowy();
  162. await tester.tapGoButton();
  163. await tester.createNewPageWithName();
  164. await tester.favoriteViewByName(gettingStated);
  165. expect(
  166. find.byWidgetPredicate(
  167. (widget) =>
  168. widget is FlowyHover &&
  169. widget.isSelected != null &&
  170. widget.isSelected!(),
  171. ),
  172. findsNWidgets(2),
  173. );
  174. },
  175. );
  176. testWidgets(
  177. 'context menu opens up for favorites',
  178. (tester) async {
  179. await tester.initializeAppFlowy();
  180. await tester.tapGoButton();
  181. await tester.createNewPageWithName();
  182. await tester.favoriteViewByName(gettingStated);
  183. await tester.hoverOnPageName(
  184. gettingStated,
  185. layout: ViewLayoutPB.Document,
  186. useLast: false,
  187. onHover: () async {
  188. await tester.tapPageOptionButton();
  189. await tester.pumpAndSettle();
  190. expect(
  191. find.byType(PopoverContainer),
  192. findsOneWidget,
  193. );
  194. },
  195. );
  196. await tester.pumpAndSettle();
  197. },
  198. );
  199. });
  200. }