Skip to content

Commit c870dbe

Browse files
authored
test: add more cover integration tests (#2922)
1 parent 3acd36e commit c870dbe

File tree

6 files changed

+83
-55
lines changed

6 files changed

+83
-55
lines changed

frontend/appflowy_flutter/integration_test/document/cover_image_test.dart

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,27 @@ void main() {
3636

3737
// Insert a document cover
3838
await tester.editor.tapOnAddCover();
39-
tester.expectToSeeDocumentCover(
40-
CoverType.asset,
41-
"assets/images/app_flowy_abstract_cover_1.jpg",
42-
);
39+
tester.expectToSeeDocumentCover(CoverType.asset);
4340

4441
// Hover over the cover to show the 'Change Cover' and delete buttons
4542
await tester.editor.hoverOnCover();
4643
tester.expectChangeCoverAndDeleteButton();
4744

4845
// Change cover to a solid color background
49-
await tester.editor.hoverOnCover();
5046
await tester.editor.tapOnChangeCover();
5147
await tester.editor.switchSolidColorBackground();
5248
await tester.editor.dismissCoverPicker();
53-
tester.expectToSeeDocumentCover(CoverType.color, "ffe8e0ff");
49+
tester.expectToSeeDocumentCover(CoverType.color);
50+
51+
// Change cover to a network image
52+
const imageUrl =
53+
"https://raw.githubusercontent.com/AppFlowy-IO/AppFlowy/main/frontend/appflowy_flutter/assets/images/appflowy_launch_splash.jpg";
54+
await tester.editor.hoverOnCover();
55+
await tester.editor.tapOnChangeCover();
56+
await tester.editor.addNetworkImageCover(imageUrl);
57+
await tester.editor.switchNetworkImageCover(imageUrl);
58+
await tester.editor.dismissCoverPicker();
59+
tester.expectToSeeDocumentCover(CoverType.file);
5460

5561
// Remove the cover
5662
await tester.editor.hoverOnCover();
@@ -119,10 +125,7 @@ void main() {
119125

120126
// Expect to see the icon and cover at the same time
121127
tester.expectToSeeDocumentIcon('😀');
122-
tester.expectToSeeDocumentCover(
123-
CoverType.asset,
124-
"assets/images/app_flowy_abstract_cover_1.jpg",
125-
);
128+
tester.expectToSeeDocumentCover(CoverType.asset);
126129

127130
// Hover over the cover toolbar and see that neither icons are shown
128131
await tester.editor.hoverOnCoverToolbar();

frontend/appflowy_flutter/integration_test/util/editor_test_operations.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import 'dart:ui';
22

33
import 'package:appflowy/generated/locale_keys.g.dart';
44
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/cover_editor.dart';
5+
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/custom_cover_picker.dart';
56
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/document_header_node_widget.dart';
67
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/emoji_icon_widget.dart';
78
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/emoji_popover.dart';
89
import 'package:appflowy_editor/appflowy_editor.dart' hide Log;
910
import 'package:easy_localization/easy_localization.dart';
11+
import 'package:flutter/material.dart';
1012
import 'package:flutter/services.dart';
1113
import 'package:flutter_test/flutter_test.dart';
1214

@@ -91,6 +93,30 @@ class EditorOperations {
9193
await tester.tapButton(findPurpleButton);
9294
}
9395

96+
Future<void> addNetworkImageCover(String imageUrl) async {
97+
final findNewImageButton = find.byType(NewCustomCoverButton);
98+
await tester.tapButton(findNewImageButton);
99+
100+
final imageUrlTextField = find.descendant(
101+
of: find.byType(NetworkImageUrlInput),
102+
matching: find.byType(TextField),
103+
);
104+
await tester.enterText(imageUrlTextField, imageUrl);
105+
await tester.tapButtonWithName(
106+
LocaleKeys.document_plugins_cover_add.tr(),
107+
);
108+
await tester.tapButtonWithName(
109+
LocaleKeys.document_plugins_cover_saveToGallery.tr(),
110+
);
111+
}
112+
113+
Future<void> switchNetworkImageCover(String imageUrl) async {
114+
final image = find.byWidgetPredicate(
115+
(widget) => widget is ImageGridItem,
116+
);
117+
await tester.tapButton(image);
118+
}
119+
94120
Future<void> tapOnRemoveCover() async {
95121
await tester.tapButton(find.byType(DeleteCoverButton));
96122
}

frontend/appflowy_flutter/integration_test/util/expectation.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,9 @@ extension Expectation on WidgetTester {
8585
expect(iconWidget, findsOneWidget);
8686
}
8787

88-
void expectToSeeDocumentCover(CoverType type, String details) {
88+
void expectToSeeDocumentCover(CoverType type) {
8989
final findCover = find.byWidgetPredicate(
90-
(widget) =>
91-
widget is DocumentCover &&
92-
widget.coverType == type &&
93-
widget.coverDetails == details,
90+
(widget) => widget is DocumentCover && widget.coverType == type,
9491
);
9592
expect(findCover, findsOneWidget);
9693
}

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/header/cover_editor.dart

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:flowy_infra/theme_extension.dart';
1111
import 'package:flowy_infra_ui/style_widget/button.dart';
1212
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
1313
import 'package:flowy_infra_ui/style_widget/text.dart';
14+
import 'package:flowy_infra_ui/widget/spacing.dart';
1415
import 'package:flutter/material.dart';
1516
import 'package:flutter_bloc/flutter_bloc.dart';
1617

@@ -83,7 +84,7 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
8384
child: BlocBuilder<ChangeCoverPopoverBloc, ChangeCoverPopoverState>(
8485
builder: (context, state) {
8586
return Padding(
86-
padding: const EdgeInsets.all(15),
87+
padding: const EdgeInsets.all(12),
8788
child: SingleChildScrollView(
8889
child: isAddingImage
8990
? CoverImagePicker(
@@ -116,18 +117,18 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
116117
LocaleKeys.document_plugins_cover_colors.tr(),
117118
color: Theme.of(context).colorScheme.tertiary,
118119
),
119-
const SizedBox(height: 10),
120+
const VSpace(10),
120121
_buildColorPickerList(),
121-
const SizedBox(height: 10),
122+
const VSpace(10),
122123
_buildImageHeader(),
123-
const SizedBox(height: 10),
124+
const VSpace(10),
124125
_buildFileImagePicker(),
125-
const SizedBox(height: 10),
126+
const VSpace(10),
126127
FlowyText.semibold(
127128
LocaleKeys.document_plugins_cover_abstract.tr(),
128129
color: Theme.of(context).colorScheme.tertiary,
129130
),
130-
const SizedBox(height: 10),
131+
const VSpace(10),
131132
_buildAbstractImagePicker(),
132133
],
133134
);
@@ -249,27 +250,9 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
249250
itemCount: images.length + 1,
250251
itemBuilder: (BuildContext ctx, index) {
251252
if (index == 0) {
252-
return Container(
253-
decoration: BoxDecoration(
254-
border: Border.all(
255-
color: Theme.of(context).colorScheme.primary,
256-
),
257-
borderRadius: Corners.s8Border,
258-
),
259-
child: FlowyIconButton(
260-
iconPadding: EdgeInsets.zero,
261-
icon: Icon(
262-
Icons.add,
263-
color: Theme.of(context).colorScheme.primary,
264-
),
265-
hoverColor:
266-
Theme.of(context).colorScheme.primary.withOpacity(0.15),
267-
width: 20,
268-
onPressed: () {
269-
setState(() {
270-
isAddingImage = true;
271-
});
272-
},
253+
return NewCustomCoverButton(
254+
onPressed: () => setState(
255+
() => isAddingImage = true,
273256
),
274257
);
275258
}
@@ -328,6 +311,32 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
328311
}
329312
}
330313

314+
@visibleForTesting
315+
class NewCustomCoverButton extends StatelessWidget {
316+
final VoidCallback onPressed;
317+
const NewCustomCoverButton({super.key, required this.onPressed});
318+
319+
@override
320+
Widget build(BuildContext context) {
321+
return Container(
322+
decoration: BoxDecoration(
323+
border: Border.all(
324+
color: Theme.of(context).colorScheme.primary,
325+
),
326+
borderRadius: Corners.s8Border,
327+
),
328+
child: FlowyIconButton(
329+
icon: Icon(
330+
Icons.add,
331+
color: Theme.of(context).colorScheme.primary,
332+
),
333+
hoverColor: Theme.of(context).colorScheme.primary.withOpacity(0.15),
334+
onPressed: onPressed,
335+
),
336+
);
337+
}
338+
}
339+
331340
class DeleteImageAlertDialog extends StatelessWidget {
332341
const DeleteImageAlertDialog({
333342
Key? key,

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/header/custom_cover_picker.dart

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
33
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/custom_cover_picker_bloc.dart';
44
import 'package:easy_localization/easy_localization.dart';
55
import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
6+
import 'package:flowy_infra_ui/widget/spacing.dart';
67
import 'package:flutter_bloc/flutter_bloc.dart';
78

89
import 'package:flowy_infra/image.dart';
@@ -67,17 +68,13 @@ class _CoverImagePickerState extends State<CoverImagePicker> {
6768
),
6869
)
6970
: CoverImagePreviewWidget(state: state),
70-
const SizedBox(
71-
height: 10,
72-
),
71+
const VSpace(10),
7372
NetworkImageUrlInput(
7473
onAdd: (url) {
7574
context.read<CoverImagePickerBloc>().add(UrlSubmit(url));
7675
},
7776
),
78-
const SizedBox(
79-
height: 10,
80-
),
77+
const VSpace(10),
8178
ImagePickerActionButtons(
8279
onBackPressed: () {
8380
widget.onBackPressed();
@@ -233,16 +230,12 @@ class _CoverImagePreviewWidgetState extends State<CoverImagePreviewWidget> {
233230
),
234231
],
235232
),
236-
const SizedBox(
237-
height: 10,
238-
),
233+
const VSpace(10),
239234
FlowyText(
240235
LocaleKeys.document_plugins_cover_or.tr(),
241236
fontWeight: FontWeight.w300,
242237
),
243-
const SizedBox(
244-
height: 10,
245-
),
238+
const VSpace(10),
246239
FlowyButton(
247240
hoverColor: Theme.of(context).hoverColor,
248241
onTap: () {

frontend/appflowy_flutter/packages/flowy_infra_ui/lib/style_widget/icon_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class FlowyIconButton extends StatelessWidget {
7878
onPressed: onPressed,
7979
child: FlowyHover(
8080
style: HoverStyle(
81-
hoverColor: hoverColor,
81+
hoverColor: Colors.transparent,
8282
foregroundColorOnHover:
8383
iconColorOnHover ?? Theme.of(context).iconTheme.color,
8484
backgroundColor: Colors.transparent,

0 commit comments

Comments
 (0)