Skip to content

Commit 6ca3709

Browse files
committed
Add a test for subclass; unwrap objects before passing to handler
1 parent f701485 commit 6ca3709

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

lib/graphql/execution/errors.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ def with_error_handling(trace_data)
4747
args = trace_data[:arguments]
4848
ctx = trace_data[:query].context
4949
field = trace_data[:field]
50+
if obj.is_a?(GraphQL::Schema::Object)
51+
obj = obj.object
52+
end
5053
handler.call(err, obj, args, ctx, field)
5154
else
5255
raise err

spec/graphql/execution/errors_spec.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ def initialize(value:)
1313
end
1414
end
1515

16+
class ErrorASubclass < ErrorA; end
17+
1618
use GraphQL::Execution::Interpreter
1719
use GraphQL::Analysis::AST
1820
use GraphQL::Execution::Errors
1921

2022
rescue_from(ErrorA) do |err, obj, args, ctx, field|
21-
ctx[:errors] << "#{err.message} (#{obj.class.name}.#{field.graphql_name}, #{args.inspect})"
23+
ctx[:errors] << "#{err.message} (#{field.owner.name}.#{field.graphql_name}, #{obj.inspect}, #{args.inspect})"
2224
nil
2325
end
2426

@@ -55,6 +57,10 @@ def f4
5557
raise ErrorC.new(value: 20)
5658
end
5759

60+
field :f5, Int, null: true
61+
def f5
62+
raise ErrorASubclass, "raised subclass"
63+
end
5864
end
5965

6066
query(Query)
@@ -65,14 +71,14 @@ def f4
6571
ctx = { errors: [] }
6672
res = ErrorsTestSchema.execute "{ f1(a1: 1) }", context: ctx, root_value: :abc
6773
assert_equal({ "data" => { "f1" => nil } }, res)
68-
assert_equal ["f1 broke (ErrorsTestSchema::Query.f1, {:a1=>1})"], ctx[:errors]
74+
assert_equal ["f1 broke (ErrorsTestSchema::Query.f1, :abc, {:a1=>1})"], ctx[:errors]
6975
end
7076

7177
it "rescues errors from lazy code" do
7278
ctx = { errors: [] }
7379
res = ErrorsTestSchema.execute("{ f2 }", context: ctx)
7480
assert_equal({ "data" => { "f2" => nil } }, res)
75-
assert_equal ["f2 broke (ErrorsTestSchema::Query.f2, {})"], ctx[:errors]
81+
assert_equal ["f2 broke (ErrorsTestSchema::Query.f2, nil, {})"], ctx[:errors]
7682
end
7783

7884
it "can raise new errors" do
@@ -89,5 +95,12 @@ def f4
8995
res = ErrorsTestSchema.execute("{ f4 }")
9096
assert_equal({ "data" => { "f4" => 20 } }, res)
9197
end
98+
99+
it "rescues subclasses" do
100+
context = { errors: [] }
101+
res = ErrorsTestSchema.execute("{ f5 }", context: context)
102+
assert_equal({ "data" => { "f5" => nil } }, res)
103+
assert_equal ["raised subclass (ErrorsTestSchema::Query.f5, nil, {})"], context[:errors]
104+
end
92105
end
93106
end

0 commit comments

Comments
 (0)