graphql 1.7.14 → 1.8.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/function_generator.rb +1 -1
  3. data/lib/generators/graphql/loader_generator.rb +1 -1
  4. data/lib/generators/graphql/mutation_generator.rb +1 -6
  5. data/lib/generators/graphql/templates/function.erb +2 -2
  6. data/lib/generators/graphql/templates/loader.erb +2 -2
  7. data/lib/graphql.rb +2 -0
  8. data/lib/graphql/argument.rb +0 -1
  9. data/lib/graphql/backwards_compatibility.rb +2 -3
  10. data/lib/graphql/base_type.rb +18 -16
  11. data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
  12. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
  13. data/lib/graphql/define/assign_object_field.rb +5 -12
  14. data/lib/graphql/deprecated_dsl.rb +28 -0
  15. data/lib/graphql/directive.rb +0 -1
  16. data/lib/graphql/enum_type.rb +1 -3
  17. data/lib/graphql/execution.rb +0 -1
  18. data/lib/graphql/execution/multiplex.rb +29 -12
  19. data/lib/graphql/field.rb +5 -20
  20. data/lib/graphql/function.rb +12 -0
  21. data/lib/graphql/input_object_type.rb +1 -3
  22. data/lib/graphql/internal_representation/node.rb +14 -26
  23. data/lib/graphql/internal_representation/visit.rb +6 -3
  24. data/lib/graphql/introspection/arguments_field.rb +0 -1
  25. data/lib/graphql/introspection/enum_values_field.rb +0 -1
  26. data/lib/graphql/introspection/fields_field.rb +0 -1
  27. data/lib/graphql/introspection/input_fields_field.rb +0 -1
  28. data/lib/graphql/introspection/interfaces_field.rb +0 -1
  29. data/lib/graphql/introspection/of_type_field.rb +0 -1
  30. data/lib/graphql/introspection/possible_types_field.rb +0 -1
  31. data/lib/graphql/introspection/schema_field.rb +0 -1
  32. data/lib/graphql/introspection/type_by_name_field.rb +0 -1
  33. data/lib/graphql/introspection/typename_field.rb +0 -1
  34. data/lib/graphql/language.rb +0 -3
  35. data/lib/graphql/language/generation.rb +182 -3
  36. data/lib/graphql/language/lexer.rb +69 -144
  37. data/lib/graphql/language/lexer.rl +4 -15
  38. data/lib/graphql/language/nodes.rb +76 -136
  39. data/lib/graphql/language/parser.rb +621 -668
  40. data/lib/graphql/language/parser.y +11 -17
  41. data/lib/graphql/language/token.rb +3 -10
  42. data/lib/graphql/object_type.rb +6 -1
  43. data/lib/graphql/query.rb +13 -8
  44. data/lib/graphql/query/arguments.rb +33 -48
  45. data/lib/graphql/query/context.rb +1 -0
  46. data/lib/graphql/query/literal_input.rb +1 -4
  47. data/lib/graphql/relay/connection_resolve.rb +3 -0
  48. data/lib/graphql/relay/global_id_resolve.rb +5 -1
  49. data/lib/graphql/relay/relation_connection.rb +19 -14
  50. data/lib/graphql/schema.rb +219 -12
  51. data/lib/graphql/schema/argument.rb +33 -0
  52. data/lib/graphql/schema/build_from_definition.rb +18 -64
  53. data/lib/graphql/schema/enum.rb +76 -0
  54. data/lib/graphql/schema/field.rb +127 -0
  55. data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
  56. data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
  57. data/lib/graphql/schema/input_object.rb +61 -0
  58. data/lib/graphql/schema/interface.rb +32 -0
  59. data/lib/graphql/schema/loader.rb +2 -2
  60. data/lib/graphql/schema/member.rb +97 -0
  61. data/lib/graphql/schema/member/build_type.rb +106 -0
  62. data/lib/graphql/schema/member/has_fields.rb +56 -0
  63. data/lib/graphql/schema/member/instrumentation.rb +113 -0
  64. data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
  65. data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
  66. data/lib/graphql/schema/object.rb +65 -0
  67. data/lib/graphql/schema/printer.rb +266 -33
  68. data/lib/graphql/schema/scalar.rb +25 -0
  69. data/lib/graphql/schema/traversal.rb +26 -17
  70. data/lib/graphql/schema/union.rb +48 -0
  71. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
  72. data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
  73. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
  74. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
  75. data/lib/graphql/tracing.rb +0 -1
  76. data/lib/graphql/tracing/platform_tracing.rb +7 -20
  77. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  78. data/lib/graphql/unresolved_type_error.rb +2 -3
  79. data/lib/graphql/version.rb +1 -1
  80. data/readme.md +1 -1
  81. data/spec/dummy/app/channels/graphql_channel.rb +1 -22
  82. data/spec/dummy/log/development.log +0 -239
  83. data/spec/dummy/log/test.log +0 -204
  84. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
  85. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  86. data/spec/generators/graphql/function_generator_spec.rb +0 -26
  87. data/spec/generators/graphql/loader_generator_spec.rb +0 -24
  88. data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
  89. data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
  90. data/spec/graphql/backtrace_spec.rb +0 -10
  91. data/spec/graphql/base_type_spec.rb +5 -19
  92. data/spec/graphql/boolean_type_spec.rb +3 -3
  93. data/spec/graphql/directive_spec.rb +1 -3
  94. data/spec/graphql/enum_type_spec.rb +5 -18
  95. data/spec/graphql/execution/execute_spec.rb +1 -1
  96. data/spec/graphql/execution/multiplex_spec.rb +2 -2
  97. data/spec/graphql/float_type_spec.rb +2 -2
  98. data/spec/graphql/id_type_spec.rb +1 -1
  99. data/spec/graphql/input_object_type_spec.rb +2 -15
  100. data/spec/graphql/int_type_spec.rb +2 -2
  101. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
  102. data/spec/graphql/introspection/schema_type_spec.rb +0 -1
  103. data/spec/graphql/language/generation_spec.rb +186 -21
  104. data/spec/graphql/language/lexer_spec.rb +1 -21
  105. data/spec/graphql/language/nodes_spec.rb +12 -21
  106. data/spec/graphql/language/parser_spec.rb +1 -1
  107. data/spec/graphql/query/arguments_spec.rb +15 -37
  108. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
  109. data/spec/graphql/query/variables_spec.rb +1 -1
  110. data/spec/graphql/query_spec.rb +5 -31
  111. data/spec/graphql/rake_task_spec.rb +1 -3
  112. data/spec/graphql/relay/base_connection_spec.rb +1 -1
  113. data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
  114. data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
  115. data/spec/graphql/relay/connection_type_spec.rb +1 -1
  116. data/spec/graphql/relay/mutation_spec.rb +3 -3
  117. data/spec/graphql/relay/relation_connection_spec.rb +1 -65
  118. data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
  119. data/spec/graphql/schema/enum_spec.rb +60 -0
  120. data/spec/graphql/schema/field_spec.rb +14 -0
  121. data/spec/graphql/schema/input_object_spec.rb +43 -0
  122. data/spec/graphql/schema/interface_spec.rb +98 -0
  123. data/spec/graphql/schema/object_spec.rb +119 -0
  124. data/spec/graphql/schema/printer_spec.rb +15 -92
  125. data/spec/graphql/schema/scalar_spec.rb +40 -0
  126. data/spec/graphql/schema/union_spec.rb +35 -0
  127. data/spec/graphql/schema/validation_spec.rb +1 -1
  128. data/spec/graphql/schema/warden_spec.rb +11 -11
  129. data/spec/graphql/schema_spec.rb +25 -23
  130. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
  131. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  132. data/spec/graphql/string_type_spec.rb +3 -3
  133. data/spec/graphql/subscriptions_spec.rb +1 -1
  134. data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
  135. data/spec/support/dummy/schema.rb +25 -39
  136. data/spec/support/jazz.rb +334 -0
  137. data/spec/support/lazy_helpers.rb +21 -23
  138. data/spec/support/star_wars/data.rb +7 -6
  139. data/spec/support/star_wars/schema.rb +109 -142
  140. metadata +39 -33
  141. data/lib/graphql/execution/instrumentation.rb +0 -82
  142. data/lib/graphql/language/block_string.rb +0 -47
  143. data/lib/graphql/language/document_from_schema_definition.rb +0 -277
  144. data/lib/graphql/language/printer.rb +0 -351
  145. data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
  146. data/spec/graphql/execution/instrumentation_spec.rb +0 -165
  147. data/spec/graphql/language/block_string_spec.rb +0 -70
  148. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  149. data/spec/graphql/language/printer_spec.rb +0 -203
