forked from apollographql/apollo-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWebSocketTests.swift
More file actions
125 lines (105 loc) · 3.33 KB
/
WebSocketTests.swift
File metadata and controls
125 lines (105 loc) · 3.33 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import XCTest
import Apollo
import ApolloTestSupport
@testable import ApolloWebSocket
import StarWarsAPI
extension WebSocketTransport {
func write(message: GraphQLMap) {
let serialized = try! JSONSerializationFormat.serialize(value: message)
if let str = String(data: serialized, encoding: .utf8) {
self.websocket.write(string: str)
}
}
}
class WebSocketTests: XCTestCase {
var networkTransport: WebSocketTransport!
var client: ApolloClient!
var websocket: MockWebSocket!
override func setUp() {
super.setUp()
let store = ApolloStore()
let websocket = MockWebSocket(request:URLRequest(url: TestURL.mockServer.url))
networkTransport = WebSocketTransport(websocket: websocket, store: store)
client = ApolloClient(networkTransport: networkTransport!, store: store)
}
override func tearDown() {
networkTransport = nil
client = nil
websocket = nil
super.tearDown()
}
func testLocalSingleSubscription() throws {
let expectation = self.expectation(description: "Single subscription")
client.subscribe(subscription: ReviewAddedSubscription()) { result in
defer { expectation.fulfill() }
switch result {
case .success(let graphQLResult):
XCTAssertEqual(graphQLResult.data?.reviewAdded?.stars, 5)
case .failure(let error):
XCTFail("Unexpected error: \(error)")
}
}
let message : GraphQLMap = [
"type": "data",
"id": "1",
"payload": [
"data": [
"reviewAdded": [
"__typename": "ReviewAdded",
"episode": "JEDI",
"stars": 5,
"commentary": "A great movie"
]
]
]
]
networkTransport.write(message: message)
waitForExpectations(timeout: 5, handler: nil)
}
func testLocalMissingSubscription() throws {
let expectation = self.expectation(description: "Missing subscription")
expectation.isInverted = true
client.subscribe(subscription: ReviewAddedSubscription()) { _ in
expectation.fulfill()
}
waitForExpectations(timeout: 2, handler: nil)
}
func testLocalErrorUnknownId() throws {
let expectation = self.expectation(description: "Unknown id for subscription")
client.subscribe(subscription: ReviewAddedSubscription()) { result in
defer { expectation.fulfill() }
switch result {
case .success:
XCTFail("This should have caused an error!")
case .failure(let error):
if let webSocketError = error as? WebSocketError {
switch webSocketError.kind {
case .unprocessedMessage:
// Correct!
break
default:
XCTFail("Unexpected websocket error: \(error)")
}
} else {
XCTFail("Unexpected error: \(error)")
}
}
}
let message : GraphQLMap = [
"type": "data",
"id": "2", // subscribing on id = 1, i.e. expecting error when receiving id = 2
"payload": [
"data": [
"reviewAdded": [
"__typename": "ReviewAdded",
"episode": "JEDI",
"stars": 5,
"commentary": "A great movie"
]
]
]
]
networkTransport.write(message: message)
waitForExpectations(timeout: 2, handler: nil)
}
}