From 4a85982260827d9e05e60911f20591a6c3ac9151 Mon Sep 17 00:00:00 2001 From: Chris Eidhof Date: Wed, 25 Sep 2024 11:46:27 +0200 Subject: [PATCH] Getting ready for Swift 6 --- Package.swift | 8 ++- Sources/TinyNetworking/Endpoint.swift | 62 ----------------- Tests/LinuxMain.swift | 7 -- .../TinyHTTPStubURLProtocol.swift | 35 ---------- .../TinyNetworkingTests.swift | 7 +- .../URLSessionIntegrationTests.swift | 69 ------------------- .../TinyNetworkingTests/XCTestManifests.swift | 10 --- 7 files changed, 7 insertions(+), 191 deletions(-) delete mode 100644 Tests/LinuxMain.swift delete mode 100644 Tests/TinyNetworkingTests/TinyHTTPStubURLProtocol.swift delete mode 100644 Tests/TinyNetworkingTests/URLSessionIntegrationTests.swift delete mode 100644 Tests/TinyNetworkingTests/XCTestManifests.swift diff --git a/Package.swift b/Package.swift index 161c829..781ec45 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.5 +// swift-tools-version:6.0 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -15,7 +15,11 @@ let package = Package( targets: [ .target( name: "TinyNetworking", - dependencies: []), + dependencies: [], + swiftSettings: [ + .enableExperimentalFeature("StrictConcurrency") + ] + ), .testTarget( name: "TinyNetworkingTests", dependencies: ["TinyNetworking"]), diff --git a/Sources/TinyNetworking/Endpoint.swift b/Sources/TinyNetworking/Endpoint.swift index 4b83c09..944b014 100644 --- a/Sources/TinyNetworking/Endpoint.swift +++ b/Sources/TinyNetworking/Endpoint.swift @@ -220,68 +220,6 @@ public struct WrongStatusCodeError: Error { } } -extension URLSession { - @discardableResult - /// Loads an endpoint by creating (and directly resuming) a data task. - /// - /// - Parameters: - /// - e: The endpoint. - /// - onComplete: The completion handler. - /// - Returns: The data task. - public func load(_ e: Endpoint, onComplete: @escaping (Result) -> ()) -> URLSessionDataTask { - let r = e.request - let task = dataTask(with: r, completionHandler: { data, resp, err in - if let err = err { - onComplete(.failure(err)) - return - } - - guard let h = resp as? HTTPURLResponse else { - onComplete(.failure(UnknownError())) - return - } - - guard e.expectedStatusCode(h.statusCode) else { - onComplete(.failure(WrongStatusCodeError(statusCode: h.statusCode, response: h, responseBody: data))) - return - } - - onComplete(e.parse(data,resp)) - }) - task.resume() - return task - } -} - -#if canImport(Combine) -import Combine - -@available(iOS 13, macOS 10.15, watchOS 6, tvOS 13, *) -extension URLSession { - /// Returns a publisher that wraps a URL session data task for a given Endpoint. - /// - /// - Parameters: - /// - e: The endpoint. - /// - Returns: The publisher of a dataTask. - public func load(_ e: Endpoint) -> AnyPublisher { - let r = e.request - return dataTaskPublisher(for: r) - .tryMap { data, resp in - guard let h = resp as? HTTPURLResponse else { - throw UnknownError() - } - - guard e.expectedStatusCode(h.statusCode) else { - throw WrongStatusCodeError(statusCode: h.statusCode, response: h, responseBody: data) - } - - return try e.parse(data, resp).get() - } - .eraseToAnyPublisher() - } -} -#endif - #if swift(>=5.5) && canImport(Darwin) @available(iOS 15, macOS 12.0, watchOS 8, tvOS 15, *) public extension URLSession { diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift deleted file mode 100644 index dbf74c0..0000000 --- a/Tests/LinuxMain.swift +++ /dev/null @@ -1,7 +0,0 @@ -import XCTest - -import TinyNetworkingTests - -var tests = [XCTestCaseEntry]() -tests += TinyNetworkingTests.allTests() -XCTMain(tests) diff --git a/Tests/TinyNetworkingTests/TinyHTTPStubURLProtocol.swift b/Tests/TinyNetworkingTests/TinyHTTPStubURLProtocol.swift deleted file mode 100644 index aadac29..0000000 --- a/Tests/TinyNetworkingTests/TinyHTTPStubURLProtocol.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation - -struct StubbedResponse { - let response: HTTPURLResponse - let data: Data -} - -class TinyHTTPStubURLProtocol: URLProtocol { - static var urls = [URL: StubbedResponse]() - - override class func canInit(with request: URLRequest) -> Bool { - guard let url = request.url else { return false } - return urls.keys.contains(url) - } - - override class func canonicalRequest(for request: URLRequest) -> URLRequest { - return request - } - - override class func requestIsCacheEquivalent(_: URLRequest, to _: URLRequest) -> Bool { - return false - } - - override func startLoading() { - guard let client = client, let url = request.url, let stub = TinyHTTPStubURLProtocol.urls[url] else { - fatalError() - } - - client.urlProtocol(self, didReceive: stub.response, cacheStoragePolicy: .notAllowed) - client.urlProtocol(self, didLoad: stub.data) - client.urlProtocolDidFinishLoading(self) - } - - override func stopLoading() {} -} diff --git a/Tests/TinyNetworkingTests/TinyNetworkingTests.swift b/Tests/TinyNetworkingTests/TinyNetworkingTests.swift index ecb37ff..f34c4e4 100644 --- a/Tests/TinyNetworkingTests/TinyNetworkingTests.swift +++ b/Tests/TinyNetworkingTests/TinyNetworkingTests.swift @@ -1,6 +1,7 @@ @testable import TinyNetworking import XCTest +@MainActor final class TinyNetworkingTests: XCTestCase { func testUrlWithoutParams() { let url = URL(string: "http://www.example.com/example.json")! @@ -19,10 +20,4 @@ final class TinyNetworkingTests: XCTestCase { let endpoint = Endpoint<[String]>(json: .get, url: url, query: ["foo": "bar bar"]) XCTAssertEqual(URL(string: "http://www.example.com/example.json?abc=def&foo=bar%20bar")!, endpoint.request.url) } - - static var allTests = [ - ("testUrlWithoutParams", testUrlWithoutParams), - ("testUrlWithParams", testUrlWithParams), - ("testUrlAdditionalParams", testUrlAdditionalParams), - ] } diff --git a/Tests/TinyNetworkingTests/URLSessionIntegrationTests.swift b/Tests/TinyNetworkingTests/URLSessionIntegrationTests.swift deleted file mode 100644 index 419ff05..0000000 --- a/Tests/TinyNetworkingTests/URLSessionIntegrationTests.swift +++ /dev/null @@ -1,69 +0,0 @@ -@testable import TinyNetworking -import XCTest - -final class URLSessionIntegrationTests: XCTestCase { - override func setUp() { - super.setUp() - URLProtocol.registerClass(TinyHTTPStubURLProtocol.self) - } - - override func tearDown() { - super.tearDown() - URLProtocol.unregisterClass(TinyHTTPStubURLProtocol.self) - } - - func testDataTaskRequest() throws { - let url = URL(string: "http://www.example.com/example.json")! - - TinyHTTPStubURLProtocol.urls[url] = StubbedResponse(response: HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)!, data: exampleJSON.data(using: .utf8)!) - - let endpoint = Endpoint<[Person]>(json: .get, url: url) - let expectation = self.expectation(description: "Stubbed network call") - - let task = URLSession.shared.load(endpoint) { result in - switch result { - case let .success(payload): - XCTAssertEqual([Person(name: "Alice"), Person(name: "Bob")], payload) - expectation.fulfill() - case let .failure(error): - XCTFail(String(describing: error)) - } - } - - task.resume() - - wait(for: [expectation], timeout: 1) - } - - func testWrongStatusCodeErrorIncludesResponseBody() throws { - let url = URL(string: "http://www.example.com/internal-error.json")! - let internalErrorResponse = "{ message: \"Some troubleshooting message from the server.\" }".data(using: .utf8)! - - TinyHTTPStubURLProtocol.urls[url] = StubbedResponse(response: HTTPURLResponse(url: url, statusCode: 500, httpVersion: nil, headerFields: nil)!, data: internalErrorResponse) - - let endpoint = Endpoint<[Person]>(json: .get, url: url) - let expectation = self.expectation(description: "Stubbed network call") - - let task = URLSession.shared.load(endpoint) { result in - switch result { - case .success: - XCTFail("Expected an Error in Result.") - case let .failure(error): - XCTAssertNotNil(error as? WrongStatusCodeError) - if let error = error as? WrongStatusCodeError { - XCTAssertNotNil(error.responseBody) - } - expectation.fulfill() - } - } - - task.resume() - - wait(for: [expectation], timeout: 1) - } - - static var allTests = [ - ("testDataTaskRequest", testDataTaskRequest), - ("testWrongStatusCodeErrorIncludesResponseBody", testWrongStatusCodeErrorIncludesResponseBody) - ] -} diff --git a/Tests/TinyNetworkingTests/XCTestManifests.swift b/Tests/TinyNetworkingTests/XCTestManifests.swift deleted file mode 100644 index 28ff178..0000000 --- a/Tests/TinyNetworkingTests/XCTestManifests.swift +++ /dev/null @@ -1,10 +0,0 @@ -import XCTest - -#if !canImport(ObjectiveC) - public func allTests() -> [XCTestCaseEntry] { - return [ - testCase(TinyNetworkingTests.allTests), - testCase(URLSessionIntegrationTests.allTests), - ] - } -#endif