-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraphQLNetworkObserverTests.swift
More file actions
107 lines (87 loc) · 3.66 KB
/
Copy pathGraphQLNetworkObserverTests.swift
File metadata and controls
107 lines (87 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
@testable import GraphQLAPIKit
import XCTest
final class GraphQLNetworkObserverTests: XCTestCase {
private var testURL: URL {
guard let url = URL(string: "https://api.example.com/graphql") else {
preconditionFailure("Invalid test URL")
}
return url
}
// MARK: - MockObserver
// swiftlint:disable nesting
final class MockObserver: GraphQLNetworkObserver {
struct Context: Sendable {
// swiftlint:enable nesting
let requestId: String
let startTime: Date
}
var willSendRequestCalled = false
var didReceiveResponseCalled = false
var didFailCalled = false
var lastRequest: URLRequest?
var lastResponse: URLResponse?
var lastData: Data?
var lastError: Error?
func willSendRequest(_ request: URLRequest) -> Context {
willSendRequestCalled = true
lastRequest = request
return Context(requestId: UUID().uuidString, startTime: Date())
}
func didReceiveResponse(
for request: URLRequest,
response: URLResponse?,
data: Data?,
context: Context
) {
didReceiveResponseCalled = true
lastResponse = response
lastData = data
}
func didFail(request: URLRequest, error: Error, context: Context) {
didFailCalled = true
lastError = error
}
}
// MARK: - Observer Protocol Tests
func testProtocolMethodSignatures() {
let observer = MockObserver()
var request = URLRequest(url: testURL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer test-token", forHTTPHeaderField: "Authorization")
// Test willSendRequest returns Context
let context = observer.willSendRequest(request)
XCTAssertTrue(observer.willSendRequestCalled)
XCTAssertNotNil(context.requestId)
XCTAssertEqual(observer.lastRequest?.url, testURL)
XCTAssertEqual(observer.lastRequest?.httpMethod, "POST")
XCTAssertEqual(observer.lastRequest?.value(forHTTPHeaderField: "Content-Type"), "application/json")
XCTAssertEqual(observer.lastRequest?.value(forHTTPHeaderField: "Authorization"), "Bearer test-token")
// Test didReceiveResponse
observer.didReceiveResponse(for: request, response: nil, data: nil, context: context)
XCTAssertTrue(observer.didReceiveResponseCalled)
// Test didFail
observer.didFail(request: request, error: NSError(domain: "Test", code: 1), context: context)
XCTAssertTrue(observer.didFailCalled)
}
func testObserverContextContainsTimingInfo() {
let observer = MockObserver()
let request = URLRequest(url: testURL)
let beforeTime = Date()
let context = observer.willSendRequest(request)
let afterTime = Date()
// Verify context contains start time within expected range
XCTAssertGreaterThanOrEqual(context.startTime, beforeTime)
XCTAssertLessThanOrEqual(context.startTime, afterTime)
}
func testObserverContextRequestIdIsUnique() {
let observer = MockObserver()
let request = URLRequest(url: testURL)
let context1 = observer.willSendRequest(request)
let context2 = observer.willSendRequest(request)
let context3 = observer.willSendRequest(request)
XCTAssertNotEqual(context1.requestId, context2.requestId)
XCTAssertNotEqual(context2.requestId, context3.requestId)
XCTAssertNotEqual(context1.requestId, context3.requestId)
}
}