@@ -120,7 +120,7 @@ describe GraphQL::Execution::Execute do
120
120
  }
121
121
  GRAPHQL
122
122
 
123
- assert_nil res["data"]
123
+ assert_equal nil, res["data"]
124
124
  assert_equal "👻", res["errors"].first["message"]
125
125
  end
126
126
 
@@ -126,7 +126,7 @@ describe GraphQL::Execution::Multiplex do
126
126
  "before multiplex 1",
127
127
  "before multiplex 2",
128
128
  "before Q1", "before Q2", "before Q3",
129
- "after Q3", "after Q2", "after Q1",
129
+ "after Q1", "after Q2", "after Q3",
130
130
  "after multiplex 2",
131
131
  "after multiplex 1",
132
132
  ], checks
@@ -176,7 +176,7 @@ describe GraphQL::Execution::Multiplex do
176
176
  assert_raises(GraphQL::Error) do
177
177
  InspectSchema.execute("{ raiseError }")
178
178
  end
179
- unhandled_err_json = '{}'
179
+ unhandled_err_json = 'null'
180
180
  assert_equal unhandled_err_json, InspectQueryInstrumentation.last_json
181
181
  end
182
182
  end
@@ -9,8 +9,8 @@ describe GraphQL::FLOAT_TYPE do
9
9
  end
