8
8
class SimpleBreadthRuntime < GraphQL ::Execution ::Interpreter ::Runtime
9
9
class BreadthObject < GraphQL ::Execution ::Interpreter ::Runtime ::GraphQLResultHash
10
10
attr_accessor :breadth_index
11
+ attr_accessor :results_by_key
12
+
13
+ def collect_result ( result_name , result_value )
14
+ results_by_key [ result_name ] [ breadth_index ] = result_value
15
+ true
16
+ end
11
17
end
12
18
13
19
def initialize ( query :)
@@ -22,26 +28,24 @@ def initialize(query:)
22
28
@breadth_results_by_key = { }
23
29
end
24
30
25
- def run
26
- result = nil
31
+ def run ( &block )
27
32
query . current_trace . execute_multiplex ( multiplex : query . multiplex ) do
28
- query . current_trace . execute_query ( query : query ) do
29
- result = yield
30
- end
33
+ query . current_trace . execute_query ( query : query , &block )
31
34
end
32
- result
33
35
ensure
34
36
delete_all_interpreter_context
35
37
end
36
38
37
39
def evaluate_breadth_selection ( objects , parent_type , node )
38
40
result_key = node . alias || node . name
39
41
@breadth_results_by_key [ result_key ] = Array . new ( objects . size )
42
+
40
43
objects . each_with_index do |object , index |
41
44
app_value = parent_type . wrap ( object , query . context )
42
45
breadth_object = BreadthObject . new ( nil , parent_type , app_value , nil , false , node . selections , false , node , nil , nil )
43
46
breadth_object . ordered_result_keys = [ ]
44
47
breadth_object . breadth_index = index
48
+ breadth_object . results_by_key = @breadth_results_by_key
45
49
46
50
state = get_current_runtime_state
47
51
state . current_result_name = nil
@@ -53,11 +57,6 @@ def evaluate_breadth_selection(objects, parent_type, node)
53
57
54
58
@breadth_results_by_key [ result_key ]
55
59
end
56
-
57
- def exit_with_inner_result? ( inner_result , result_key , breadth_object )
58
- @breadth_results_by_key [ result_key ] [ breadth_object . breadth_index ] = inner_result
59
- true
60
- end
61
60
end
62
61
63
62
class PassthroughLoader < GraphQL ::Batch ::Loader
@@ -169,6 +168,14 @@ def args(a:, b:)
169
168
"#{ a } #{ b } "
170
169
end
171
170
171
+ field :valid_args , String do |f |
172
+ f . argument :a , String , validates : { length : { is : 1 } }
173
+ end
174
+
175
+ def valid_args ( a :)
176
+ a
177
+ end
178
+
172
179
field :range , String do |f |
173
180
f . argument :input , RangeInput
174
181
end
@@ -268,6 +275,13 @@ def test_maps_basic_arguments_with_variables
268
275
assert_equal [ "fizzbuzz" ] , result
269
276
end
270
277
278
+ def test_maps_invalidated_arguments
279
+ doc = %|query { validArgs(a: "boo") }|
280
+ result = map_breadth_objects ( [ { } ] , doc )
281
+ assert result . first . is_a? ( GraphQL ::ExecutionError )
282
+ assert_equal "a is the wrong length (should be 1)" , result . first . message
283
+ end
284
+
271
285
def test_maps_prepared_input_object
272
286
doc = %|{ range(input: { min: 1, max: 2 }) }|
273
287
result = map_breadth_objects ( [ { } ] , doc )
0 commit comments