import XCTest final class StubURLProtocolTests: XCTestCase { private func makeSession() -> URLSession { let cfg = URLSessionConfiguration.ephemeral cfg.protocolClasses = [StubURLProtocol.self] return URLSession(configuration: cfg) } override func tearDown() { StubURLProtocol.reset() super.tearDown() } func testReplaysCannedResponseAndCapturesRequest() async throws { var stub = StubURLProtocol.Stub() stub.statusCode = 201 stub.body = Data(#"{"ok":true}"#.utf8) StubURLProtocol.setStub(stub) var request = URLRequest(url: URL(string: "https://example.com/things")!) request.httpMethod = "POST" request.httpBody = Data(#"{"name":"x"}"#.utf8) let (data, response) = try await makeSession().data(for: request) XCTAssertEqual((response as? HTTPURLResponse)?.statusCode, 201) XCTAssertEqual(String(data: data, encoding: .utf8), #"{"ok":true}"#) XCTAssertEqual(StubURLProtocol.requestCount, 1) XCTAssertEqual(StubURLProtocol.capturedRequests.first?.httpMethod, "POST") XCTAssertEqual(StubURLProtocol.lastCapturedBody, Data(#"{"name":"x"}"#.utf8)) } func testReplaysError() async { var stub = StubURLProtocol.Stub() stub.error = URLError(.notConnectedToInternet) StubURLProtocol.setStub(stub) do { _ = try await makeSession().data(for: URLRequest(url: URL(string: "https://example.com")!)) XCTFail("expected throw") } catch { XCTAssertEqual((error as? URLError)?.code, .notConnectedToInternet) } } }