10
10
 
11
11
  it "rejects other types" do
12
- assert_nil GraphQL::FLOAT_TYPE.coerce_isolated_input("55")
13
- assert_nil GraphQL::FLOAT_TYPE.coerce_isolated_input(true)
12
+ assert_equal nil, GraphQL::FLOAT_TYPE.coerce_isolated_input("55")
13
+ assert_equal nil, GraphQL::FLOAT_TYPE.coerce_isolated_input(true)
14
14
  end
15
15
  end
16
16
  end
@@ -26,7 +26,7 @@ describe GraphQL::ID_TYPE do
26
26
  let(:query_string) { %|query getMilk { cow: milk(id: 1.0) { id } }| }
27
27
 
28
28
  it "doesn't allow other types" do
29
- assert_nil result["data"]
29
+ assert_equal nil, result["data"]
30
30
  assert_equal 1, result["errors"].length
31
31
  end
32
32
  end
@@ -218,19 +218,6 @@ describe GraphQL::InputObjectType do
218
218
  assert_equal(expected, actual)
219
219
  end
220
220
  end
221
-
222
- describe 'with invalid name' do
223
- it 'raises the correct error' do
224
- assert_raises(GraphQL::InvalidNameError) do
225
- InvalidInputTest = GraphQL::InputObjectType.define do
226
- name "Some::Invalid Name"
227
- end
228
-
229
- # Force evaluation
230
- InvalidInputTest.name
231
- end
232
- end
233
- end
234
221
  end
235
222
  end
236
223
 
@@ -264,7 +251,7 @@ describe GraphQL::InputObjectType do
264
251
  assert_equal 'Test', result['a']
265
252
 
266
253
  assert result.key?('b')
267
- assert_nil result['b']
254
+ assert_equal nil, result['b']
268
255
 
269
256
  assert_equal "Test", result['c']
270
257
  end
@@ -277,7 +264,7 @@ describe GraphQL::InputObjectType do
277
264
  assert_equal 1, result['b']
278
265
 
279
266
  assert result.key?('c')
280
- assert_nil result['c']
267
+ assert_equal nil, result['c']
281
268
  end
282
269
 
283
270
  it "omitted arguments are not returned" do
