Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
SWIFT_VERSION = 6.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
};
name = Debug;
Expand All @@ -671,7 +671,7 @@
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
SWIFT_VERSION = 6.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
};
name = Release;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// found in the LICENSE file.

import Flutter
import XCTest
import Testing

@testable import url_launcher_ios

Expand Down Expand Up @@ -31,7 +31,8 @@ final class StubViewPresenterProvider: ViewPresenterProvider {
}
}

final class URLLauncherTests: XCTestCase {
@MainActor
struct URLLauncherTests {

private func createPlugin(
launcher: FakeLauncher = FakeLauncher(), viewPresenter: ViewPresenter? = TestViewPresenter()
Expand All @@ -41,147 +42,131 @@ final class URLLauncherTests: XCTestCase {
viewPresenterProvider: StubViewPresenterProvider(viewPresenter: viewPresenter))
}

func testCanLaunchSuccess() {
let result = createPlugin().canLaunchUrl(url: "good://url")
XCTAssertEqual(result, .success)
@Test(arguments: [
("good://url", LaunchResult.success),
("bad://url", .failure),
])
func canLaunch(url: String, expected: LaunchResult) {
let result = createPlugin().canLaunchUrl(url: url)
#expect(result == expected)
}

func testCanLaunchFailure() {
let result = createPlugin().canLaunchUrl(url: "bad://url")
XCTAssertEqual(result, .failure)
}

func testCanLaunchFailureWithInvalidURL() {
@Test func canLaunchFailureWithInvalidURL() {
let result = createPlugin().canLaunchUrl(url: "urls can't have spaces")

if urlParsingIsStrict() {
XCTAssertEqual(result, .invalidUrl)
#expect(result == .invalidUrl)
} else {
XCTAssertEqual(result, .failure)
#expect(result == .failure)
}
}

func testLaunchSuccess() {
let expectation = XCTestExpectation(description: "completion called")
createPlugin().launchUrl(url: "good://url", universalLinksOnly: false) { result in
switch result {
case .success(let details):
XCTAssertEqual(details, .success)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
}

func testLaunchFailure() {
let expectation = XCTestExpectation(description: "completion called")
createPlugin().launchUrl(url: "bad://url", universalLinksOnly: false) { result in
switch result {
case .success(let details):
XCTAssertEqual(details, .failure)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
@Test(arguments: [
("good://url", LaunchResult.success),
("bad://url", .failure),
])
func launch(url: String, expected: LaunchResult) async {
await confirmation("completion called") { confirmed in
createPlugin().launchUrl(url: url, universalLinksOnly: false) { result in
switch result {
case .success(let details):
#expect(details == expected)
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
confirmed()
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
}

func testLaunchFailureWithInvalidURL() {
let expectation = XCTestExpectation(description: "completion called")
createPlugin().launchUrl(url: "urls can't have spaces", universalLinksOnly: false) { result in
switch result {
case .success(let details):
if urlParsingIsStrict() {
XCTAssertEqual(details, .invalidUrl)
} else {
XCTAssertEqual(details, .failure)
@Test func launchFailureWithInvalidURL() async {
await confirmation("completion called") { confirmed in
createPlugin().launchUrl(url: "urls can't have spaces", universalLinksOnly: false) { result in
switch result {
case .success(let details):
if urlParsingIsStrict() {
#expect(details == .invalidUrl)
} else {
#expect(details == .failure)
}
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
case .failure(let error):
XCTFail("Unexpected error: \(error)")
confirmed()
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
}

func testLaunchWithoutUniversalLinks() {
@Test func launchWithoutUniversalLinks() async throws {
let launcher = FakeLauncher()
let plugin = createPlugin(launcher: launcher)

let expectation = XCTestExpectation(description: "completion called")
plugin.launchUrl(url: "good://url", universalLinksOnly: false) { result in
switch result {
case .success(let details):
XCTAssertEqual(details, .success)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
await confirmation("completion called") { confirmed in
plugin.launchUrl(url: "good://url", universalLinksOnly: false) { result in
switch result {
case .success(let details):
#expect(details == .success)
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
confirmed()
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
XCTAssertEqual(launcher.passedOptions?[.universalLinksOnly] as? Bool, false)
let passedOptions = try #require(launcher.passedOptions)
#expect(passedOptions[.universalLinksOnly] as? Bool == false)
}

func testLaunchWithUniversalLinks() {
@Test func launchWithUniversalLinks() async throws {
let launcher = FakeLauncher()
let plugin = createPlugin(launcher: launcher)

let expectation = XCTestExpectation(description: "completion called")
plugin.launchUrl(url: "good://url", universalLinksOnly: true) { result in
switch result {
case .success(let details):
XCTAssertEqual(details, .success)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
await confirmation("completion called") { confirmed in
plugin.launchUrl(url: "good://url", universalLinksOnly: true) { result in
switch result {
case .success(let details):
#expect(details == .success)
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
confirmed()
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
XCTAssertEqual(launcher.passedOptions?[.universalLinksOnly] as? Bool, true)
let passedOptions = try #require(launcher.passedOptions)
#expect(passedOptions[.universalLinksOnly] as? Bool == true)
}

func testLaunchSafariViewControllerWithClose() {
@Test func launchSafariViewControllerWithClose() async {
let launcher = FakeLauncher()
let viewPresenter = TestViewPresenter()
let plugin = createPlugin(launcher: launcher, viewPresenter: viewPresenter)

let expectation = XCTestExpectation(description: "completion called")
plugin.openUrlInSafariViewController(url: "https://flutter.dev") { result in
switch result {
case .success(let details):
XCTAssertEqual(details, .dismissed)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
await confirmation("completion called") { confirmed in
plugin.openUrlInSafariViewController(url: "https://flutter.dev") { result in
switch result {
case .success(let details):
#expect(details == .dismissed)
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
confirmed()
}
expectation.fulfill()
plugin.closeSafariViewController()
}
plugin.closeSafariViewController()
wait(for: [expectation], timeout: 30)
XCTAssertNotNil(viewPresenter.presentedController)
#expect(viewPresenter.presentedController != nil)
}

func testLaunchSafariViewControllerFailureWithNoViewPresenter() {
let expectation = XCTestExpectation(description: "completion called")
createPlugin(viewPresenter: nil).openUrlInSafariViewController(url: "https://flutter.dev") {
result in
switch result {
case .success(let details):
XCTAssertEqual(details, .noUI)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
@Test func launchSafariViewControllerFailureWithNoViewPresenter() async {
await confirmation("completion called") { confirmed in
createPlugin(viewPresenter: nil).openUrlInSafariViewController(url: "https://flutter.dev") {
result in
switch result {
case .success(let details):
#expect(details == .noUI)
case .failure(let error):
Issue.record("Unexpected error: \(error)")
}
confirmed()
}
expectation.fulfill()
}

wait(for: [expectation], timeout: 1)
}

}
Expand Down
Loading