From c43f880e2eee0d30410d3f554a75f88cfe9131ac Mon Sep 17 00:00:00 2001 From: diegorozen Date: Wed, 16 Jan 2019 12:30:56 -0500 Subject: [PATCH] =?UTF-8?q?Fixes=20#435=20Invoking=20Query.Data(jsonObject?= =?UTF-8?q?:)=20fails=20for=20queries=20with=20params=20=E2=80=A6=20(#437)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apollo.xcodeproj/project.pbxproj | 4 ++ Sources/Apollo/GraphQLSelectionSet.swift | 4 +- .../QueryFromJSONBuildingTests.swift | 53 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 Tests/ApolloTests/QueryFromJSONBuildingTests.swift diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 551ff7ccb3..3d2d94a754 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -95,6 +95,7 @@ 9FF90A711DDDEB420034C3B6 /* ReadFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6B1DDDEB420034C3B6 /* ReadFieldValueTests.swift */; }; 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */; }; E86D8E05214B32FD0028EFE1 /* JSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E86D8E03214B32DA0028EFE1 /* JSONTests.swift */; }; + F16D083C21EF6F7300C458B8 /* QueryFromJSONBuildingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16D083B21EF6F7300C458B8 /* QueryFromJSONBuildingTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -333,6 +334,7 @@ 9FF90A6B1DDDEB420034C3B6 /* ReadFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadFieldValueTests.swift; sourceTree = ""; }; 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; E86D8E03214B32DA0028EFE1 /* JSONTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONTests.swift; sourceTree = ""; }; + F16D083B21EF6F7300C458B8 /* QueryFromJSONBuildingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryFromJSONBuildingTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -560,6 +562,7 @@ 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */, 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */, 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */, + F16D083B21EF6F7300C458B8 /* QueryFromJSONBuildingTests.swift */, 9FF90A6B1DDDEB420034C3B6 /* ReadFieldValueTests.swift */, 9F19D8451EED8D3B00C57247 /* ResultOrPromiseTests.swift */, ); @@ -1128,6 +1131,7 @@ 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */, E86D8E05214B32FD0028EFE1 /* JSONTests.swift in Sources */, 9F8622FA1EC2117C00C38162 /* FragmentConstructionAndConversionTests.swift in Sources */, + F16D083C21EF6F7300C458B8 /* QueryFromJSONBuildingTests.swift in Sources */, 9FF90A711DDDEB420034C3B6 /* ReadFieldValueTests.swift in Sources */, 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */, 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */, diff --git a/Sources/Apollo/GraphQLSelectionSet.swift b/Sources/Apollo/GraphQLSelectionSet.swift index 078760702f..6be1219a5e 100644 --- a/Sources/Apollo/GraphQLSelectionSet.swift +++ b/Sources/Apollo/GraphQLSelectionSet.swift @@ -8,12 +8,12 @@ public protocol GraphQLSelectionSet { } public extension GraphQLSelectionSet { - init(jsonObject: JSONObject) throws { + init(jsonObject: JSONObject, variables: GraphQLMap? = nil) throws { let executor = GraphQLExecutor { object, info in .result(.success(object[info.responseKeyForField])) } executor.shouldComputeCachePath = false - self = try executor.execute(selections: Self.selections, on: jsonObject, accumulator: GraphQLSelectionSetMapper()).await() + self = try executor.execute(selections: Self.selections, on: jsonObject, variables: variables, accumulator: GraphQLSelectionSetMapper()).await() } var jsonObject: JSONObject { diff --git a/Tests/ApolloTests/QueryFromJSONBuildingTests.swift b/Tests/ApolloTests/QueryFromJSONBuildingTests.swift new file mode 100644 index 0000000000..d0631aeda3 --- /dev/null +++ b/Tests/ApolloTests/QueryFromJSONBuildingTests.swift @@ -0,0 +1,53 @@ +import XCTest +@testable import Apollo +import ApolloTestSupport +import StarWarsAPI + +class QueryFromJSONBuildingTests: XCTestCase { + func testHeroDetailsWithFragmentQueryHuman() throws { + let jsonObject = [ + "hero": ["__typename": "Human", "name": "Luke Skywalker", "height": 1.72] + ] + + let data = try HeroDetailsWithFragmentQuery.Data(jsonObject: jsonObject) + + guard let human = data.hero?.fragments.heroDetails.asHuman else { + XCTFail("Wrong type") + return + } + + XCTAssertEqual(human.height, 1.72) + } + + func testConditionalInclusionQuery() throws { + let jsonObject = [ + "hero": [ + "__typename": "Hero", + "name": "R2-D2" + ] + ] + + let nameData = try HeroNameConditionalInclusionQuery.Data(jsonObject: jsonObject, variables: ["includeName" : true]) + XCTAssertEqual(nameData.hero?.name, "R2-D2") + + let noNameData = try HeroNameConditionalInclusionQuery.Data(jsonObject: jsonObject, variables: ["includeName" : false]) + XCTAssertNil(noNameData.hero?.name) + } + + func testConditionalInclusionQueryWithoutVariables() throws { + let jsonObject = [ + "hero": [ + "__typename": "Hero", + "name": "R2-D2" + ] + ] + + XCTAssertThrowsError(try HeroNameConditionalInclusionQuery.Data(jsonObject: jsonObject)) { error in + if case let error as GraphQLResultError = error { + XCTAssertEqual(error.path, ["hero"]) + } else { + XCTFail("Unexpected error: \(error)") + } + } + } +}