@@ -9,8 +9,8 @@ describe GraphQL::INT_TYPE do
9
9
  end
10
10
 
11
11
  it "rejects other types" do
12
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input("55")
13
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input(true)
12
+ assert_equal nil, GraphQL::INT_TYPE.coerce_isolated_input("55")
13
+ assert_equal nil, GraphQL::INT_TYPE.coerce_isolated_input(true)
14
14
  end
15
15
  end
16
16
  end
@@ -110,7 +110,7 @@ describe GraphQL::InternalRepresentation::Rewrite do
110
110
 
111
111
  it "groups selections by object types which they apply to" do
112
112
  doc = rewrite_result.operation_definitions["getPlant"]
113
- assert_nil doc.definition
113
+ assert_equal nil, doc.definition
114
114
 
115
115
  plant_scoped_selection = doc.scoped_children[schema.types["Query"]]["plant"]
116
116
  assert_equal ["Fruit", "Nut", "Plant"], plant_scoped_selection.scoped_children.keys.map(&:name).sort
@@ -132,7 +132,7 @@ describe GraphQL::InternalRepresentation::Rewrite do
132
132
 
133
133
  it "tracks parent nodes" do
134
134
  doc = rewrite_result.operation_definitions["getPlant"]
135
- assert_nil doc.parent
135
+ assert_equal nil, doc.parent
136
136
 
137
137
  plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
138
138
  assert_equal doc, plant_selection.parent
@@ -37,7 +37,6 @@ describe GraphQL::Introspection::SchemaType do
37
37
  {"name"=>"milk"},
38
38
  {"name"=>"root"},
39
39
  {"name"=>"searchDairy"},
40
- {"name"=>"tracingScalar"},
41
40
  {"name"=>"valueWithExecutionError"},
42
41
  ]
43
42
  },
