Skip to content

Commit fcbfa86

Browse files
authored
Merge pull request #5274 from xuanduc987/push-c23315765c0e7ae94f164f369e5d0729
Handle error in resolve_type
2 parents 528fa5e + f850c9e commit fcbfa86

File tree

2 files changed

+106
-1
lines changed

2 files changed

+106
-1
lines changed

lib/graphql/execution/interpreter/runtime.rb

+11-1
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,17 @@ def continue_field(value, owner_type, field, current_type, ast_node, next_select
587587
set_result(selection_result, result_name, r, false, is_non_null)
588588
r
589589
when "UNION", "INTERFACE"
590-
resolved_type_or_lazy = resolve_type(current_type, value)
590+
resolved_type_or_lazy = begin
591+
resolve_type(current_type, value)
592+
rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => ex_err
593+
return continue_value(ex_err, field, is_non_null, ast_node, result_name, selection_result)
594+
rescue StandardError => err
595+
begin
596+
query.handle_or_reraise(err)
597+
rescue GraphQL::ExecutionError => ex_err
598+
return continue_value(ex_err, field, is_non_null, ast_node, result_name, selection_result)
599+
end
600+
end
591601
after_lazy(resolved_type_or_lazy, ast_node: ast_node, field: field, owner_object: owner_object, arguments: arguments, trace: false, result_name: result_name, result: selection_result, runtime_state: runtime_state) do |resolved_type_result, runtime_state|
592602
if resolved_type_result.is_a?(Array) && resolved_type_result.length == 2
593603
resolved_type, resolved_value = resolved_type_result

spec/graphql/execution_error_spec.rb

+95
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,101 @@
400400
assert_equal(expected_errors, result["errors"])
401401
end
402402

403+
describe "when ExecutionError is raised in resolve_type" do
404+
let(:schema) do
405+
test_type = Class.new(GraphQL::Schema::Object) do
406+
graphql_name "Test"
407+
field :dummy, GraphQL::Types::Boolean
408+
end
409+
410+
test_union = Class.new(GraphQL::Schema::Union) do
411+
graphql_name "TestUnion"
412+
possible_types test_type
413+
end
414+
415+
query_type = Class.new(GraphQL::Schema::Object) do
416+
graphql_name "Query"
417+
418+
field :test, test_union
419+
define_method(:test) do
420+
1
421+
end
422+
end
423+
424+
Class.new(GraphQL::Schema) do
425+
query query_type
426+
427+
define_singleton_method(:resolve_type) do |abstract_type, obj, ctx|
428+
raise GraphQL::ExecutionError.new("resolve_type")
429+
end
430+
end
431+
end
432+
433+
it "return execution error with location and path" do
434+
query = "{ test { ...on Test { dummy } } }"
435+
result = schema.execute(query)
436+
expected_result = {
437+
"errors"=>[
438+
{
439+
"message"=>"resolve_type",
440+
"locations"=>[{"line"=>1, "column"=>3}],
441+
"path"=>["test"]
442+
}
443+
],
444+
"data"=>{"test"=>nil}
445+
}
446+
assert_equal(expected_result, result.to_h)
447+
end
448+
449+
describe "when using DataLoaders" do
450+
let(:schema) do
451+
test_type = Class.new(GraphQL::Schema::Object) do
452+
graphql_name "Test"
453+
field :dummy, GraphQL::Types::Boolean
454+
end
455+
456+
test_union = Class.new(GraphQL::Schema::Union) do
457+
graphql_name "TestUnion"
458+
possible_types test_type
459+
end
460+
461+
query_type = Class.new(GraphQL::Schema::Object) do
462+
graphql_name "Query"
463+
464+
field :test, test_union
465+
define_method(:test) do
466+
1
467+
end
468+
end
469+
470+
Class.new(GraphQL::Schema) do
471+
query query_type
472+
use GraphQL::Dataloader
473+
474+
define_singleton_method(:resolve_type) do |abstract_type, obj, ctx|
475+
raise GraphQL::ExecutionError.new("resolve_type")
476+
end
477+
end
478+
end
479+
480+
it "return execution error with location and path" do
481+
query = "{ test { ...on Test { dummy } } }"
482+
result = schema.execute(query)
483+
expected_result = {
484+
"errors"=>[
485+
{
486+
"message"=>"resolve_type",
487+
"locations"=>[{"line"=>1, "column"=>3}],
488+
"path"=>["test"]
489+
}
490+
],
491+
"data"=>{"test"=>nil}
492+
}
493+
assert_equal(expected_result, result.to_h)
494+
end
495+
end
496+
end
497+
403498
describe "when using DataLoaders" do
404499
let(:schema) do
405500
item_error_loader = Class.new(GraphQL::Dataloader::Source) do

0 commit comments

Comments
 (0)