Skip to content

Commit

Permalink
Fix async timing bug and refactor websocket protocol tests
Browse files Browse the repository at this point in the history
  • Loading branch information
calvincestari committed Feb 25, 2022
1 parent 2a92350 commit 209c7a0
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 134 deletions.
4 changes: 4 additions & 0 deletions Apollo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@
E63C03DF27BDDC3D00D675C6 /* SubscriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63C03DD27BDDC3400D675C6 /* SubscriptionTests.swift */; };
E63C03E227BDE00400D675C6 /* SubscriptionAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6A901D427BDAFA100931C9E /* SubscriptionAPI.framework */; };
E63C67A327C8AA2A00B1654E /* OperationMessageMatchers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E658546527C6277600339378 /* OperationMessageMatchers.swift */; };
E63F15CD27C96D6D006879ED /* WSProtocolTestsBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63F15CC27C96D6D006879ED /* WSProtocolTestsBase.swift */; };
E657CDBA26FD01D4005834D6 /* ApolloSchemaInternalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E657CDB926FD01D4005834D6 /* ApolloSchemaInternalTests.swift */; };
E658545B27C5C1EE00339378 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = E658545A27C5C1EE00339378 /* Nimble */; };
E658545C27C5CA1C00339378 /* SubscriptionAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6A901D427BDAFA100931C9E /* SubscriptionAPI.framework */; };
Expand Down Expand Up @@ -851,6 +852,7 @@
E63C03D627BDBA8900D675C6 /* operation_ids.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = operation_ids.json; sourceTree = "<group>"; };
E63C03DB27BDD99100D675C6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E63C03DD27BDDC3400D675C6 /* SubscriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionTests.swift; sourceTree = "<group>"; };
E63F15CC27C96D6D006879ED /* WSProtocolTestsBase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WSProtocolTestsBase.swift; sourceTree = "<group>"; };
E657CDB926FD01D4005834D6 /* ApolloSchemaInternalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloSchemaInternalTests.swift; sourceTree = "<group>"; };
E658545D27C6028100339378 /* MockWebSocketDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockWebSocketDelegate.swift; sourceTree = "<group>"; };
E658546527C6277600339378 /* OperationMessageMatchers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationMessageMatchers.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1816,6 +1818,7 @@
19E9F6AA26D58A92003AB80E /* OperationMessageIdCreatorTests.swift */,
E6B9BDDA27C5693300CF911D /* GraphqlWsProtocolTests.swift */,
E658546B27C77B8B00339378 /* GraphqlTransportWsProtocolTests.swift */,
E63F15CC27C96D6D006879ED /* WSProtocolTestsBase.swift */,
);
path = WebSocket;
sourceTree = "<group>";
Expand Down Expand Up @@ -2828,6 +2831,7 @@
9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */,
9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */,
DED45DE9261B96B70086EF63 /* LoadQueryFromStoreTests.swift in Sources */,
E63F15CD27C96D6D006879ED /* WSProtocolTestsBase.swift in Sources */,
9BF6C94325194DE2000D5B93 /* MultipartFormData+Testing.swift in Sources */,
DE181A3426C5D8D4000C0B9C /* CompressionTests.swift in Sources */,
19E9F6AC26D58A9A003AB80E /* OperationMessageIdCreatorTests.swift in Sources */,
Expand Down
72 changes: 4 additions & 68 deletions Tests/ApolloTests/WebSocket/GraphqlTransportWsProtocolTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,58 +5,7 @@ import Nimble
import Apollo
import SubscriptionAPI

class GraphqlTransportWsProtocolTests: XCTestCase {
private var store: ApolloStore!
private var mockWebSocket: MockWebSocket!
private var websocketTransport: WebSocketTransport! {
didSet {
if let websocketTransport = websocketTransport { // caters for tearDown setting nil value
websocketTransport.websocket.delegate = mockWebSocketDelegate
}
}
}
private var mockWebSocketDelegate: MockWebSocketDelegate!
private var client: ApolloClient!

override func setUp() {
super.setUp()

store = ApolloStore()
}

override func tearDown() {
client = nil
websocketTransport = nil
mockWebSocket = nil
mockWebSocketDelegate = nil
store = nil

super.tearDown()
}

// MARK: Helpers

private func buildWebSocket() {
var request = URLRequest(url: TestURL.mockServer.url)
request.setValue("graphql-transport-ws", forHTTPHeaderField: "Sec-WebSocket-Protocol")

mockWebSocketDelegate = MockWebSocketDelegate()
mockWebSocket = MockWebSocket(request: request)
websocketTransport = WebSocketTransport(websocket: mockWebSocket, store: store)
}

private func buildClient() {
client = ApolloClient(networkTransport: websocketTransport, store: store)
}

private func connectWebSocket() {
websocketTransport.socketConnectionState.mutate { $0 = .connected }
}

private func ackConnection() {
let ackMessage = OperationMessage(type: .connectionAck).rawMessage!
websocketTransport.websocketDidReceiveMessage(socket: mockWebSocket, text: ackMessage)
}
class GraphqlTransportWsProtocolTests: WSProtocolTestsBase {

// MARK: Initializer Tests

Expand Down Expand Up @@ -231,12 +180,11 @@ class GraphqlTransportWsProtocolTests: XCTestCase {
}
}

let message = OperationMessage(
self.sendAsync(message: OperationMessage(
payload: ["data": ["numberIncremented": 42]],
id: "1",
type: .next
).rawMessage!
self.websocketTransport.websocketDidReceiveMessage(socket: self.mockWebSocket, text: message)
))
}
}

