blob: 64065ff99f9a8002d7be5c792b68e5c5fd76f44e [file] [log] [blame]
// Copyright 2013 The Flutter 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:url_launcher/src/types.dart';
import 'package:url_launcher/src/url_launcher_string.dart';
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
import '../mocks/mock_url_launcher_platform.dart';
void main() {
final MockUrlLauncher mock = MockUrlLauncher();
UrlLauncherPlatform.instance = mock;
group('canLaunchUrlString', () {
test('handles returning true', () async {
const String urlString = 'https://flutter.dev';
mock
..setCanLaunchExpectations(urlString)
..setResponse(true);
final bool result = await canLaunchUrlString(urlString);
expect(result, isTrue);
});
test('handles returning false', () async {
const String urlString = 'https://flutter.dev';
mock
..setCanLaunchExpectations(urlString)
..setResponse(false);
final bool result = await canLaunchUrlString(urlString);
expect(result, isFalse);
});
});
group('launchUrlString', () {
test('default behavior with web URL', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString), isTrue);
});
test('default behavior with non-web URL', () async {
const String urlString = 'customscheme:foo';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString), isTrue);
});
test('explicit default launch mode with web URL', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString), isTrue);
});
test('explicit default launch mode with non-web URL', () async {
const String urlString = 'customscheme:foo';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString), isTrue);
});
test('in-app webview', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString, mode: LaunchMode.inAppWebView),
isTrue);
});
test('external browser', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.externalApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(
await launchUrlString(urlString,
mode: LaunchMode.externalApplication),
isTrue);
});
test('external non-browser only', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.externalNonBrowserApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: true,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(
await launchUrlString(urlString,
mode: LaunchMode.externalNonBrowserApplication),
isTrue);
});
test('in-app webview without javascript', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: false,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(
await launchUrlString(urlString,
mode: LaunchMode.inAppWebView,
webViewConfiguration:
const WebViewConfiguration(enableJavaScript: false)),
isTrue);
});
test('in-app webview without DOM storage', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: false,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(
await launchUrlString(urlString,
mode: LaunchMode.inAppWebView,
webViewConfiguration:
const WebViewConfiguration(enableDomStorage: false)),
isTrue);
});
test('in-app webview with headers', () async {
const String urlString = 'https://flutter.dev';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{'key': 'value'},
webOnlyWindowName: null,
)
..setResponse(true);
expect(
await launchUrlString(urlString,
mode: LaunchMode.inAppWebView,
webViewConfiguration: const WebViewConfiguration(
headers: <String, String>{'key': 'value'})),
isTrue);
});
test('cannot launch a non-web URL in a webview', () async {
expect(
() async => launchUrlString('tel:555-555-5555',
mode: LaunchMode.inAppWebView),
throwsA(isA<ArgumentError>()));
});
test('non-web URL with default options', () async {
const String emailLaunchUrlString =
'mailto:smith@example.com?subject=Hello';
mock
..setLaunchExpectations(
url: emailLaunchUrlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(emailLaunchUrlString), isTrue);
});
test('allows non-parsable url', () async {
// Not a valid Dart [Uri], but a valid URL on at least some platforms.
const String urlString =
'rdp://full%20address=s:mypc:3389&audiomode=i:2&disable%20themes=i:1';
mock
..setLaunchExpectations(
url: urlString,
launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
headers: <String, String>{},
webOnlyWindowName: null,
)
..setResponse(true);
expect(await launchUrlString(urlString), isTrue);
});
});
}