@@ -2,35 +2,200 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Language::Generation do
5
- describe "#to_query_tring" do
6
- let(:document) {
7
- GraphQL.parse('type Query { a: String! }')
5
+ let(:document) { GraphQL::Language::Parser.parse(query_string) }
6
+ let(:query_string) {%|
7
+ query getStuff($someVar: Int = 1, $anotherVar: [String!], $skipNested: Boolean! = false) @skip(if: false) {
8
+ myField: someField(someArg: $someVar, ok: 1.4) @skip(if: $anotherVar) @thing(or: "Whatever")
9
+ anotherField(someArg: [1, 2, 3]) {
10
+ nestedField
11
+ ...moreNestedFields @skip(if: $skipNested)
12
+ }
13
+ ... on OtherType @include(unless: false) {
14
+ field(arg: [{key: "value", anotherKey: 0.9, anotherAnotherKey: WHATEVER}])
15
+ anotherField
16
+ }
17
+ ... {
18
+ id
19
+ }
8
20
  }
9
21
 
10
- class CustomPrinter < GraphQL::Language::Printer
11
- def print_field_definition(print_field_definition)
12
- "<Field Hidden>"
13
- end
22
+ fragment moreNestedFields on NestedType @or(something: "ok") {
23
+ anotherNestedField
24
+ }
25
+ |}
26
+
27
+ describe ".generate" do
28
+ it "generates query string" do
29
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
14
30
  end
15
31
 
16
- it "accepts a custom printer" do
17
- expected = <<-SCHEMA
18
- type Query {
19
- a: String!
20
- }
21
- SCHEMA
32
+ describe "inputs" do
33
+ let(:query_string) {%|
34
+ query {
35
+ field(null_value: null, null_in_array: [1, null, 3], int: 3, float: 4.7e-24, bool: false, string: "☀︎🏆\\n escaped \\" unicode ¶ /", enum: ENUM_NAME, array: [7, 8, 9], object: {a: [1, 2, 3], b: {c: "4"}}, unicode_bom: "\xef\xbb\xbfquery")
36
+ }
37
+ |}
22
38
 
23
- assert_equal expected.chomp, GraphQL::Language::Generation.generate(document)
39
+ it "generate" do
40
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
41
+ end
24
42
  end
25
43
 
26
- it "accepts a custom printer" do
27
- expected = <<-SCHEMA
28
- type Query {
29
- <Field Hidden>
30
- }
31
- SCHEMA
44
+ describe "schema" do
45
+ describe "schema with convention names for root types" do
46
+ let(:query_string) {<<-schema
47
+ schema {
48
+ query: Query
49
+ mutation: Mutation
50
+ subscription: Subscription
51
+ }
52
+ schema
53
+ }
54
+
55
+ it 'omits schema definition' do
56
+ refute document.to_query_string =~ /schema/
57
+ end
58
+ end
59
+
60
+ describe "schema with custom query root name" do
61
+ let(:query_string) {<<-schema
62
+ schema {
63
+ query: MyQuery
64
+ mutation: Mutation
65
+ subscription: Subscription
66
+ }
67
+ schema
68
+ }
69
+
70
+ it 'includes schema definition' do
71
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
72
+ end
73
+ end
74
+
75
+ describe "schema with custom mutation root name" do
76
+ let(:query_string) {<<-schema
77
+ schema {
78
+ query: Query
79
+ mutation: MyMutation
80
+ subscription: Subscription
81
+ }
82
+ schema
83
+ }
84
+
85
+ it 'includes schema definition' do
86
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
87
+ end
88
+ end
89
+
90
+ describe "schema with custom subscription root name" do
91
+ let(:query_string) {<<-schema
92
+ schema {
93
+ query: Query
94
+ mutation: Mutation
95
+ subscription: MySubscription
96
+ }
97
+ schema
98
+ }
99
+
100
+ it 'includes schema definition' do
101
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
102
+ end
103
+ end
104
+
105
+ describe "full featured schema" do
106
+ # From: https://github.com/graphql/graphql-js/blob/bc96406ab44453a120da25a0bd6e2b0237119ddf/src/language/__tests__/schema-kitchen-sink.graphql
107
+ let(:query_string) {<<-schema
108
+ schema {
109
+ query: QueryType
110
+ mutation: MutationType
111
+ }
112
+
113
+ # Union description
114
+ union AnnotatedUnion @onUnion = A | B
115
+
116
+ type Foo implements Bar {
117
+ one: Type
118
+ two(argument: InputType!): Type
119
+ three(argument: InputType, other: String): Int
120
+ four(argument: String = "string"): String
121
+ five(argument: [String] = ["string", "string"]): String
122
+ six(argument: InputType = {key: "value"}): Type
123
+ seven(argument: String = null): Type
124
+ }
125
+
126
+ # Scalar description
127
+ scalar CustomScalar
32
128
 
33
- assert_equal expected.chomp, GraphQL::Language::Generation.generate(document, printer: CustomPrinter.new)
129
+ type AnnotatedObject @onObject(arg: "value") {
130
+ annotatedField(arg: Type = "default" @onArg): Type @onField
131
+ }
132
+
133
+ interface Bar {
134
+ one: Type
135
+ four(argument: String = "string"): String
136
+ }
137
+
138
+ # Enum description
139
+ enum Site {
140
+ # Enum value description
141
+ DESKTOP
142
+ MOBILE
143
+ }
144
+
145
+ interface AnnotatedInterface @onInterface {
146
+ annotatedField(arg: Type @onArg): Type @onField
147
+ }
148
+
149
+ union Feed = Story | Article | Advert
150
+
151
+ # Input description
152
+ input InputType {
153
+ key: String!
154
+ answer: Int = 42
155
+ }
156
+
157
+ union AnnotatedUnion @onUnion = A | B
158
+
159
+ scalar CustomScalar
160
+
161
+ # Directive description
162
+ directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
163
+
164
+ scalar AnnotatedScalar @onScalar
165
+
166
+ enum Site {
167
+ DESKTOP
168
+ MOBILE
169
+ }
170
+
171
+ enum AnnotatedEnum @onEnum {
172
+ ANNOTATED_VALUE @onEnumValue
173
+ OTHER_VALUE
174
+ }
175
+
176
+ input InputType {
177
+ key: String!
178
+ answer: Int = 42
179
+ }
180
+
181
+ input AnnotatedInput @onInputObjectType {
182
+ annotatedField: Type @onField
183
+ }
184
+
185
+ directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
186
+
187
+ directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
188
+ schema
189
+ }
190
+
191
+ it "generate" do
192
+ assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
193
+ end
194
+
195
+ it "doesn't mutate the document" do
196
+ assert_equal document.to_query_string, document.to_query_string
197
+ end
198
+ end
34
199
  end
35
200
  end
36
201
  end
@@ -26,15 +26,6 @@ describe GraphQL::Language::Lexer do
26
26
  assert_equal tokens[0], tokens[1].prev_token
27
27
  end
28
28
 
29
- describe "block strings" do
30
- let(:query_string) { %|{ a(b: """\nc\n d\n""")}|}
31
-
32
- it "tokenizes them" do
33
- str_token = tokens[5]
34
- assert_equal "c\n d", str_token.value
35
- end
36
- end
37
-
38
29
  it "unescapes escaped characters" do
39
30
  assert_equal "\" \\ / \b \f \n \r \t", subject.tokenize('"\\" \\\\ \\/ \\b \\f \\n \\r \\t"').first.to_s
40
31
  end
@@ -49,18 +40,7 @@ describe GraphQL::Language::Lexer do
49
40
 
50
41
  it "clears the previous_token between runs" do
51
42
  tok_2 = subject.tokenize(query_string)
52
- assert_nil tok_2[0].prev_token
53
- end
54
-
55
- it "counts string position properly" do
56
- tokens = subject.tokenize('{ a(b: "c")}')
57
- str_token = tokens[5]
58
- assert_equal :STRING, str_token.name
59
- assert_equal "c", str_token.value
60
- assert_equal 8, str_token.col
61
- assert_equal '(STRING "c" [1:8])', str_token.inspect
62
- rparen_token = tokens[6]
63
- assert_equal '(RPAREN ")" [1:10])', rparen_token.inspect
43
+ assert_equal nil, tok_2[0].prev_token
64
44
  end
65
45
  end
66
46
  end
@@ -2,6 +2,18 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Language::Nodes::AbstractNode do
5
+ describe "child and scalar attributes" do
6
+ it "are inherited by node subclasses" do
7
+ subclassed_directive = Class.new(GraphQL::Language::Nodes::Directive)
8
+
9
+ assert_equal GraphQL::Language::Nodes::Directive.scalar_attributes,
10
+ subclassed_directive.scalar_attributes
11
+
12
+ assert_equal GraphQL::Language::Nodes::Directive.child_attributes,
13
+ subclassed_directive.child_attributes
14
+ end
15
+ end
16
+
5
17
  describe "#filename" do
6
18
  it "is set after .parse_file" do
7
19
  filename = "spec/support/parser/filename_example.graphql"
@@ -21,25 +33,4 @@ describe GraphQL::Language::Nodes::AbstractNode do
21
33
  assert_nil doc.filename
22
34
  end
23
35
  end
24
-
25
- describe "#to_query_tring" do
26
- let(:document) {
27
- GraphQL.parse('type Query { a: String! }')
28
- }
29
-
30
- class CustomPrinter < GraphQL::Language::Printer
31
- def print_field_definition(print_field_definition)
32
- "<Field Hidden>"
33
- end
34
- end
35
-
36
- it "accepts a custom printer" do
37
- expected = <<-SCHEMA
38
- type Query {
39
- <Field Hidden>
40
- }
41
- SCHEMA
42
- assert_equal expected.chomp, document.to_query_string(printer: CustomPrinter.new)
43
- end
44
- end
45
36
  end
@@ -16,7 +16,7 @@ describe GraphQL::Language::Parser do
16
16
 
17
17
  it "creates an anonymous fragment definition" do
18
18
  assert fragment.is_a?(GraphQL::Language::Nodes::FragmentDefinition)
19
- assert_nil fragment.name
19
+ assert_equal nil, fragment.name
20
20
  assert_equal 1, fragment.selections.length
21
21
  assert_equal "NestedType", fragment.type.name
22
22
  assert_equal 1, fragment.directives.length
@@ -16,22 +16,10 @@ describe GraphQL::Query::Arguments do
16
16
  argument :c, !test_input_1, as: :inputObject
17
17
  end
18
18
 
19
- GraphQL::Query::Arguments.new(
20
- {
21
- a: 1,
22
- b: 2,
23
- c: GraphQL::Query::Arguments.new(
24
- {
25
- d: 3,
26
- e: 4,
27
- },
28
- argument_definitions: test_input_1.arguments,
29
- defaults_used: Set.new
30
- ),
31
- },
32
- argument_definitions: test_input_2.arguments,
33
- defaults_used: Set.new
34
- )
19
+ GraphQL::Query::Arguments.construct_arguments_class(test_input_1)
20
+ GraphQL::Query::Arguments.construct_arguments_class(test_input_2)
21
+ arg_values = {a: 1, b: 2, c: { d: 3, e: 4 }}
22
+ test_input_2.arguments_class.new(arg_values, context: nil)
35
23
  }
36
24
 
37
25
  it "returns keys as strings, with aliases" do
@@ -81,11 +69,11 @@ describe GraphQL::Query::Arguments do
81
69
  )
