@@ -28,6 +28,64 @@ class GETTransformerTests: XCTestCase {
2828 XCTAssertEqual ( url? . absoluteString, " http://localhost:8080/graphql?query=query%20HeroName($episode:%20Episode)%20%7B%0A%20%20hero(episode:%20$episode)%20%7B%0A%20%20%20%20__typename%0A%20%20%20%20name%0A%20%20%7D%0A%7D&variables=%7B%22episode%22:%22EMPIRE%22%7D " )
2929 }
3030
31+ func testEncodingQueryWithMoreThanOneParameterIncludingNonHashableValue( ) {
32+ let operation = HeroNameTypeSpecificConditionalInclusionQuery ( episode: . jedi, includeName: true )
33+ let body : GraphQLMap = [
34+ " query " : operation. queryDocument,
35+ " variables " : operation. variables,
36+ ]
37+
38+ let transformer = GraphQLGETTransformer ( body: body, url: self . url)
39+
40+ let url = transformer. createGetURL ( )
41+
42+ if #available( iOS 11 , macOS 13 , tvOS 11 , watchOS 4 , * ) {
43+ // Here, we know that everything should be encoded in a stable order,
44+ // and we can check the encoded URL string directly.
45+ XCTAssertEqual ( url? . absoluteString, " http://localhost:8080/graphql?query=query%20HeroNameTypeSpecificConditionalInclusion($episode:%20Episode,%20$includeName:%20Boolean!)%20%7B%0A%20%20hero(episode:%20$episode)%20%7B%0A%20%20%20%20__typename%0A%20%20%20%20name%20@include(if:%20$includeName)%0A%20%20%20%20...%20on%20Droid%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D&variables=%7B%22episode%22:%22JEDI%22,%22includeName%22:true%7D " )
46+ } else {
47+ // We can't guarantee order of encoding, so we need to pull the JSON back
48+ // out and check that it has the correct and correctly typed properties.
49+ guard let transformedURL = url else {
50+ XCTFail ( " URL not created! " )
51+ return
52+ }
53+
54+ guard let urlComponents = URLComponents ( url: transformedURL, resolvingAgainstBaseURL: false ) else {
55+ XCTFail ( " Couldn't access URL components " )
56+ return
57+ }
58+
59+ guard let queryItems = urlComponents. queryItems else {
60+ XCTFail ( " No query items! " )
61+ return
62+ }
63+
64+
65+ guard
66+ let variablesQueryItem = queryItems. first ( where: { $0. name == " variables " } ) ,
67+ let variables = variablesQueryItem. value else {
68+ XCTFail ( " Query items did not contain variables! " )
69+ return
70+ }
71+
72+ guard let data = variables. data ( using: . utf8) else {
73+ XCTFail ( " Couldn't convert data to UTF8 string! " )
74+ return
75+ }
76+
77+ guard
78+ let object = try ? JSONSerialization . jsonObject ( with: data) ,
79+ let dict = object as? [ String : Any ] else {
80+ XCTFail ( " Couldn't get dictionary out of json! " )
81+ return
82+ }
83+
84+ XCTAssertEqual ( dict [ " includeName " ] as? Bool , true )
85+ XCTAssertEqual ( dict [ " episode " ] as? String , " JEDI " )
86+ }
87+ }
88+
3189 func testEncodingQueryWithNullDefaultParameter( ) {
3290 let operation = HeroNameQuery ( )
3391 let body : GraphQLMap = [
0 commit comments