Skip to content

Commit b73e4e0

Browse files
Michael KlimushynPark Sung Min
Michael Klimushyn
authored and
Park Sung Min
committed
[url_launcher] DartDoc and test improvements (flutter#2274)
- Add a lint to url_launcher and url_launcher_platform_interface to prevent undocumented public members. - Add some unit tests.
1 parent 0834c76 commit b73e4e0

File tree

9 files changed

+219
-155
lines changed

9 files changed

+219
-155
lines changed

packages/url_launcher/url_launcher/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 5.2.7
2+
3+
* Minor unit test changes and added a lint for public DartDocs.
4+
15
## 5.2.6
26

37
* Remove AndroidX warnings.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# This exists to add a lint for missing API docs just on this specific package,
2+
# since not all packages have coverage for all their public members yet and
3+
# adding it in would be non-trivial. `public_member_api_docs` should be applied
4+
# to new packages going forward, and ideally the main `analysis_options.yaml`
5+
# file as soon as possible.
6+
7+
include: ../../../analysis_options.yaml
8+
9+
linter:
10+
rules:
11+
- public_member_api_docs

packages/url_launcher/url_launcher/example/lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
// ignore_for_file: public_member_api_docs
6+
57
import 'dart:async';
68

79
import 'package:flutter/material.dart';

packages/url_launcher/url_launcher/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports
33
web, phone, SMS, and email schemes.
44
author: Flutter Team <[email protected]>
55
homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher
6-
version: 5.2.6
6+
version: 5.2.7
77

88
flutter:
99
plugin:

packages/url_launcher/url_launcher/test/url_launcher_test.dart

Lines changed: 181 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -2,175 +2,209 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:async';
6+
import 'dart:ui';
7+
import 'package:flutter_test/flutter_test.dart';
58
import 'package:mockito/mockito.dart';
6-
import 'package:test/test.dart';
9+
import 'package:flutter/foundation.dart';
710
import 'package:url_launcher/url_launcher.dart';
811
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
912
import 'package:flutter/services.dart' show PlatformException;
1013

1114
void main() {
1215
final MockUrlLauncher mock = MockUrlLauncher();
1316
when(mock.isMock).thenReturn(true);
14-
1517
UrlLauncherPlatform.instance = mock;
1618

17-
test('canLaunch', () async {
18-
await canLaunch('http://example.com/');
19-
expect(verify(mock.canLaunch(captureAny)).captured.single,
20-
'http://example.com/');
19+
test('closeWebView default behavior', () async {
20+
await closeWebView();
21+
verify(mock.closeWebView());
2122
});
2223

23-
test('launch default behavior', () async {
24-
await launch('http://example.com/');
25-
expect(
26-
verify(mock.launch(
27-
captureAny,
28-
useSafariVC: captureAnyNamed('useSafariVC'),
29-
useWebView: captureAnyNamed('useWebView'),
30-
enableJavaScript: captureAnyNamed('enableJavaScript'),
31-
enableDomStorage: captureAnyNamed('enableDomStorage'),
32-
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
33-
headers: captureAnyNamed('headers'),
34-
)).captured,
35-
<dynamic>[
36-
'http://example.com/',
37-
true,
38-
false,
39-
false,
40-
false,
41-
false,
42-
<String, String>{},
43-
],
44-
);
45-
});
24+
group('canLaunch', () {
25+
test('returns true', () async {
26+
when(mock.canLaunch('foo')).thenAnswer((_) => Future<bool>.value(true));
4627

47-
test('launch with headers', () async {
48-
await launch(
49-
'http://example.com/',
50-
headers: <String, String>{'key': 'value'},
51-
);
52-
expect(
53-
verify(mock.launch(
54-
any,
55-
useSafariVC: anyNamed('useSafariVC'),
56-
useWebView: anyNamed('useWebView'),
57-
enableJavaScript: anyNamed('enableJavaScript'),
58-
enableDomStorage: anyNamed('enableDomStorage'),
59-
universalLinksOnly: anyNamed('universalLinksOnly'),
60-
headers: captureAnyNamed('headers'),
61-
)).captured.single,
62-
<String, String>{'key': 'value'},
63-
);
64-
});
28+
final bool result = await canLaunch('foo');
6529

66-
test('launch force SafariVC', () async {
67-
await launch('http://example.com/', forceSafariVC: true);
68-
expect(
69-
verify(mock.launch(
70-
any,
71-
useSafariVC: captureAnyNamed('useSafariVC'),
72-
useWebView: anyNamed('useWebView'),
73-
enableJavaScript: anyNamed('enableJavaScript'),
74-
enableDomStorage: anyNamed('enableDomStorage'),
75-
universalLinksOnly: anyNamed('universalLinksOnly'),
76-
headers: anyNamed('headers'),
77-
)).captured.single,
78-
true,
79-
);
80-
});
30+
expect(result, isTrue);
31+
});
8132

82-
test('launch universal links only', () async {
83-
await launch('http://example.com/',
84-
forceSafariVC: false, universalLinksOnly: true);
85-
expect(
86-
verify(mock.launch(
87-
any,
88-
useSafariVC: captureAnyNamed('useSafariVC'),
89-
useWebView: anyNamed('useWebView'),
90-
enableJavaScript: anyNamed('enableJavaScript'),
91-
enableDomStorage: anyNamed('enableDomStorage'),
92-
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
93-
headers: anyNamed('headers'),
94-
)).captured,
95-
<bool>[false, true],
96-
);
97-
});
33+
test('returns false', () async {
34+
when(mock.canLaunch('foo')).thenAnswer((_) => Future<bool>.value(false));
9835

99-
test('launch force WebView', () async {
100-
await launch('http://example.com/', forceWebView: true);
101-
expect(
102-
verify(mock.launch(
103-
any,
104-
useSafariVC: anyNamed('useSafariVC'),
105-
useWebView: captureAnyNamed('useWebView'),
106-
enableJavaScript: anyNamed('enableJavaScript'),
107-
enableDomStorage: anyNamed('enableDomStorage'),
108-
universalLinksOnly: anyNamed('universalLinksOnly'),
109-
headers: anyNamed('headers'),
110-
)).captured.single,
111-
true,
112-
);
113-
});
36+
final bool result = await canLaunch('foo');
11437

115-
test('launch force WebView enable javascript', () async {
116-
await launch('http://example.com/',
117-
forceWebView: true, enableJavaScript: true);
118-
expect(
119-
verify(mock.launch(
120-
any,
121-
useSafariVC: anyNamed('useSafariVC'),
122-
useWebView: captureAnyNamed('useWebView'),
123-
enableJavaScript: captureAnyNamed('enableJavaScript'),
124-
enableDomStorage: anyNamed('enableDomStorage'),
125-
universalLinksOnly: anyNamed('universalLinksOnly'),
126-
headers: anyNamed('headers'),
127-
)).captured,
128-
<bool>[true, true],
129-
);
38+
expect(result, isFalse);
39+
});
13040
});
41+
group('launch', () {
42+
test('requires a non-null urlString', () {
43+
expect(() => launch(null), throwsAssertionError);
44+
});
13145

132-
test('launch force WebView enable DOM storage', () async {
133-
await launch('http://example.com/',
134-
forceWebView: true, enableDomStorage: true);
135-
expect(
136-
verify(mock.launch(
137-
any,
138-
useSafariVC: anyNamed('useSafariVC'),
139-
useWebView: captureAnyNamed('useWebView'),
140-
enableJavaScript: anyNamed('enableJavaScript'),
141-
enableDomStorage: captureAnyNamed('enableDomStorage'),
142-
universalLinksOnly: anyNamed('universalLinksOnly'),
143-
headers: anyNamed('headers'),
144-
)).captured,
145-
<bool>[true, true],
146-
);
147-
});
46+
test('default behavior', () async {
47+
await launch('http://flutter.dev/');
48+
expect(
49+
verify(mock.launch(
50+
captureAny,
51+
useSafariVC: captureAnyNamed('useSafariVC'),
52+
useWebView: captureAnyNamed('useWebView'),
53+
enableJavaScript: captureAnyNamed('enableJavaScript'),
54+
enableDomStorage: captureAnyNamed('enableDomStorage'),
55+
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
56+
headers: captureAnyNamed('headers'),
57+
)).captured,
58+
<dynamic>[
59+
'http://flutter.dev/',
60+
true,
61+
false,
62+
false,
63+
false,
64+
false,
65+
<String, String>{},
66+
],
67+
);
68+
});
14869

149-
test('launch force SafariVC to false', () async {
150-
await launch('http://example.com/', forceSafariVC: false);
151-
expect(
152-
// ignore: missing_required_param
153-
verify(mock.launch(
154-
any,
155-
useSafariVC: captureAnyNamed('useSafariVC'),
156-
useWebView: anyNamed('useWebView'),
157-
enableJavaScript: anyNamed('enableJavaScript'),
158-
enableDomStorage: anyNamed('enableDomStorage'),
159-
universalLinksOnly: anyNamed('universalLinksOnly'),
160-
headers: anyNamed('headers'),
161-
)).captured.single,
162-
false,
163-
);
164-
});
70+
test('with headers', () async {
71+
await launch(
72+
'http://flutter.dev/',
73+
headers: <String, String>{'key': 'value'},
74+
);
75+
expect(
76+
verify(mock.launch(
77+
any,
78+
useSafariVC: anyNamed('useSafariVC'),
79+
useWebView: anyNamed('useWebView'),
80+
enableJavaScript: anyNamed('enableJavaScript'),
81+
enableDomStorage: anyNamed('enableDomStorage'),
82+
universalLinksOnly: anyNamed('universalLinksOnly'),
83+
headers: captureAnyNamed('headers'),
84+
)).captured.single,
85+
<String, String>{'key': 'value'},
86+
);
87+
});
16588

166-
test('cannot launch a non-web in webview', () async {
167-
expect(() async => await launch('tel:555-555-5555', forceWebView: true),
168-
throwsA(isA<PlatformException>()));
169-
});
89+
test('force SafariVC', () async {
90+
await launch('http://flutter.dev/', forceSafariVC: true);
91+
expect(
92+
verify(mock.launch(
93+
any,
94+
useSafariVC: captureAnyNamed('useSafariVC'),
95+
useWebView: anyNamed('useWebView'),
96+
enableJavaScript: anyNamed('enableJavaScript'),
97+
enableDomStorage: anyNamed('enableDomStorage'),
98+
universalLinksOnly: anyNamed('universalLinksOnly'),
99+
headers: anyNamed('headers'),
100+
)).captured.single,
101+
true,
102+
);
103+
});
170104

171-
test('closeWebView default behavior', () async {
172-
await closeWebView();
173-
verify(mock.closeWebView());
105+
test('universal links only', () async {
106+
await launch('http://flutter.dev/',
107+
forceSafariVC: false, universalLinksOnly: true);
108+
expect(
109+
verify(mock.launch(
110+
any,
111+
useSafariVC: captureAnyNamed('useSafariVC'),
112+
useWebView: anyNamed('useWebView'),
113+
enableJavaScript: anyNamed('enableJavaScript'),
114+
enableDomStorage: anyNamed('enableDomStorage'),
115+
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
116+
headers: anyNamed('headers'),
117+
)).captured,
118+
<bool>[false, true],
119+
);
120+
});
121+
122+
test('force WebView', () async {
123+
await launch('http://flutter.dev/', forceWebView: true);
124+
expect(
125+
verify(mock.launch(
126+
any,
127+
useSafariVC: anyNamed('useSafariVC'),
128+
useWebView: captureAnyNamed('useWebView'),
129+
enableJavaScript: anyNamed('enableJavaScript'),
130+
enableDomStorage: anyNamed('enableDomStorage'),
131+
universalLinksOnly: anyNamed('universalLinksOnly'),
132+
headers: anyNamed('headers'),
133+
)).captured.single,
134+
true,
135+
);
136+
});
137+
138+
test('force WebView enable javascript', () async {
139+
await launch('http://flutter.dev/',
140+
forceWebView: true, enableJavaScript: true);
141+
expect(
142+
verify(mock.launch(
143+
any,
144+
useSafariVC: anyNamed('useSafariVC'),
145+
useWebView: captureAnyNamed('useWebView'),
146+
enableJavaScript: captureAnyNamed('enableJavaScript'),
147+
enableDomStorage: anyNamed('enableDomStorage'),
148+
universalLinksOnly: anyNamed('universalLinksOnly'),
149+
headers: anyNamed('headers'),
150+
)).captured,
151+
<bool>[true, true],
152+
);
153+
});
154+
155+
test('force WebView enable DOM storage', () async {
156+
await launch('http://flutter.dev/',
157+
forceWebView: true, enableDomStorage: true);
158+
expect(
159+
verify(mock.launch(
160+
any,
161+
useSafariVC: anyNamed('useSafariVC'),
162+
useWebView: captureAnyNamed('useWebView'),
163+
enableJavaScript: anyNamed('enableJavaScript'),
164+
enableDomStorage: captureAnyNamed('enableDomStorage'),
165+
universalLinksOnly: anyNamed('universalLinksOnly'),
166+
headers: anyNamed('headers'),
167+
)).captured,
168+
<bool>[true, true],
169+
);
170+
});
171+
172+
test('force SafariVC to false', () async {
173+
await launch('http://flutter.dev/', forceSafariVC: false);
174+
expect(
175+
// ignore: missing_required_param
176+
verify(mock.launch(
177+
any,
178+
useSafariVC: captureAnyNamed('useSafariVC'),
179+
useWebView: anyNamed('useWebView'),
180+
enableJavaScript: anyNamed('enableJavaScript'),
181+
enableDomStorage: anyNamed('enableDomStorage'),
182+
universalLinksOnly: anyNamed('universalLinksOnly'),
183+
headers: anyNamed('headers'),
184+
)).captured.single,
185+
false,
186+
);
187+
});
188+
189+
test('cannot launch a non-web in webview', () async {
190+
expect(() async => await launch('tel:555-555-5555', forceWebView: true),
191+
throwsA(isA<PlatformException>()));
192+
});
193+
194+
test('controls system UI when changing statusBarBrightness', () async {
195+
final TestWidgetsFlutterBinding binding =
196+
TestWidgetsFlutterBinding.ensureInitialized();
197+
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
198+
binding.renderView.automaticSystemUiAdjustment = true;
199+
final Future<bool> launchResult =
200+
launch('http://flutter.dev/', statusBarBrightness: Brightness.dark);
201+
202+
// Should take over control of the automaticSystemUiAdjustment while it's
203+
// pending, then restore it back to normal after the launch finishes.
204+
expect(binding.renderView.automaticSystemUiAdjustment, isFalse);
205+
await launchResult;
206+
expect(binding.renderView.automaticSystemUiAdjustment, isTrue);
207+
});
174208
});
175209
}
176210

0 commit comments

Comments
 (0)