82
70
  end
83
71
 
84
- new_arguments = GraphQL::Query::Arguments.new(
85
- transformed_args,
86
- argument_definitions: types,
87
- defaults_used: Set.new
88
- )
72
+ args_class = Class.new(GraphQL::Query::Arguments) do
73
+ self.argument_definitions = types
74
+ end
75
+
76
+ new_arguments = args_class.new(transformed_args, context: nil)
89
77
  expected_hash = {
90
78
  "A" => 1,
91
79
  "B" => 2,
@@ -106,10 +94,9 @@ describe GraphQL::Query::Arguments do
106
94
  test_input_type
107
95
  }
108
96
  it "wraps input objects, but not other hashes" do
109
- args = GraphQL::Query::Arguments.new(
97
+ args = input_type.arguments_class.new(
110
98
  {a: 1, b: {a: 2}, c: {a: 3}},
111
- argument_definitions: input_type.arguments,
112
- defaults_used: Set.new
99
+ context: nil
113
100
  )
114
101
  assert_kind_of GraphQL::Query::Arguments, args["b"]
115
102
  assert_instance_of Hash, args["c"]
@@ -128,8 +115,8 @@ describe GraphQL::Query::Arguments do
128
115
  end
129
116
 
130
117
  it "returns nil for missing keys" do
131
- assert_nil arguments["z"]
132
- assert_nil arguments[7]
118
+ assert_equal nil, arguments["z"]
119
+ assert_equal nil, arguments[7]
133
120
  end
134
121
  end
135
122
 
@@ -211,15 +198,6 @@ describe GraphQL::Query::Arguments do
211
198
  assert_equal({"a" => 1, "b" => 2}, last_args.to_h)
212
199
  end
213
200
 
214
- it "indicates when default argument values were applied" do
215
- schema.execute("{ argTest(a: 1) }")
216
-
217
- last_args = arg_values.last
218
-
219
- assert_equal false, last_args.default_used?('a')
220
- assert_equal true, last_args.default_used?('b')
221
- end
222
-
223
201
  it "works from variables" do
224
202
  variables = { "arg" => { "a" => 1, "d" => nil } }
225
203
  schema.execute("query ArgTest($arg: TestInput){ argTest(d: $arg) }", variables: variables)
@@ -325,10 +303,10 @@ describe GraphQL::Query::Arguments do
325
303
  end
326
304
 
327
305
  it "generates argument classes that responds to keys as functions" do
328
- assert_nil input_object.arguments_class
306
+ assert_equal nil, input_object.arguments_class
329
307
 
330
308
  GraphQL::Query::Arguments.construct_arguments_class(input_object)
331
- args = input_object.arguments_class.new({foo: 3, bar: -90}, Set.new)
309
+ args = input_object.arguments_class.new({foo: 3, bar: -90}, context: nil)
332
310
 
333
311
  assert_equal 3, args.foo
334
312
  assert_equal -90, args.bar