diff --git a/Sources/Apollo/RequestBodyCreator.swift b/Sources/Apollo/RequestBodyCreator.swift index cf3db4835e..d92ab30fd2 100644 --- a/Sources/Apollo/RequestBodyCreator.swift +++ b/Sources/Apollo/RequestBodyCreator.swift @@ -8,7 +8,9 @@ public protocol RequestBodyCreator { /// /// - Parameters: /// - operation: The operation to use - /// - sendOperationIdentifiers: Whether or not to send operation identifiers. Defaults to false. + /// - sendOperationIdentifiers: Whether or not to send operation identifiers. Should default to `false`. + /// - sendQueryDocument: Whether or not to send the full query document. Should default to `true`. + /// - autoPersistQuery: Whether to use auto-persisted query information. Should default to `false`. /// - Returns: The created `GraphQLMap` func requestBody(for operation: Operation, sendOperationIdentifiers: Bool, @@ -16,19 +18,14 @@ public protocol RequestBodyCreator { autoPersistQuery: Bool) -> GraphQLMap } +// MARK: - Default Implementation + extension RequestBodyCreator { - /// Creates a `GraphQLMap` out of the passed-in operation - /// - /// - Parameters: - /// - operation: The operation to use - /// - sendOperationIdentifiers: Whether or not to send operation identifiers. Defaults to false. - /// - sendQueryDocument: Whether or not to send the full query document. Defaults to true. - /// - autoPersistQuery: Whether to use auto-persisted query information. Defaults to false. - /// - Returns: The created `GraphQLMap` + public func requestBody(for operation: Operation, - sendOperationIdentifiers: Bool = false, - sendQueryDocument: Bool = true, - autoPersistQuery: Bool = false) -> GraphQLMap { + sendOperationIdentifiers: Bool, + sendQueryDocument: Bool, + autoPersistQuery: Bool) -> GraphQLMap { var body: GraphQLMap = [ "variables": operation.variables, "operationName": operation.operationName, diff --git a/Sources/Apollo/UploadRequest.swift b/Sources/Apollo/UploadRequest.swift index f088b81ea2..ae0cbd7b1f 100644 --- a/Sources/Apollo/UploadRequest.swift +++ b/Sources/Apollo/UploadRequest.swift @@ -69,7 +69,10 @@ open class UploadRequest: HTTPRequest { // Make sure all fields for files are set to null, or the server won't look // for the files in the rest of the form data let fieldsForFiles = Set(files.map { $0.fieldName }).sorted() - var fields = self.requestBodyCreator.requestBody(for: operation, sendOperationIdentifiers: shouldSendOperationID) + var fields = self.requestBodyCreator.requestBody(for: operation, + sendOperationIdentifiers: shouldSendOperationID, + sendQueryDocument: true, + autoPersistQuery: false) var variables = fields["variables"] as? GraphQLMap ?? GraphQLMap() for fieldName in fieldsForFiles { if diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index f4abfac697..2ca0149661 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -270,7 +270,10 @@ public class WebSocketTransport { } func sendHelper(operation: Operation, resultHandler: @escaping (_ result: Result) -> Void) -> String? { - let body = requestBodyCreator.requestBody(for: operation, sendOperationIdentifiers: self.sendOperationIdentifiers) + let body = requestBodyCreator.requestBody(for: operation, + sendOperationIdentifiers: self.sendOperationIdentifiers, + sendQueryDocument: true, + autoPersistQuery: false) let sequenceNumber = "\(sequenceNumberCounter.increment())" guard let message = OperationMessage(payload: body, id: sequenceNumber).rawMessage else { diff --git a/Tests/ApolloTests/GETTransformerTests.swift b/Tests/ApolloTests/GETTransformerTests.swift index 382b66218a..a12f8000c2 100644 --- a/Tests/ApolloTests/GETTransformerTests.swift +++ b/Tests/ApolloTests/GETTransformerTests.swift @@ -17,7 +17,10 @@ class GETTransformerTests: XCTestCase { func testEncodingQueryWithSingleParameter() { let operation = HeroNameQuery(episode: .empire) - let body = requestBodyCreator.requestBody(for: operation, sendOperationIdentifiers: false) + let body = requestBodyCreator.requestBody(for: operation, + sendOperationIdentifiers: false, + sendQueryDocument: true, + autoPersistQuery: false) let transformer = GraphQLGETTransformer(body: body, url: self.url) @@ -28,7 +31,10 @@ class GETTransformerTests: XCTestCase { func testEncodingQueryWithMoreThanOneParameterIncludingNonHashableValue() throws { let operation = HeroNameTypeSpecificConditionalInclusionQuery(episode: .jedi, includeName: true) - let body = requestBodyCreator.requestBody(for: operation, sendOperationIdentifiers: false) + let body = requestBodyCreator.requestBody(for: operation, + sendOperationIdentifiers: false, + sendQueryDocument: true, + autoPersistQuery: false) let transformer = GraphQLGETTransformer(body: body, url: self.url) @@ -195,7 +201,10 @@ class GETTransformerTests: XCTestCase { func testEncodingQueryWithNullDefaultParameter() { let operation = HeroNameQuery() - let body = requestBodyCreator.requestBody(for: operation, sendOperationIdentifiers: false) + let body = requestBodyCreator.requestBody(for: operation, + sendOperationIdentifiers: false, + sendQueryDocument: true, + autoPersistQuery: false) let transformer = GraphQLGETTransformer(body: body, url: self.url) diff --git a/Tests/ApolloTests/RequestBodyCreatorTests.swift b/Tests/ApolloTests/RequestBodyCreatorTests.swift index e19a084690..e0deb585c0 100644 --- a/Tests/ApolloTests/RequestBodyCreatorTests.swift +++ b/Tests/ApolloTests/RequestBodyCreatorTests.swift @@ -15,18 +15,25 @@ class RequestBodyCreatorTests: XCTestCase { private let customRequestBodyCreator = TestCustomRequestBodyCreator() private let apolloRequestBodyCreator = ApolloRequestBodyCreator() + func create(with creator: RequestBodyCreator, for query: Operation) -> GraphQLMap { + creator.requestBody(for: query, + sendOperationIdentifiers: false, + sendQueryDocument: true, + autoPersistQuery: false) + } + // MARK: - Tests func testRequestBodyWithApolloRequestBodyCreator() { let query = HeroNameQuery() - let req = apolloRequestBodyCreator.requestBody(for: query, sendOperationIdentifiers: false) + let req = self.create(with: apolloRequestBodyCreator, for: query) XCTAssertEqual(query.queryDocument, req["query"] as? String) } func testRequestBodyWithCustomRequestBodyCreator() { let query = HeroNameQuery() - let req = customRequestBodyCreator.requestBody(for: query, sendOperationIdentifiers: false) + let req = self.create(with: customRequestBodyCreator, for: query) XCTAssertEqual(query.queryDocument, req["test_query"] as? String) } diff --git a/Tests/ApolloTests/TestCustomRequestBodyCreator.swift b/Tests/ApolloTests/TestCustomRequestBodyCreator.swift index 45233b809f..982199a6db 100644 --- a/Tests/ApolloTests/TestCustomRequestBodyCreator.swift +++ b/Tests/ApolloTests/TestCustomRequestBodyCreator.swift @@ -9,7 +9,11 @@ import Apollo struct TestCustomRequestBodyCreator: RequestBodyCreator { - public func requestBody(for operation: Operation, sendOperationIdentifiers: Bool) -> GraphQLMap { + func requestBody( + for operation: Operation, + sendOperationIdentifiers: Bool, + sendQueryDocument: Bool, autoPersistQuery: Bool) -> GraphQLMap { + var body: GraphQLMap = [ "test_variables": operation.variables, "test_operationName": operation.operationName,