Skip to content

Commit 3697299

Browse files
committed
fix(GraphQL::Backtrace) always stringify everything for the table
1 parent 9a1398c commit 3697299

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

lib/graphql/backtrace/inspect_result.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def inspect_truncated(obj)
4343
when GraphQL::Execution::Lazy
4444
"(unresolved)"
4545
else
46-
obj.inspect
46+
"#{obj.inspect}"
4747
end
4848
end
4949
end

lib/graphql/backtrace/table.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def build_rows(context_entry, rows:, top: false)
8787
rows << [
8888
"#{position}",
8989
"#{field_name}#{field_alias ? " as #{field_alias}" : ""}",
90-
ctx.object.inspect,
90+
"#{ctx.object.inspect}",
9191
ctx.irep_node.arguments.to_h.inspect,
9292
Backtrace::InspectResult.inspect(top && @override_value ? @override_value : ctx.value),
9393
]
@@ -107,7 +107,7 @@ def build_rows(context_entry, rows:, top: false)
107107
rows << [
108108
"#{position}",
109109
"#{op_type}#{op_name ? " #{op_name}" : ""}",
110-
query.root_value.inspect,
110+
"#{query.root_value.inspect}",
111111
query.variables.to_h.inspect,
112112
Backtrace::InspectResult.inspect(query.context.value),
113113
]

spec/graphql/backtrace_spec.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,17 @@ def call(_memo, visit_type, irep_node)
2424
end
2525
end
2626

27+
class NilInspectObject
28+
# Oops, this is evil, but it happens and we should handle it.
29+
def inspect; nil; end
30+
end
31+
2732
let(:resolvers) {
2833
{
2934
"Query" => {
3035
"field1" => Proc.new { :something },
3136
"field2" => Proc.new { :something },
37+
"nilInspect" => Proc.new { NilInspectObject.new },
3238
},
3339
"Thing" => {
3440
"listField" => Proc.new { :not_a_list },
@@ -44,6 +50,7 @@ def call(_memo, visit_type, irep_node)
4450
type Query {
4551
field1: Thing
4652
field2: OtherThing
53+
nilInspect: Thing
4754
}
4855
4956
type Thing {
@@ -112,7 +119,7 @@ def call(_memo, visit_type, irep_node)
112119
assert_includes err.message, rendered_table
113120
# The message includes the original error message
114121
assert_includes err.message, "This is broken: Boom"
115-
assert_includes err.message, "spec/graphql/backtrace_spec.rb:35", "It includes the original backtrace"
122+
assert_includes err.message, "spec/graphql/backtrace_spec.rb:41", "It includes the original backtrace"
116123
assert_includes err.message, "more lines"
117124
end
118125

@@ -147,6 +154,21 @@ def call(_memo, visit_type, irep_node)
147154
res = schema.execute("query raiseError { __typename }")
148155
assert_equal "this should not be wrapped by a backtrace, but instead, returned to the client", res["errors"].first["message"]
149156
end
157+
158+
it "always stringifies the #inspect response" do
159+
err = assert_raises(GraphQL::Backtrace::TracedError) {
160+
schema.execute("query { nilInspect { raiseField(message: \"💥\") } }")
161+
}
162+
163+
rendered_table = [
164+
'Loc | Field | Object | Arguments | Result',
165+
'1:22 | Thing.raiseField | | {"message"=>"💥"} | #<RuntimeError: This is broken: 💥>',
166+
'1:9 | Query.nilInspect | nil | {} | {}',
167+
'1:1 | query | nil | {} | {}',
168+
].join("\n")
169+
170+
assert_includes(err.message, rendered_table)
171+
end
150172
end
151173

152174
# This will get brittle when execution code moves between files

0 commit comments

Comments
 (0)