Skip to content
This repository has been archived by the owner on Feb 22, 2023. It is now read-only.

[url_launcher] DartDoc and test improvements #2274

Merged
merged 2 commits into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/url_launcher/url_launcher/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 5.2.7

* Minor unit test changes and added a lint for public DartDocs.

## 5.2.6

* Remove AndroidX warnings.
Expand Down
11 changes: 11 additions & 0 deletions packages/url_launcher/url_launcher/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# This exists to add a lint for missing API docs just on this specific package,
# since not all packages have coverage for all their public members yet and
# adding it in would be non-trivial. `public_member_api_docs` should be applied
# to new packages going forward, and ideally the main `analysis_options.yaml`
# file as soon as possible.

include: ../../../analysis_options.yaml

linter:
rules:
- public_member_api_docs
2 changes: 2 additions & 0 deletions packages/url_launcher/url_launcher/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'dart:async';

import 'package:flutter/material.dart';
Expand Down
2 changes: 1 addition & 1 deletion packages/url_launcher/url_launcher/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports
web, phone, SMS, and email schemes.
author: Flutter Team <[email protected]>
homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher
version: 5.2.6
version: 5.2.7

flutter:
plugin:
Expand Down
328 changes: 181 additions & 147 deletions packages/url_launcher/url_launcher/test/url_launcher_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,175 +2,209 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:ui';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';
import 'package:flutter/foundation.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;

void main() {
final MockUrlLauncher mock = MockUrlLauncher();
when(mock.isMock).thenReturn(true);

UrlLauncherPlatform.instance = mock;

test('canLaunch', () async {
await canLaunch('http://example.com/');
expect(verify(mock.canLaunch(captureAny)).captured.single,
'http://example.com/');
test('closeWebView default behavior', () async {
await closeWebView();
verify(mock.closeWebView());
});

test('launch default behavior', () async {
await launch('http://example.com/');
expect(
verify(mock.launch(
captureAny,
useSafariVC: captureAnyNamed('useSafariVC'),
useWebView: captureAnyNamed('useWebView'),
enableJavaScript: captureAnyNamed('enableJavaScript'),
enableDomStorage: captureAnyNamed('enableDomStorage'),
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
headers: captureAnyNamed('headers'),
)).captured,
<dynamic>[
'http://example.com/',
true,
false,
false,
false,
false,
<String, String>{},
],
);
});
group('canLaunch', () {
test('returns true', () async {
when(mock.canLaunch('foo')).thenAnswer((_) => Future<bool>.value(true));

test('launch with headers', () async {
await launch(
'http://example.com/',
headers: <String, String>{'key': 'value'},
);
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,
<String, String>{'key': 'value'},
);
});
final bool result = await canLaunch('foo');

test('launch force SafariVC', () async {
await launch('http://example.com/', 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,
);
});
expect(result, isTrue);
});

test('launch universal links only', () async {
await launch('http://example.com/',
forceSafariVC: false, universalLinksOnly: 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,
<bool>[false, true],
);
});
test('returns false', () async {
when(mock.canLaunch('foo')).thenAnswer((_) => Future<bool>.value(false));

test('launch force WebView', () async {
await launch('http://example.com/', 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,
);
});
final bool result = await canLaunch('foo');

test('launch force WebView enable javascript', () async {
await launch('http://example.com/',
forceWebView: true, enableJavaScript: 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,
<bool>[true, true],
);
expect(result, isFalse);
});
});
group('launch', () {
test('requires a non-null urlString', () {
expect(() => launch(null), throwsAssertionError);
});

test('launch force WebView enable DOM storage', () async {
await launch('http://example.com/',
forceWebView: true, enableDomStorage: 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,
<bool>[true, true],
);
});
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,
<dynamic>[
'http://flutter.dev/',
true,
false,
false,
false,
false,
<String, String>{},
],
);
});

test('launch force SafariVC to false', () async {
await launch('http://example.com/', 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,
);
});
test('with headers', () async {
await launch(
'http://flutter.dev/',
headers: <String, String>{'key': 'value'},
);
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,
<String, String>{'key': 'value'},
);
});

test('cannot launch a non-web in webview', () async {
expect(() async => await launch('tel:555-555-5555', forceWebView: true),
throwsA(isA<PlatformException>()));
});
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,
);
});

test('closeWebView default behavior', () async {
await closeWebView();
verify(mock.closeWebView());
test('universal links only', () async {
await launch('http://flutter.dev/',
forceSafariVC: false, universalLinksOnly: 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,
<bool>[false, true],
);
});

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,
);
});

test('force WebView enable javascript', () async {
await launch('http://flutter.dev/',
forceWebView: true, enableJavaScript: 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,
<bool>[true, true],
);
});

test('force WebView enable DOM storage', () async {
await launch('http://flutter.dev/',
forceWebView: true, enableDomStorage: 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,
<bool>[true, true],
);
});

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,
);
});

test('cannot launch a non-web in webview', () async {
expect(() async => await launch('tel:555-555-5555', forceWebView: true),
throwsA(isA<PlatformException>()));
});

test('controls system UI when changing statusBarBrightness', () async {
final TestWidgetsFlutterBinding binding =
TestWidgetsFlutterBinding.ensureInitialized();
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
binding.renderView.automaticSystemUiAdjustment = true;
final Future<bool> launchResult =
launch('http://flutter.dev/', statusBarBrightness: Brightness.dark);

// Should take over control of the automaticSystemUiAdjustment while it's
// pending, then restore it back to normal after the launch finishes.
expect(binding.renderView.automaticSystemUiAdjustment, isFalse);
await launchResult;
expect(binding.renderView.automaticSystemUiAdjustment, isTrue);
});
});
}

Expand Down
Loading