From f2a847ad58f4a642cd162431c4d2ec8dc1415731 Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Wed, 9 Aug 2023 16:38:33 -0700 Subject: [PATCH] action_sheet tests: Cover "Share" button --- test/test_share_plus.dart | 21 ++++++++++ test/widgets/action_sheet_test.dart | 59 +++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 test/test_share_plus.dart diff --git a/test/test_share_plus.dart b/test/test_share_plus.dart new file mode 100644 index 0000000000..3855a9b8e7 --- /dev/null +++ b/test/test_share_plus.dart @@ -0,0 +1,21 @@ +import 'package:flutter/services.dart'; + +class MockSharePlus { + MockSharePlus(); + + /// The last string that `shareWithResult` was called with. + String? sharedString; + + Future handleMethodCall(MethodCall methodCall) async { + switch (methodCall.method) { + case 'shareWithResult': + // The method channel doesn't preserve Map as + // `arguments`'s type; logging runtimeType gives _Map. + final arguments = methodCall.arguments as Map; + sharedString = arguments['text'] as String; + return 'some-success-response'; + default: + throw UnimplementedError(); + } + } +} diff --git a/test/widgets/action_sheet_test.dart b/test/widgets/action_sheet_test.dart index 64c4c2cd5b..9af0bcca68 100644 --- a/test/widgets/action_sheet_test.dart +++ b/test/widgets/action_sheet_test.dart @@ -12,6 +12,7 @@ import 'package:zulip/widgets/compose_box.dart'; import 'package:zulip/widgets/content.dart'; import 'package:zulip/widgets/message_list.dart'; import 'package:zulip/widgets/store.dart'; +import 'package:share_plus_platform_interface/method_channel/method_channel_share.dart'; import '../api/fake_api.dart'; import '../example_data.dart' as eg; @@ -19,6 +20,7 @@ import '../flutter_checks.dart'; import '../model/binding.dart'; import '../model/test_store.dart'; import '../test_clipboard.dart'; +import '../test_share_plus.dart'; import 'compose_box_checks.dart'; import 'dialog_checks.dart'; @@ -88,6 +90,63 @@ void main() { (store.connection as FakeApiConnection).prepare(httpStatus: 400, json: fakeResponseJson); } + group('ShareButton', () { + // Tests should call setupMockSharePlus. + setUp(() async { + TestZulipBinding.ensureInitialized(); + TestWidgetsFlutterBinding.ensureInitialized(); + }); + + MockSharePlus setupMockSharePlus() { + final mock = MockSharePlus(); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler( + MethodChannelShare.channel, + mock.handleMethodCall, + ); + return mock; + } + + tearDown(() async { + TestZulipBinding.instance.reset(); + }); + + Future tapShareButton(WidgetTester tester) async { + await tester.ensureVisible(find.byIcon(Icons.adaptive.share, skipOffstage: false)); + await tester.tap(find.byIcon(Icons.adaptive.share)); + await tester.pump(); // [MenuItemButton.onPressed] called in a post-frame callback: flutter/flutter@e4a39fa2e + } + + testWidgets('success', (WidgetTester tester) async { + final mockSharePlus = setupMockSharePlus(); + final message = eg.streamMessage(); + await setupToMessageActionSheet(tester, message: message, narrow: TopicNarrow.ofMessage(message)); + final store = await testBinding.globalStore.perAccount(eg.selfAccount.id); + + prepareRawContentResponseSuccess(store, message: message, rawContent: 'Hello world'); + await tapShareButton(tester); + await tester.pump(Duration.zero); + check(mockSharePlus.sharedString).equals('Hello world'); + }); + + testWidgets('request has an error', (WidgetTester tester) async { + final mockSharePlus = setupMockSharePlus(); + final message = eg.streamMessage(); + await setupToMessageActionSheet(tester, message: message, narrow: TopicNarrow.ofMessage(message)); + final store = await testBinding.globalStore.perAccount(eg.selfAccount.id); + + prepareRawContentResponseError(store); + await tapShareButton(tester); + await tester.pump(Duration.zero); // error arrives; error dialog shows + + await tester.tap(find.byWidget(checkErrorDialog(tester, + expectedTitle: 'Sharing failed', + expectedMessage: 'That message does not seem to exist.', + ))); + + check(mockSharePlus.sharedString).isNull(); + }); + }); + group('QuoteAndReplyButton', () { ComposeBoxController? findComposeBoxController(WidgetTester tester) { return tester.widget(find.byType(ComposeBox))