From 1676f90a4740830c01a3ff27f32b5e7a4a046701 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 20 Sep 2023 14:30:57 -0400 Subject: [PATCH] [various] Update invalid NSURL tests For applications linked against iOS 17 or later, NSURL no longer returns `nil` for invalid URLs, so tests that were specific to that behavior have to be adjusted to allow for another outcome. Fixes https://github.com/flutter/flutter/issues/134972 Part of https://github.com/flutter/flutter/issues/134971 --- .../ios/RunnerTests/URLLauncherTests.swift | 36 +++++++++++++------ .../ios/RunnerTests/FWFWebViewHostApiTests.m | 19 ++++++---- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/packages/url_launcher/url_launcher_ios/example/ios/RunnerTests/URLLauncherTests.swift b/packages/url_launcher/url_launcher_ios/example/ios/RunnerTests/URLLauncherTests.swift index a0f8f6fb74cf..e11a7e3871c5 100644 --- a/packages/url_launcher/url_launcher_ios/example/ios/RunnerTests/URLLauncherTests.swift +++ b/packages/url_launcher/url_launcher_ios/example/ios/RunnerTests/URLLauncherTests.swift @@ -39,11 +39,19 @@ final class URLLauncherTests: XCTestCase { var error: FlutterError? let result = createPlugin().canLaunchURL("urls can't have spaces", error: &error) - XCTAssertNil(result) - XCTAssertNotNil(error) - XCTAssertEqual(error?.code, "argument_error") - XCTAssertEqual(error?.message, "Unable to parse URL") - XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces") + if (error == nil) { + // When linking against the iOS 17 SDK or later, NSURL uses a lenient parser, and won't + // fail to parse URLs, so the test must allow for either outcome. + XCTAssertNotNil(result) + XCTAssertFalse(result?.boolValue ?? true) + XCTAssertNil(error) + } else { + XCTAssertNil(result) + XCTAssertNotNil(error) + XCTAssertEqual(error?.code, "argument_error") + XCTAssertEqual(error?.message, "Unable to parse URL") + XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces") + } } func testLaunchSuccess() { @@ -75,11 +83,19 @@ final class URLLauncherTests: XCTestCase { let expectation = XCTestExpectation(description: "completion called") createPlugin().launchURL("urls can't have spaces", universalLinksOnly: false) { result, error in - XCTAssertNil(result) - XCTAssertNotNil(error) - XCTAssertEqual(error?.code, "argument_error") - XCTAssertEqual(error?.message, "Unable to parse URL") - XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces") + if (error == nil) { + // When linking against the iOS 17 SDK or later, NSURL uses a lenient parser, and won't + // fail to parse URLs, so the test must allow for either outcome. + XCTAssertNotNil(result) + XCTAssertFalse(result?.boolValue ?? true) + XCTAssertNil(error) + } else { + XCTAssertNil(result) + XCTAssertNotNil(error) + XCTAssertEqual(error?.code, "argument_error") + XCTAssertEqual(error?.message, "Unable to parse URL") + XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces") + } expectation.fulfill() } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m index a89bf338c3fe..1a4d6635e7cc 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m @@ -56,7 +56,6 @@ - (void)testLoadRequest { - (void)testLoadRequestWithInvalidUrl { FWFWebView *mockWebView = OCMClassMock([FWFWebView class]); - OCMReject([mockWebView loadRequest:OCMOCK_ANY]); FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init]; [instanceManager addDartCreatedInstance:mockWebView withIdentifier:0]; @@ -65,16 +64,24 @@ - (void)testLoadRequestWithInvalidUrl { initWithBinaryMessenger:OCMProtocolMock(@protocol(FlutterBinaryMessenger)) instanceManager:instanceManager]; + NSString *badURLString = @"%invalidUrl%"; FlutterError *error; - FWFNSUrlRequestData *requestData = [FWFNSUrlRequestData makeWithUrl:@"%invalidUrl%" + FWFNSUrlRequestData *requestData = [FWFNSUrlRequestData makeWithUrl:badURLString httpMethod:nil httpBody:nil allHttpHeaderFields:@{}]; [hostAPI loadRequestForWebViewWithIdentifier:@0 request:requestData error:&error]; - XCTAssertNotNil(error); - XCTAssertEqualObjects(error.code, @"FWFURLRequestParsingError"); - XCTAssertEqualObjects(error.message, @"Failed instantiating an NSURLRequest."); - XCTAssertEqualObjects(error.details, @"URL was: '%invalidUrl%'"); + // When linking against the iOS 17 SDK or later, NSURL uses a lenient parser, and won't + // fail to parse URLs, so the test must allow for either outcome. + if (error) { + XCTAssertEqualObjects(error.code, @"FWFURLRequestParsingError"); + XCTAssertEqualObjects(error.message, @"Failed instantiating an NSURLRequest."); + XCTAssertEqualObjects(error.details, @"URL was: '%invalidUrl%'"); + } else { + NSMutableURLRequest *request = + [NSMutableURLRequest requestWithURL:[NSURL URLWithString:badURLString]]; + OCMVerify([mockWebView loadRequest:request]); + } } - (void)testSetCustomUserAgent {