diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 15651e35e8..82cba2fcd1 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -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 */; }; @@ -851,6 +852,7 @@ E63C03D627BDBA8900D675C6 /* operation_ids.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = operation_ids.json; sourceTree = ""; }; E63C03DB27BDD99100D675C6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E63C03DD27BDDC3400D675C6 /* SubscriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionTests.swift; sourceTree = ""; }; + E63F15CC27C96D6D006879ED /* WSProtocolTestsBase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WSProtocolTestsBase.swift; sourceTree = ""; }; E657CDB926FD01D4005834D6 /* ApolloSchemaInternalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloSchemaInternalTests.swift; sourceTree = ""; }; E658545D27C6028100339378 /* MockWebSocketDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockWebSocketDelegate.swift; sourceTree = ""; }; E658546527C6277600339378 /* OperationMessageMatchers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationMessageMatchers.swift; sourceTree = ""; }; @@ -1816,6 +1818,7 @@ 19E9F6AA26D58A92003AB80E /* OperationMessageIdCreatorTests.swift */, E6B9BDDA27C5693300CF911D /* GraphqlWsProtocolTests.swift */, E658546B27C77B8B00339378 /* GraphqlTransportWsProtocolTests.swift */, + E63F15CC27C96D6D006879ED /* WSProtocolTestsBase.swift */, ); path = WebSocket; sourceTree = ""; @@ -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 */, diff --git a/Tests/ApolloTests/WebSocket/GraphqlTransportWsProtocolTests.swift b/Tests/ApolloTests/WebSocket/GraphqlTransportWsProtocolTests.swift index 979dc89ae0..191b6fb301 100644 --- a/Tests/ApolloTests/WebSocket/GraphqlTransportWsProtocolTests.swift +++ b/Tests/ApolloTests/WebSocket/GraphqlTransportWsProtocolTests.swift @@ -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 @@ -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) + )) } } @@ -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 - ) - } -} diff --git a/Tests/ApolloTests/WebSocket/GraphqlWsProtocolTests.swift b/Tests/ApolloTests/WebSocket/GraphqlWsProtocolTests.swift index 50fab1e7df..a917457a6c 100644 --- a/Tests/ApolloTests/WebSocket/GraphqlWsProtocolTests.swift +++ b/Tests/ApolloTests/WebSocket/GraphqlWsProtocolTests.swift @@ -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 @@ -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 - ) - } -} diff --git a/Tests/ApolloTests/WebSocket/WSProtocolTestsBase.swift b/Tests/ApolloTests/WebSocket/WSProtocolTestsBase.swift new file mode 100644 index 0000000000..91c09c28ac --- /dev/null +++ b/Tests/ApolloTests/WebSocket/WSProtocolTestsBase.swift @@ -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 + ) + } +}