Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introducing delegate if there is GraphQL errors #770

Merged
Prev Previous commit
Next Next commit
Added tests for HTTPNetworkTransportGraphQLErrorDelegate
  • Loading branch information
kimdv committed Oct 29, 2019
commit 18f25da9ea74dec27e369bb7f402e50ee2949667
8 changes: 7 additions & 1 deletion Tests/ApolloTestSupport/MockURLSession.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,25 @@ import Foundation

public final class MockURLSession: URLSession {
public private (set) var lastRequest: URLRequest?


public var data: Data?
public var response: URLResponse?
public var error: Error?

override public func dataTask(with request: URLRequest) -> URLSessionDataTask {
lastRequest = request
return URLSessionDataTaskMock()
}

override public func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
lastRequest = request
completionHandler(data, response, error)
return URLSessionDataTaskMock()
}
}

private final class URLSessionDataTaskMock: URLSessionDataTask {
override func resume() {

}
}
57 changes: 56 additions & 1 deletion Tests/ApolloTests/HTTPTransportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import XCTest
@testable import Apollo
import StarWarsAPI
import ApolloTestSupport

class HTTPTransportTests: XCTestCase {

Expand All @@ -23,6 +24,8 @@ class HTTPTransportTests: XCTestCase {
private var shouldModifyURLInWillSend = false
private var retryCount = 0

private var graphQlErrors = [GraphQLError]()

private lazy var url = URL(string: "http://localhost:8080/graphql")!
private lazy var networkTransport = HTTPNetworkTransport(url: self.url,
useGETForQueries: true,
Expand Down Expand Up @@ -59,7 +62,7 @@ class HTTPTransportTests: XCTestCase {
line: line)
}
}

func testPreflightDelegateTellingRequestNotToSend() {
self.shouldSend = false

Expand Down Expand Up @@ -193,6 +196,50 @@ class HTTPTransportTests: XCTestCase {
delegate: self)
XCTAssertNotEqual(self.networkTransport, nonIdenticalTransport)
}

func testErrorDelegateWithErrors() throws {
self.graphQlErrors = []
let query = HeroNameQuery()
let body = ["errors": [["message": "Test graphql error"]]]

let mockSession = MockURLSession()
mockSession.response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)
mockSession.data = try JSONSerialization.data(withJSONObject: body, options: .prettyPrinted)
let network = HTTPNetworkTransport(url: url, session: mockSession, delegate: self)

let _ = network.send(operation: query) { _ in }

guard let request = mockSession.lastRequest else {
XCTFail("last request should not be nil")
return
}
XCTAssertEqual(request.url?.host, network.url.host)
XCTAssertEqual(request.httpMethod, "POST")

XCTAssertEqual(self.graphQlErrors.count, 1)
}

func testErrorDelegateWithNoErrors() throws {
self.graphQlErrors = []
let query = HeroNameQuery()
let body = ["errors": []]

let mockSession = MockURLSession()
mockSession.response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)
mockSession.data = try JSONSerialization.data(withJSONObject: body, options: .prettyPrinted)
let network = HTTPNetworkTransport(url: url, session: mockSession, delegate: self)

let _ = network.send(operation: query) { _ in }

guard let request = mockSession.lastRequest else {
XCTFail("last request should not be nil")
return
}
XCTAssertEqual(request.url?.host, network.url.host)
XCTAssertEqual(request.httpMethod, "POST")

XCTAssertEqual(self.graphQlErrors.count, 0)
}
}

// MARK: - HTTPNetworkTransportPreflightDelegate
Expand Down Expand Up @@ -266,3 +313,11 @@ extension HTTPTransportTests: HTTPNetworkTransportRetryDelegate {
}
}
}

// MARK: - HTTPNetworkTransportGraphQLErrorDelegate

extension HTTPTransportTests: HTTPNetworkTransportGraphQLErrorDelegate {
func networkTransport(_ networkTransport: HTTPNetworkTransport, receivedGraphQLErrors errors: [GraphQLError], retryHandler: @escaping (Bool) -> Void) {
self.graphQlErrors = errors
}
}