48 lines
1.6 KiB
Swift
48 lines
1.6 KiB
Swift
|
|
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)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|