| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  | import 'package:appflowy/plugins/database_view/widgets/row/row_banner.dart'; | 
					
						
							|  |  |  | import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pbenum.dart'; | 
					
						
							|  |  |  | import 'package:appflowy_editor/appflowy_editor.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/style_widget/text.dart'; | 
					
						
							|  |  |  | import 'package:flutter_test/flutter_test.dart'; | 
					
						
							|  |  |  | import 'package:integration_test/integration_test.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'util/database_test_op.dart'; | 
					
						
							| 
									
										
										
										
											2023-06-27 15:17:51 +08:00
										 |  |  | import 'util/emoji.dart'; | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  | import 'util/ime.dart'; | 
					
						
							|  |  |  | import 'util/util.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void main() { | 
					
						
							|  |  |  |   IntegrationTestWidgetsFlutterBinding.ensureInitialized(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   group('grid', () { | 
					
						
							| 
									
										
										
										
											2023-06-22 23:40:49 +08:00
										 |  |  |     testWidgets('row details page opens', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Make sure that the row page is opened
 | 
					
						
							|  |  |  |       tester.assertRowDetailPageOpened(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |     testWidgets('insert emoji in the row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.hoverRowBanner(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.openEmojiPicker(); | 
					
						
							|  |  |  |       await tester.switchToEmojiList(); | 
					
						
							|  |  |  |       await tester.tapEmoji('😀'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // After select the emoji, the EmojiButton will show up
 | 
					
						
							|  |  |  |       await tester.tapButton(find.byType(EmojiButton)); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('update emoji in the row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  |       await tester.hoverRowBanner(); | 
					
						
							|  |  |  |       await tester.openEmojiPicker(); | 
					
						
							|  |  |  |       await tester.switchToEmojiList(); | 
					
						
							|  |  |  |       await tester.tapEmoji('😀'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Update existing selected emoji
 | 
					
						
							|  |  |  |       await tester.tapButton(find.byType(EmojiButton)); | 
					
						
							|  |  |  |       await tester.switchToEmojiList(); | 
					
						
							|  |  |  |       await tester.tapEmoji('😅'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The emoji already displayed in the row banner
 | 
					
						
							|  |  |  |       final emojiText = find.byWidgetPredicate( | 
					
						
							| 
									
										
										
										
											2023-06-16 15:32:28 +08:00
										 |  |  |         (widget) => widget is FlowyText && widget.text == '😅', | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The number of emoji should be two. One in the row displayed in the grid
 | 
					
						
							|  |  |  |       // one in the row detail page.
 | 
					
						
							|  |  |  |       expect(emojiText, findsNWidgets(2)); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('remove emoji in the row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  |       await tester.hoverRowBanner(); | 
					
						
							|  |  |  |       await tester.openEmojiPicker(); | 
					
						
							|  |  |  |       await tester.switchToEmojiList(); | 
					
						
							|  |  |  |       await tester.tapEmoji('😀'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Remove the emoji
 | 
					
						
							|  |  |  |       await tester.tapButton(find.byType(RemoveEmojiButton)); | 
					
						
							|  |  |  |       final emojiText = find.byWidgetPredicate( | 
					
						
							| 
									
										
										
										
											2023-06-16 15:32:28 +08:00
										 |  |  |         (widget) => widget is FlowyText && widget.text == '😀', | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |       ); | 
					
						
							|  |  |  |       expect(emojiText, findsNothing); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('create list of fields in row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       for (final fieldType in [ | 
					
						
							|  |  |  |         FieldType.Checklist, | 
					
						
							|  |  |  |         FieldType.DateTime, | 
					
						
							|  |  |  |         FieldType.Number, | 
					
						
							|  |  |  |         FieldType.URL, | 
					
						
							|  |  |  |         FieldType.MultiSelect, | 
					
						
							|  |  |  |         FieldType.LastEditedTime, | 
					
						
							|  |  |  |         FieldType.CreatedTime, | 
					
						
							|  |  |  |         FieldType.Checkbox, | 
					
						
							|  |  |  |       ]) { | 
					
						
							|  |  |  |         await tester.tapRowDetailPageCreatePropertyButton(); | 
					
						
							|  |  |  |         await tester.renameField(fieldType.name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Open the type option menu
 | 
					
						
							|  |  |  |         await tester.tapTypeOptionButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         await tester.selectFieldType(fieldType); | 
					
						
							|  |  |  |         await tester.dismissFieldEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // After update the field type, the cells should be updated
 | 
					
						
							|  |  |  |         await tester.findCellByFieldType(fieldType); | 
					
						
							|  |  |  |         await tester.scrollRowDetailByOffset(const Offset(0, -50)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('check document is exist in row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Each row detail page should have a document
 | 
					
						
							|  |  |  |       await tester.assertDocumentExistInRowDetailPage(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('update the content of the document and re-open it', | 
					
						
							|  |  |  |         (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Wait for the document to be loaded
 | 
					
						
							|  |  |  |       await tester.wait(500); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Focus on the editor
 | 
					
						
							|  |  |  |       final textBlock = find.byType(TextBlockComponentWidget); | 
					
						
							|  |  |  |       await tester.tapAt(tester.getCenter(textBlock)); | 
					
						
							| 
									
										
										
										
											2023-07-09 10:03:22 +07:00
										 |  |  |       await tester.pumpAndSettle(); | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Input some text
 | 
					
						
							| 
									
										
										
										
											2023-07-09 10:03:22 +07:00
										 |  |  |       const inputText = 'Hello World'; | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |       await tester.ime.insertText(inputText); | 
					
						
							|  |  |  |       expect( | 
					
						
							|  |  |  |         find.textContaining(inputText, findRichText: true), | 
					
						
							|  |  |  |         findsOneWidget, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Tap outside to dismiss the field
 | 
					
						
							|  |  |  |       await tester.tapAt(Offset.zero); | 
					
						
							|  |  |  |       await tester.pumpAndSettle(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Re-open the document
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  |       expect( | 
					
						
							|  |  |  |         find.textContaining(inputText, findRichText: true), | 
					
						
							|  |  |  |         findsOneWidget, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('delete row in row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.tapRowDetailPageDeleteRowButton(); | 
					
						
							|  |  |  |       await tester.tapEscButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.assertNumberOfRowsInGridPage(2); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testWidgets('duplicate row in row detail page', (tester) async { | 
					
						
							|  |  |  |       await tester.initializeAppFlowy(); | 
					
						
							|  |  |  |       await tester.tapGoButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create a new grid
 | 
					
						
							|  |  |  |       await tester.tapAddButton(); | 
					
						
							|  |  |  |       await tester.tapCreateGridButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Hover first row and then open the row page
 | 
					
						
							|  |  |  |       await tester.openFirstRowDetailPage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.tapRowDetailPageDuplicateRowButton(); | 
					
						
							|  |  |  |       await tester.tapEscButton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await tester.assertNumberOfRowsInGridPage(4); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |