mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
test: add more cover integration tests (#2922)
This commit is contained in:
@ -36,21 +36,27 @@ void main() {
|
|||||||
|
|
||||||
// Insert a document cover
|
// Insert a document cover
|
||||||
await tester.editor.tapOnAddCover();
|
await tester.editor.tapOnAddCover();
|
||||||
tester.expectToSeeDocumentCover(
|
tester.expectToSeeDocumentCover(CoverType.asset);
|
||||||
CoverType.asset,
|
|
||||||
"assets/images/app_flowy_abstract_cover_1.jpg",
|
|
||||||
);
|
|
||||||
|
|
||||||
// Hover over the cover to show the 'Change Cover' and delete buttons
|
// Hover over the cover to show the 'Change Cover' and delete buttons
|
||||||
await tester.editor.hoverOnCover();
|
await tester.editor.hoverOnCover();
|
||||||
tester.expectChangeCoverAndDeleteButton();
|
tester.expectChangeCoverAndDeleteButton();
|
||||||
|
|
||||||
// Change cover to a solid color background
|
// Change cover to a solid color background
|
||||||
await tester.editor.hoverOnCover();
|
|
||||||
await tester.editor.tapOnChangeCover();
|
await tester.editor.tapOnChangeCover();
|
||||||
await tester.editor.switchSolidColorBackground();
|
await tester.editor.switchSolidColorBackground();
|
||||||
await tester.editor.dismissCoverPicker();
|
await tester.editor.dismissCoverPicker();
|
||||||
tester.expectToSeeDocumentCover(CoverType.color, "ffe8e0ff");
|
tester.expectToSeeDocumentCover(CoverType.color);
|
||||||
|
|
||||||
|
// Change cover to a network image
|
||||||
|
const imageUrl =
|
||||||
|
"https://raw.githubusercontent.com/AppFlowy-IO/AppFlowy/main/frontend/appflowy_flutter/assets/images/appflowy_launch_splash.jpg";
|
||||||
|
await tester.editor.hoverOnCover();
|
||||||
|
await tester.editor.tapOnChangeCover();
|
||||||
|
await tester.editor.addNetworkImageCover(imageUrl);
|
||||||
|
await tester.editor.switchNetworkImageCover(imageUrl);
|
||||||
|
await tester.editor.dismissCoverPicker();
|
||||||
|
tester.expectToSeeDocumentCover(CoverType.file);
|
||||||
|
|
||||||
// Remove the cover
|
// Remove the cover
|
||||||
await tester.editor.hoverOnCover();
|
await tester.editor.hoverOnCover();
|
||||||
@ -119,10 +125,7 @@ void main() {
|
|||||||
|
|
||||||
// Expect to see the icon and cover at the same time
|
// Expect to see the icon and cover at the same time
|
||||||
tester.expectToSeeDocumentIcon('😀');
|
tester.expectToSeeDocumentIcon('😀');
|
||||||
tester.expectToSeeDocumentCover(
|
tester.expectToSeeDocumentCover(CoverType.asset);
|
||||||
CoverType.asset,
|
|
||||||
"assets/images/app_flowy_abstract_cover_1.jpg",
|
|
||||||
);
|
|
||||||
|
|
||||||
// Hover over the cover toolbar and see that neither icons are shown
|
// Hover over the cover toolbar and see that neither icons are shown
|
||||||
await tester.editor.hoverOnCoverToolbar();
|
await tester.editor.hoverOnCoverToolbar();
|
||||||
|
@ -2,11 +2,13 @@ import 'dart:ui';
|
|||||||
|
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/cover_editor.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/cover_editor.dart';
|
||||||
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/custom_cover_picker.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/document_header_node_widget.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/plugins/document/presentation/editor_plugins/header/emoji_icon_widget.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/emoji_popover.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/emoji_popover.dart';
|
||||||
import 'package:appflowy_editor/appflowy_editor.dart' hide Log;
|
import 'package:appflowy_editor/appflowy_editor.dart' hide Log;
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
@ -91,6 +93,30 @@ class EditorOperations {
|
|||||||
await tester.tapButton(findPurpleButton);
|
await tester.tapButton(findPurpleButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> addNetworkImageCover(String imageUrl) async {
|
||||||
|
final findNewImageButton = find.byType(NewCustomCoverButton);
|
||||||
|
await tester.tapButton(findNewImageButton);
|
||||||
|
|
||||||
|
final imageUrlTextField = find.descendant(
|
||||||
|
of: find.byType(NetworkImageUrlInput),
|
||||||
|
matching: find.byType(TextField),
|
||||||
|
);
|
||||||
|
await tester.enterText(imageUrlTextField, imageUrl);
|
||||||
|
await tester.tapButtonWithName(
|
||||||
|
LocaleKeys.document_plugins_cover_add.tr(),
|
||||||
|
);
|
||||||
|
await tester.tapButtonWithName(
|
||||||
|
LocaleKeys.document_plugins_cover_saveToGallery.tr(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> switchNetworkImageCover(String imageUrl) async {
|
||||||
|
final image = find.byWidgetPredicate(
|
||||||
|
(widget) => widget is ImageGridItem,
|
||||||
|
);
|
||||||
|
await tester.tapButton(image);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> tapOnRemoveCover() async {
|
Future<void> tapOnRemoveCover() async {
|
||||||
await tester.tapButton(find.byType(DeleteCoverButton));
|
await tester.tapButton(find.byType(DeleteCoverButton));
|
||||||
}
|
}
|
||||||
|
@ -85,12 +85,9 @@ extension Expectation on WidgetTester {
|
|||||||
expect(iconWidget, findsOneWidget);
|
expect(iconWidget, findsOneWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expectToSeeDocumentCover(CoverType type, String details) {
|
void expectToSeeDocumentCover(CoverType type) {
|
||||||
final findCover = find.byWidgetPredicate(
|
final findCover = find.byWidgetPredicate(
|
||||||
(widget) =>
|
(widget) => widget is DocumentCover && widget.coverType == type,
|
||||||
widget is DocumentCover &&
|
|
||||||
widget.coverType == type &&
|
|
||||||
widget.coverDetails == details,
|
|
||||||
);
|
);
|
||||||
expect(findCover, findsOneWidget);
|
expect(findCover, findsOneWidget);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import 'package:flowy_infra/theme_extension.dart';
|
|||||||
import 'package:flowy_infra_ui/style_widget/button.dart';
|
import 'package:flowy_infra_ui/style_widget/button.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
|
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||||
|
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
@ -83,7 +84,7 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
|
|||||||
child: BlocBuilder<ChangeCoverPopoverBloc, ChangeCoverPopoverState>(
|
child: BlocBuilder<ChangeCoverPopoverBloc, ChangeCoverPopoverState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(15),
|
padding: const EdgeInsets.all(12),
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: isAddingImage
|
child: isAddingImage
|
||||||
? CoverImagePicker(
|
? CoverImagePicker(
|
||||||
@ -116,18 +117,18 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
|
|||||||
LocaleKeys.document_plugins_cover_colors.tr(),
|
LocaleKeys.document_plugins_cover_colors.tr(),
|
||||||
color: Theme.of(context).colorScheme.tertiary,
|
color: Theme.of(context).colorScheme.tertiary,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
const VSpace(10),
|
||||||
_buildColorPickerList(),
|
_buildColorPickerList(),
|
||||||
const SizedBox(height: 10),
|
const VSpace(10),
|
||||||
_buildImageHeader(),
|
_buildImageHeader(),
|
||||||
const SizedBox(height: 10),
|
const VSpace(10),
|
||||||
_buildFileImagePicker(),
|
_buildFileImagePicker(),
|
||||||
const SizedBox(height: 10),
|
const VSpace(10),
|
||||||
FlowyText.semibold(
|
FlowyText.semibold(
|
||||||
LocaleKeys.document_plugins_cover_abstract.tr(),
|
LocaleKeys.document_plugins_cover_abstract.tr(),
|
||||||
color: Theme.of(context).colorScheme.tertiary,
|
color: Theme.of(context).colorScheme.tertiary,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
const VSpace(10),
|
||||||
_buildAbstractImagePicker(),
|
_buildAbstractImagePicker(),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -249,27 +250,9 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
|
|||||||
itemCount: images.length + 1,
|
itemCount: images.length + 1,
|
||||||
itemBuilder: (BuildContext ctx, index) {
|
itemBuilder: (BuildContext ctx, index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
return Container(
|
return NewCustomCoverButton(
|
||||||
decoration: BoxDecoration(
|
onPressed: () => setState(
|
||||||
border: Border.all(
|
() => isAddingImage = true,
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
|
||||||
borderRadius: Corners.s8Border,
|
|
||||||
),
|
|
||||||
child: FlowyIconButton(
|
|
||||||
iconPadding: EdgeInsets.zero,
|
|
||||||
icon: Icon(
|
|
||||||
Icons.add,
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
|
||||||
hoverColor:
|
|
||||||
Theme.of(context).colorScheme.primary.withOpacity(0.15),
|
|
||||||
width: 20,
|
|
||||||
onPressed: () {
|
|
||||||
setState(() {
|
|
||||||
isAddingImage = true;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -328,6 +311,32 @@ class _ChangeCoverPopoverState extends State<ChangeCoverPopover> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@visibleForTesting
|
||||||
|
class NewCustomCoverButton extends StatelessWidget {
|
||||||
|
final VoidCallback onPressed;
|
||||||
|
const NewCustomCoverButton({super.key, required this.onPressed});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
borderRadius: Corners.s8Border,
|
||||||
|
),
|
||||||
|
child: FlowyIconButton(
|
||||||
|
icon: Icon(
|
||||||
|
Icons.add,
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
),
|
||||||
|
hoverColor: Theme.of(context).colorScheme.primary.withOpacity(0.15),
|
||||||
|
onPressed: onPressed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class DeleteImageAlertDialog extends StatelessWidget {
|
class DeleteImageAlertDialog extends StatelessWidget {
|
||||||
const DeleteImageAlertDialog({
|
const DeleteImageAlertDialog({
|
||||||
Key? key,
|
Key? key,
|
||||||
|
@ -3,6 +3,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
|
|||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/custom_cover_picker_bloc.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/header/custom_cover_picker_bloc.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
|
import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
|
||||||
|
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
import 'package:flowy_infra/image.dart';
|
import 'package:flowy_infra/image.dart';
|
||||||
@ -67,17 +68,13 @@ class _CoverImagePickerState extends State<CoverImagePicker> {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
: CoverImagePreviewWidget(state: state),
|
: CoverImagePreviewWidget(state: state),
|
||||||
const SizedBox(
|
const VSpace(10),
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
NetworkImageUrlInput(
|
NetworkImageUrlInput(
|
||||||
onAdd: (url) {
|
onAdd: (url) {
|
||||||
context.read<CoverImagePickerBloc>().add(UrlSubmit(url));
|
context.read<CoverImagePickerBloc>().add(UrlSubmit(url));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const VSpace(10),
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
ImagePickerActionButtons(
|
ImagePickerActionButtons(
|
||||||
onBackPressed: () {
|
onBackPressed: () {
|
||||||
widget.onBackPressed();
|
widget.onBackPressed();
|
||||||
@ -233,16 +230,12 @@ class _CoverImagePreviewWidgetState extends State<CoverImagePreviewWidget> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const VSpace(10),
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
FlowyText(
|
FlowyText(
|
||||||
LocaleKeys.document_plugins_cover_or.tr(),
|
LocaleKeys.document_plugins_cover_or.tr(),
|
||||||
fontWeight: FontWeight.w300,
|
fontWeight: FontWeight.w300,
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const VSpace(10),
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
FlowyButton(
|
FlowyButton(
|
||||||
hoverColor: Theme.of(context).hoverColor,
|
hoverColor: Theme.of(context).hoverColor,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
@ -78,7 +78,7 @@ class FlowyIconButton extends StatelessWidget {
|
|||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
child: FlowyHover(
|
child: FlowyHover(
|
||||||
style: HoverStyle(
|
style: HoverStyle(
|
||||||
hoverColor: hoverColor,
|
hoverColor: Colors.transparent,
|
||||||
foregroundColorOnHover:
|
foregroundColorOnHover:
|
||||||
iconColorOnHover ?? Theme.of(context).iconTheme.color,
|
iconColorOnHover ?? Theme.of(context).iconTheme.color,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
|
Reference in New Issue
Block a user