Expand All @@ -256,19 +204,7 @@ class GraphqlTransportWsProtocolTests: XCTestCase {
}

// when
let message = OperationMessage(payload: ["sample": "data"], type: .ping).rawMessage!
self.websocketTransport.websocketDidReceiveMessage(socket: self.mockWebSocket, text: message)
self.sendAsync(message: OperationMessage(payload: ["sample": "data"], type: .ping))
}
}
}

private extension GraphQLOperation {
var requestBody: GraphQLMap {
ApolloRequestBodyCreator().requestBody(
for: self,
sendOperationIdentifiers: false,
sendQueryDocument: true,
autoPersistQuery: false
)
}
}
69 changes: 3 additions & 66 deletions Tests/ApolloTests/WebSocket/GraphqlWsProtocolTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,58 +5,7 @@ import Nimble
import Apollo
import SubscriptionAPI

class GraphqlWsProtocolTests: XCTestCase {
private var store: ApolloStore!
private var mockWebSocket: MockWebSocket!
private var websocketTransport: WebSocketTransport! {
didSet {
if let websocketTransport = websocketTransport { // caters for tearDown setting nil value
websocketTransport.websocket.delegate = mockWebSocketDelegate
}
}
}
private var mockWebSocketDelegate: MockWebSocketDelegate!
private var client: ApolloClient!

override func setUp() {
super.setUp()

store = ApolloStore()
}

override func tearDown() {
client = nil
websocketTransport = nil
mockWebSocket = nil
mockWebSocketDelegate = nil
store = nil

super.tearDown()
}

// MARK: Helpers

private func buildWebSocket() {
var request = URLRequest(url: TestURL.mockServer.url)
request.setValue("graphql-ws", forHTTPHeaderField: "Sec-WebSocket-Protocol")

mockWebSocketDelegate = MockWebSocketDelegate()
mockWebSocket = MockWebSocket(request: request)
websocketTransport = WebSocketTransport(websocket: mockWebSocket, store: store)
}

private func buildClient() {
client = ApolloClient(networkTransport: websocketTransport, store: store)
}

private func connectWebSocket() {
websocketTransport.socketConnectionState.mutate { $0 = .connected }
}

private func ackConnection() {
let ackMessage = OperationMessage(type: .connectionAck).rawMessage!
websocketTransport.websocketDidReceiveMessage(socket: mockWebSocket, text: ackMessage)
}
class GraphqlWsProtocolTests: WSProtocolTestsBase {

// MARK: Initializer Tests

Expand Down Expand Up @@ -231,23 +180,11 @@ class GraphqlWsProtocolTests: XCTestCase {
}
}

let message = OperationMessage(
self.sendAsync(message: OperationMessage(
payload: ["data": ["numberIncremented": 42]],
id: "1",
type: .data
).rawMessage!
self.websocketTransport.websocketDidReceiveMessage(socket: self.mockWebSocket, text: message)
))
}
}
}

private extension GraphQLOperation {
var requestBody: GraphQLMap {
ApolloRequestBodyCreator().requestBody(
for: self,
sendOperationIdentifiers: false,
sendQueryDocument: true,
autoPersistQuery: false
)
}
}
75 changes: 75 additions & 0 deletions Tests/ApolloTests/WebSocket/WSProtocolTestsBase.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import XCTest
@testable import ApolloWebSocket
import ApolloTestSupport
import Nimble
import Apollo
import SubscriptionAPI

class WSProtocolTestsBase: XCTestCase {
private var store: ApolloStore!
var mockWebSocket: MockWebSocket!
var websocketTransport: WebSocketTransport! {
didSet {
if let websocketTransport = websocketTransport { // caters for tearDown setting nil value
websocketTransport.websocket.delegate = mockWebSocketDelegate
}
}
}
var mockWebSocketDelegate: MockWebSocketDelegate!
var client: ApolloClient!

override func setUp() {
super.setUp()

store = ApolloStore()
}

override func tearDown() {
client = nil
websocketTransport = nil
mockWebSocket = nil
mockWebSocketDelegate = nil
store = nil

super.tearDown()
}

// MARK: Helpers

func buildWebSocket() {
var request = URLRequest(url: TestURL.mockServer.url)
request.setValue("graphql-ws", forHTTPHeaderField: "Sec-WebSocket-Protocol")

mockWebSocketDelegate = MockWebSocketDelegate()
mockWebSocket = MockWebSocket(request: request)
websocketTransport = WebSocketTransport(websocket: mockWebSocket, store: store)
}

func buildClient() {
client = ApolloClient(networkTransport: websocketTransport, store: store)
}

func connectWebSocket() {
websocketTransport.socketConnectionState.mutate { $0 = .connected }
}

func ackConnection() {
let ackMessage = OperationMessage(type: .connectionAck).rawMessage!
websocketTransport.websocketDidReceiveMessage(socket: mockWebSocket, text: ackMessage)
}

func sendAsync(message: OperationMessage) {
websocketTransport.websocketDidReceiveMessage(socket: mockWebSocket, text: message.rawMessage!)
}
}

extension GraphQLOperation {
var requestBody: GraphQLMap {
ApolloRequestBodyCreator().requestBody(
for: self,
sendOperationIdentifiers: false,
sendQueryDocument: true,
autoPersistQuery: false
)
}
}

0 comments on commit 209c7a0

Please sign in to comment.