| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';import 'package:appflowy_editor/appflowy_editor.dart';import 'package:flutter/material.dart';import 'package:flutter/services.dart';import 'package:flutter_test/flutter_test.dart';import 'package:integration_test/integration_test.dart';import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';import '../util/util.dart';void main() {  IntegrationTestWidgetsFlutterBinding.ensureInitialized();  group('test editing link in document', () {    late MockUrlLauncher mock;    setUp(() {      mock = MockUrlLauncher();      UrlLauncherPlatform.instance = mock;    });    testWidgets('insert/edit/open link', (tester) async {      await tester.initializeAppFlowy();      await tester.tapGoButton();      // create a new document      await tester.createNewPageWithName(        layout: ViewLayoutPB.Document,      );      // tap the first line of the document      await tester.editor.tapLineOfEditorAt(0);      // insert a inline page      const link = 'AppFlowy';      await tester.ime.insertText(link);      await tester.editor.updateSelection(        Selection.single(path: [0], startOffset: 0, endOffset: link.length),      );      // tap the link button      final linkButton = find.byTooltip(        'Link',      );      await tester.tapButton(linkButton);      expect(find.text('Add your link', findRichText: true), findsOneWidget);      // input the link      const url = 'https://appflowy.io';      final textField = find.byWidgetPredicate(        (widget) => widget is TextField && widget.decoration!.hintText == 'URL',      );      await tester.enterText(textField, url);      await tester.testTextInput.receiveAction(TextInputAction.done);      await tester.pumpAndSettle();      // single-click the link menu to show the menu      await tester.tapButton(find.text(link, findRichText: true));      expect(find.text('Open link', findRichText: true), findsOneWidget);      expect(find.text('Copy link', findRichText: true), findsOneWidget);      expect(find.text('Remove link', findRichText: true), findsOneWidget);      // double-click the link menu to open the link      mock        ..setLaunchExpectations(          url: url,          useSafariVC: false,          useWebView: false,          universalLinksOnly: false,          enableJavaScript: true,          enableDomStorage: true,          headers: <String, String>{},          webOnlyWindowName: null,          launchMode: PreferredLaunchMode.platformDefault,        )        ..setResponse(true);      await tester.simulateKeyEvent(LogicalKeyboardKey.escape);      await tester.doubleTapAt(        tester.getTopLeft(find.text(link, findRichText: true)).translate(5, 5),      );      expect(mock.canLaunchCalled, isTrue);      expect(mock.launchCalled, isTrue);    });  });}
 |