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

Fix APQs Automatic persisted queries does not work with mutations #1110

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions Sources/Apollo/HTTPNetworkTransport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -343,13 +343,15 @@ public class HTTPNetworkTransport {
let sendQueryDocument: Bool
let autoPersistQueries: Bool
switch operation.operationType {
case .query:
case .query, .mutation:
if isPersistedQueryRetry {
useGetMethod = self.useGETForPersistedQueryRetry
useGetMethod = operation.operationType == .mutation ? false : self.useGETForPersistedQueryRetry
sendQueryDocument = true
autoPersistQueries = true
} else {
useGetMethod = self.useGETForQueries || (self.enableAutoPersistedQueries && self.useGETForPersistedQueryRetry)
useGetMethod = operation.operationType == .mutation ? false :
self.useGETForQueries ||
(self.enableAutoPersistedQueries && self.useGETForPersistedQueryRetry)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not a giant fan of these huge ternaries, but I'll deal with that post-merge.

sendQueryDocument = !self.enableAutoPersistedQueries
autoPersistQueries = self.enableAutoPersistedQueries
}
Expand Down
80 changes: 80 additions & 0 deletions Tests/ApolloTests/AutomaticPersistedQueriesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,67 @@ class AutomaticPersistedQueriesTests: XCTestCase {
line: line)
}
}

private func validatePostBody(with request: URLRequest,
mutation: CreateAwesomeReviewMutation,
queryDocument: Bool = false,
persistedQuery: Bool = false,
file: StaticString = #file,
line: UInt = #line) throws {

guard
let httpBody = request.httpBody,
let jsonBody = try? JSONSerializationFormat.deserialize(data: httpBody) as? JSONObject else {
XCTFail("httpBody invalid",
file: file,
line: line)
return
}

let queryString = jsonBody["query"] as? String
if queryDocument {
XCTAssertEqual(queryString,
mutation.queryDocument,
file: file,
line: line)
}

let ext = jsonBody["extensions"] as? JSONObject
if persistedQuery {
let ext = try XCTUnwrap(ext,
"extensions json data should not be nil",
file: file,
line: line)

let persistedQuery = try XCTUnwrap(ext["persistedQuery"] as? JSONObject,
"persistedQuery is missing",
file: file,
line: line)

let version = try XCTUnwrap(persistedQuery["version"] as? Int,
"version is missing",
file: file,
line: line)

let sha256Hash = try XCTUnwrap(persistedQuery["sha256Hash"] as? String,
"sha256Hash is missing",
file: file,
line: line)

XCTAssertEqual(version, 1,
file: file,
line: line)
XCTAssertEqual(sha256Hash,
mutation.operationIdentifier,
file: file,
line: line)
} else {
XCTAssertNil(ext,
"extensions should be nil",
file: file,
line: line)
}
}

private func validateUrlParams(with request: URLRequest,
query: HeroNameQuery,
Expand Down Expand Up @@ -220,6 +281,25 @@ class AutomaticPersistedQueriesTests: XCTestCase {
query: query,
persistedQuery: true)
}

func testMutationRequestBodyForAPQs() throws {
let mockSession = MockURLSession()
let network = HTTPNetworkTransport(url: URL(string: endpoint)!,
session: mockSession,
enableAutoPersistedQueries: true)
let mutation = CreateAwesomeReviewMutation()
let _ = network.send(operation: mutation) { _ in }

let request = try XCTUnwrap(mockSession.lastRequest,
"last request should not be nil")

XCTAssertEqual(request.url?.host, network.url.host)
XCTAssertEqual(request.httpMethod, "POST")

try self.validatePostBody(with: request,
mutation: mutation,
persistedQuery: true)
}

func testQueryStringForAPQsUseGetMethod() throws {
let mockSession = MockURLSession()
Expand Down