From 8ccaca46b1c044adb47319d06fbeb3172fac9882 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 2 Mar 2021 10:59:18 -0500 Subject: [PATCH] [url_launcher] Migrate unit tests to NNBD Replaces the problematic Mockito mock with a manual mock that handles null and non-null types correctly. Removes the unit test of the example app, since it's not adding any actual coverage. --- .../test/url_launcher_example_test.dart | 52 --- .../url_launcher/url_launcher/pubspec.yaml | 2 +- .../url_launcher/test/link_test.dart | 108 +++--- .../test/mock_url_launcher_platform.dart | 93 ++++++ .../url_launcher/test/url_launcher_test.dart | 309 ++++++++++-------- 5 files changed, 314 insertions(+), 250 deletions(-) delete mode 100644 packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart create mode 100644 packages/url_launcher/url_launcher/test/mock_url_launcher_platform.dart diff --git a/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart b/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart deleted file mode 100644 index a890be7f65f1..000000000000 --- a/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// TODO(egarciad): Remove once mockito is migrated to null safety. -// @dart = 2.9 - -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter/material.dart'; -import 'package:mockito/mockito.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; -import 'package:url_launcher_example/main.dart'; - -void main() { - final MockUrlLauncher mock = MockUrlLauncher(); - UrlLauncherPlatform.instance = mock; - - testWidgets('Can open URLs', (WidgetTester tester) async { - await tester.pumpWidget(MyApp()); - const String defaultUrl = 'https://www.cylog.org/headers/'; - when(mock.canLaunch(defaultUrl)).thenAnswer((_) => Future.value(true)); - const Map defaultHeaders = { - 'my_header_key': 'my_header_value' - }; - verifyNever(mock.launch(defaultUrl, - useSafariVC: false, - useWebView: false, - enableDomStorage: false, - enableJavaScript: false, - universalLinksOnly: false, - headers: defaultHeaders)); - - Finder browserlaunchBtn = - find.widgetWithText(ElevatedButton, 'Launch in browser'); - expect(browserlaunchBtn, findsOneWidget); - await tester.tap(browserlaunchBtn); - - verify(mock.launch(defaultUrl, - useSafariVC: false, - useWebView: false, - enableDomStorage: false, - enableJavaScript: false, - universalLinksOnly: false, - headers: defaultHeaders)) - .called(1); - }); -} - -class MockUrlLauncher extends Mock - with MockPlatformInterfaceMixin - implements UrlLauncherPlatform {} diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index f337c8bed525..7a4d1820fb1f 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -39,7 +39,7 @@ dev_dependencies: flutter_test: sdk: flutter test: ^1.16.3 - mockito: ^5.0.0-nullsafety.7 + mockito: ^5.0.0 plugin_platform_interface: ^2.0.0 pedantic: ^1.10.0 diff --git a/packages/url_launcher/url_launcher/test/link_test.dart b/packages/url_launcher/url_launcher/test/link_test.dart index 46903aadaede..8da5111f5733 100644 --- a/packages/url_launcher/url_launcher/test/link_test.dart +++ b/packages/url_launcher/url_launcher/test/link_test.dart @@ -2,26 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// TODO(egarciad): Remove once Mockito has been migrated to null safety. -// @dart = 2.9 - import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:flutter/services.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:url_launcher/link.dart'; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import 'mock_url_launcher_platform.dart'; + final MethodCodec _codec = const JSONMethodCodec(); void main() { - final MockUrlLauncher mock = MockUrlLauncher(); - UrlLauncherPlatform.instance = mock; + late MockUrlLauncher mock; - PlatformMessageCallback realOnPlatformMessage; + PlatformMessageCallback? realOnPlatformMessage; setUp(() { + mock = MockUrlLauncher(); + UrlLauncherPlatform.instance = mock; realOnPlatformMessage = window.onPlatformMessage; }); tearDown(() { @@ -31,11 +31,11 @@ void main() { group('$Link', () { testWidgets('handles null uri correctly', (WidgetTester tester) async { bool isBuilt = false; - FollowLink followLink; + FollowLink? followLink; final Link link = Link( uri: null, - builder: (BuildContext context, FollowLink followLink2) { + builder: (BuildContext context, FollowLink? followLink2) { isBuilt = true; followLink = followLink2; return Container(); @@ -50,66 +50,62 @@ void main() { testWidgets('calls url_launcher for external URLs with blank target', (WidgetTester tester) async { - FollowLink followLink; + FollowLink? followLink; await tester.pumpWidget(Link( uri: Uri.parse('http://example.com/foobar'), target: LinkTarget.blank, - builder: (BuildContext context, FollowLink followLink2) { + builder: (BuildContext context, FollowLink? followLink2) { followLink = followLink2; return Container(); }, )); - when(mock.canLaunch('http://example.com/foobar')) - .thenAnswer((realInvocation) => Future.value(true)); - clearInteractions(mock); - await followLink(); - - verifyInOrder([ - mock.canLaunch('http://example.com/foobar'), - mock.launch( - 'http://example.com/foobar', + mock + ..setLaunchExpectations( + url: 'http://example.com/foobar', useSafariVC: false, useWebView: false, universalLinksOnly: false, enableJavaScript: false, enableDomStorage: false, headers: {}, + webOnlyWindowName: null, ) - ]); + ..setResponse(true); + await followLink!(); + expect(mock.canLaunchCalled, isTrue); + expect(mock.launchCalled, isTrue); }); testWidgets('calls url_launcher for external URLs with self target', (WidgetTester tester) async { - FollowLink followLink; + FollowLink? followLink; await tester.pumpWidget(Link( uri: Uri.parse('http://example.com/foobar'), target: LinkTarget.self, - builder: (BuildContext context, FollowLink followLink2) { + builder: (BuildContext context, FollowLink? followLink2) { followLink = followLink2; return Container(); }, )); - when(mock.canLaunch('http://example.com/foobar')) - .thenAnswer((realInvocation) => Future.value(true)); - clearInteractions(mock); - await followLink(); - - verifyInOrder([ - mock.canLaunch('http://example.com/foobar'), - mock.launch( - 'http://example.com/foobar', + mock + ..setLaunchExpectations( + url: 'http://example.com/foobar', useSafariVC: true, useWebView: true, universalLinksOnly: false, enableJavaScript: false, enableDomStorage: false, headers: {}, + webOnlyWindowName: null, ) - ]); + ..setResponse(true); + await followLink!(); + expect(mock.canLaunchCalled, isTrue); + expect(mock.launchCalled, isTrue); }); testWidgets('sends navigation platform messages for internal route names', @@ -125,21 +121,21 @@ void main() { final List frameworkCalls = []; window.onPlatformMessage = ( String name, - ByteData data, - PlatformMessageResponseCallback callback, + ByteData? data, + PlatformMessageResponseCallback? callback, ) { frameworkCalls.add(_codec.decodeMethodCall(data)); - realOnPlatformMessage(name, data, callback); + realOnPlatformMessage!(name, data, callback); }; final Uri uri = Uri.parse('/foo/bar'); - FollowLink followLink; + FollowLink? followLink; await tester.pumpWidget(MaterialApp( routes: { '/': (BuildContext context) => Link( uri: uri, - builder: (BuildContext context, FollowLink followLink2) { + builder: (BuildContext context, FollowLink? followLink2) { followLink = followLink2; return Container(); }, @@ -150,11 +146,11 @@ void main() { engineCalls.clear(); frameworkCalls.clear(); - clearInteractions(mock); - await followLink(); + await followLink!(); // Shouldn't use url_launcher when uri is an internal route name. - verifyZeroInteractions(mock); + expect(mock.canLaunchCalled, isFalse); + expect(mock.launchCalled, isFalse); // A message should've been sent to the engine (by the Navigator, not by // the Link widget). @@ -191,19 +187,19 @@ void main() { final List frameworkCalls = []; window.onPlatformMessage = ( String name, - ByteData data, - PlatformMessageResponseCallback callback, + ByteData? data, + PlatformMessageResponseCallback? callback, ) { frameworkCalls.add(_codec.decodeMethodCall(data)); - realOnPlatformMessage(name, data, callback); + realOnPlatformMessage!(name, data, callback); }; final Uri uri = Uri.parse('/foo/bar'); - FollowLink followLink; + FollowLink? followLink; final Link link = Link( uri: uri, - builder: (BuildContext context, FollowLink followLink2) { + builder: (BuildContext context, FollowLink? followLink2) { followLink = followLink2; return Container(); }, @@ -217,11 +213,11 @@ void main() { engineCalls.clear(); frameworkCalls.clear(); - clearInteractions(mock); - await followLink(); + await followLink!(); // Shouldn't use url_launcher when uri is an internal route name. - verifyZeroInteractions(mock); + expect(mock.canLaunchCalled, isFalse); + expect(mock.launchCalled, isFalse); // Sends route information update to the engine. expect(engineCalls, hasLength(1)); @@ -249,10 +245,6 @@ void main() { }); } -class MockUrlLauncher extends Mock - with MockPlatformInterfaceMixin - implements UrlLauncherPlatform {} - class MockRouteInformationParser extends Mock implements RouteInformationParser { @override @@ -261,8 +253,8 @@ class MockRouteInformationParser extends Mock } } -class MockRouterDelegate extends Mock implements RouterDelegate { - MockRouterDelegate({@required this.builder}); +class MockRouterDelegate extends Mock implements RouterDelegate { + MockRouterDelegate({required this.builder}); final WidgetBuilder builder; @@ -270,4 +262,10 @@ class MockRouterDelegate extends Mock implements RouterDelegate { Widget build(BuildContext context) { return builder(context); } + + @override + Future setInitialRoutePath(Object configuration) async {} + + @override + Future setNewRoutePath(Object configuration) async {} } diff --git a/packages/url_launcher/url_launcher/test/mock_url_launcher_platform.dart b/packages/url_launcher/url_launcher/test/mock_url_launcher_platform.dart new file mode 100644 index 000000000000..87ae99e81024 --- /dev/null +++ b/packages/url_launcher/url_launcher/test/mock_url_launcher_platform.dart @@ -0,0 +1,93 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:url_launcher_platform_interface/link.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; + +class MockUrlLauncher extends Fake + with MockPlatformInterfaceMixin + implements UrlLauncherPlatform { + String? url; + bool? useSafariVC; + bool? useWebView; + bool? enableJavaScript; + bool? enableDomStorage; + bool? universalLinksOnly; + Map? headers; + String? webOnlyWindowName; + + bool? response; + + bool closeWebViewCalled = false; + bool canLaunchCalled = false; + bool launchCalled = false; + + void setCanLaunchExpectations(String url) { + this.url = url; + } + + void setLaunchExpectations({ + required String url, + required bool? useSafariVC, + required bool useWebView, + required bool enableJavaScript, + required bool enableDomStorage, + required bool universalLinksOnly, + required Map headers, + required String? webOnlyWindowName, + }) { + this.url = url; + this.useSafariVC = useSafariVC; + this.useWebView = useWebView; + this.enableJavaScript = enableJavaScript; + this.enableDomStorage = enableDomStorage; + this.universalLinksOnly = universalLinksOnly; + this.headers = headers; + this.webOnlyWindowName = webOnlyWindowName; + } + + void setResponse(bool response) { + this.response = response; + } + + @override + LinkDelegate? get linkDelegate => null; + + @override + Future canLaunch(String url) async { + expect(url, this.url); + canLaunchCalled = true; + return response!; + } + + @override + Future launch( + String url, { + required bool useSafariVC, + required bool useWebView, + required bool enableJavaScript, + required bool enableDomStorage, + required bool universalLinksOnly, + required Map headers, + String? webOnlyWindowName, + }) async { + expect(url, this.url); + expect(useSafariVC, this.useSafariVC); + expect(useWebView, this.useWebView); + expect(enableJavaScript, this.enableJavaScript); + expect(enableDomStorage, this.enableDomStorage); + expect(universalLinksOnly, this.universalLinksOnly); + expect(headers, this.headers); + expect(webOnlyWindowName, this.webOnlyWindowName); + launchCalled = true; + return response!; + } + + @override + Future closeWebView() async { + closeWebViewCalled = true; + } +} diff --git a/packages/url_launcher/url_launcher/test/url_launcher_test.dart b/packages/url_launcher/url_launcher/test/url_launcher_test.dart index bb3fd2ad92b5..9fb16019a543 100644 --- a/packages/url_launcher/url_launcher/test/url_launcher_test.dart +++ b/packages/url_launcher/url_launcher/test/url_launcher_test.dart @@ -2,32 +2,31 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// TODO(mvanbeusekom): Remove once Mockito is migrated to null safety. -// @dart = 2.9 - import 'dart:async'; import 'dart:ui'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; import 'package:flutter/foundation.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; import 'package:flutter/services.dart' show PlatformException; +import 'mock_url_launcher_platform.dart'; + void main() { final MockUrlLauncher mock = MockUrlLauncher(); UrlLauncherPlatform.instance = mock; test('closeWebView default behavior', () async { await closeWebView(); - verify(mock.closeWebView()); + expect(mock.closeWebViewCalled, isTrue); }); group('canLaunch', () { test('returns true', () async { - when(mock.canLaunch('foo')).thenAnswer((_) => Future.value(true)); + mock + ..setCanLaunchExpectations('foo') + ..setResponse(true); final bool result = await canLaunch('foo'); @@ -35,7 +34,9 @@ void main() { }); test('returns false', () async { - when(mock.canLaunch('foo')).thenAnswer((_) => Future.value(false)); + mock + ..setCanLaunchExpectations('foo') + ..setResponse(false); final bool result = await canLaunch('foo'); @@ -44,146 +45,145 @@ void main() { }); group('launch', () { test('default behavior', () async { - await launch('http://flutter.dev/'); - expect( - verify(mock.launch( - captureAny, - useSafariVC: captureAnyNamed('useSafariVC'), - useWebView: captureAnyNamed('useWebView'), - enableJavaScript: captureAnyNamed('enableJavaScript'), - enableDomStorage: captureAnyNamed('enableDomStorage'), - universalLinksOnly: captureAnyNamed('universalLinksOnly'), - headers: captureAnyNamed('headers'), - )).captured, - [ - 'http://flutter.dev/', - true, - false, - false, - false, - false, - {}, - ], - ); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + expect(await launch('http://flutter.dev/'), isTrue); }); test('with headers', () async { - await launch( - 'http://flutter.dev/', - headers: {'key': 'value'}, - ); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {'key': 'value'}, + webOnlyWindowName: null, + ) + ..setResponse(true); expect( - verify(mock.launch( - any, - useSafariVC: anyNamed('useSafariVC'), - useWebView: anyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: captureAnyNamed('headers'), - )).captured.single, - {'key': 'value'}, - ); + await launch( + 'http://flutter.dev/', + headers: {'key': 'value'}, + ), + isTrue); }); test('force SafariVC', () async { - await launch('http://flutter.dev/', forceSafariVC: true); - expect( - verify(mock.launch( - any, - useSafariVC: captureAnyNamed('useSafariVC'), - useWebView: anyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured.single, - true, - ); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + expect(await launch('http://flutter.dev/', forceSafariVC: true), isTrue); }); test('universal links only', () async { - await launch('http://flutter.dev/', - forceSafariVC: false, universalLinksOnly: true); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: false, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: true, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); expect( - verify(mock.launch( - any, - useSafariVC: captureAnyNamed('useSafariVC'), - useWebView: anyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: captureAnyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured, - [false, true], - ); + await launch('http://flutter.dev/', + forceSafariVC: false, universalLinksOnly: true), + isTrue); }); test('force WebView', () async { - await launch('http://flutter.dev/', forceWebView: true); - expect( - verify(mock.launch( - any, - useSafariVC: anyNamed('useSafariVC'), - useWebView: captureAnyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured.single, - true, - ); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: true, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + expect(await launch('http://flutter.dev/', forceWebView: true), isTrue); }); test('force WebView enable javascript', () async { - await launch('http://flutter.dev/', - forceWebView: true, enableJavaScript: true); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: true, + enableJavaScript: true, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); expect( - verify(mock.launch( - any, - useSafariVC: anyNamed('useSafariVC'), - useWebView: captureAnyNamed('useWebView'), - enableJavaScript: captureAnyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured, - [true, true], - ); + await launch('http://flutter.dev/', + forceWebView: true, enableJavaScript: true), + isTrue); }); test('force WebView enable DOM storage', () async { - await launch('http://flutter.dev/', - forceWebView: true, enableDomStorage: true); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: true, + enableJavaScript: false, + enableDomStorage: true, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); expect( - verify(mock.launch( - any, - useSafariVC: anyNamed('useSafariVC'), - useWebView: captureAnyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: captureAnyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured, - [true, true], - ); + await launch('http://flutter.dev/', + forceWebView: true, enableDomStorage: true), + isTrue); }); test('force SafariVC to false', () async { - await launch('http://flutter.dev/', forceSafariVC: false); - expect( - // ignore: missing_required_param - verify(mock.launch( - any, - useSafariVC: captureAnyNamed('useSafariVC'), - useWebView: anyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )).captured.single, - false, - ); + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: false, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + expect(await launch('http://flutter.dev/', forceSafariVC: false), isTrue); }); test('cannot launch a non-web in webview', () async { @@ -192,19 +192,20 @@ void main() { }); test('send e-mail', () async { - await launch('mailto:gmail-noreply@google.com?subject=Hello'); - expect( - verify(await mock.launch( - any, - useSafariVC: anyNamed('useSafariVC'), - useWebView: anyNamed('useWebView'), - enableJavaScript: anyNamed('enableJavaScript'), - enableDomStorage: anyNamed('enableDomStorage'), - universalLinksOnly: anyNamed('universalLinksOnly'), - headers: anyNamed('headers'), - )), - isInstanceOf(), - ); + mock + ..setLaunchExpectations( + url: 'mailto:gmail-noreply@google.com?subject=Hello', + useSafariVC: false, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + expect(await launch('mailto:gmail-noreply@google.com?subject=Hello'), + isTrue); }); test('cannot send e-mail with forceSafariVC: true', () async { @@ -224,8 +225,22 @@ void main() { }); test('controls system UI when changing statusBarBrightness', () async { + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + final TestWidgetsFlutterBinding binding = - TestWidgetsFlutterBinding.ensureInitialized(); + TestWidgetsFlutterBinding.ensureInitialized() + as TestWidgetsFlutterBinding; debugDefaultTargetPlatformOverride = TargetPlatform.iOS; binding.renderView.automaticSystemUiAdjustment = true; final Future launchResult = @@ -239,8 +254,22 @@ void main() { }); test('sets automaticSystemUiAdjustment to not be null', () async { + mock + ..setLaunchExpectations( + url: 'http://flutter.dev/', + useSafariVC: true, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + webOnlyWindowName: null, + ) + ..setResponse(true); + final TestWidgetsFlutterBinding binding = - TestWidgetsFlutterBinding.ensureInitialized(); + TestWidgetsFlutterBinding.ensureInitialized() + as TestWidgetsFlutterBinding; debugDefaultTargetPlatformOverride = TargetPlatform.android; expect(binding.renderView.automaticSystemUiAdjustment, true); final Future launchResult = @@ -254,7 +283,3 @@ void main() { }); }); } - -class MockUrlLauncher extends Mock - with MockPlatformInterfaceMixin - implements UrlLauncherPlatform {}