Skip to content

Commit

Permalink
Merge pull request #805 from cmatheson/argument-prepare-errors
Browse files Browse the repository at this point in the history
improve error handling in argument prepare procs
  • Loading branch information
Robert Mosolgo committed Jun 25, 2017
2 parents 9141e9a + 75ecda7 commit 2f9b15b
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
4 changes: 2 additions & 2 deletions lib/graphql/execution/execute.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ def resolve_field(owner, selection, parent_type, field, object, query_ctx)
selection: selection,
)

arguments = query.arguments_for(selection, field)
raw_value = begin
arguments = query.arguments_for(selection, field)
query_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
rescue GraphQL::ExecutionError => err
err
Expand Down Expand Up @@ -116,7 +116,7 @@ def continue_resolve_field(owner, selection, parent_type, field, raw_value, fiel

case raw_value
when GraphQL::ExecutionError
raw_value.ast_node = field_ctx.ast_node
raw_value.ast_node ||= field_ctx.ast_node
raw_value.path = field_ctx.path
query.context.errors.push(raw_value)
when Array
Expand Down
46 changes: 31 additions & 15 deletions spec/graphql/query/literal_input_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
describe ".from_arguments" do
describe "arguments are prepared" do
let(:schema) {
query = GraphQL::ObjectType.define do
name "Query"
type = GraphQL::ObjectType.define do
name "SomeType"

field :addToArgumentValue do
type !types.Int
Expand Down Expand Up @@ -35,40 +35,56 @@
end
end

query = GraphQL::ObjectType.define do
name "Query"

field :top, type, resolve: ->(_, _, _) { true }
end

GraphQL::Schema.define(query: query)
}

it "prepares values from query literals" do
result = schema.execute("{ addToArgumentValue(value: 1) }", context: { val: 1 })
assert_equal(result["data"]["addToArgumentValue"], 2)
result = schema.execute("{ top { addToArgumentValue(value: 1) } }", context: { val: 1 })
assert_equal(result["data"]["top"]["addToArgumentValue"], 2)
end

it "prepares default values" do
result = schema.execute("{ addToArgumentValue }", context: { val: 4 })
assert_equal(7, result["data"]["addToArgumentValue"])
result = schema.execute("{ top { addToArgumentValue } }", context: { val: 4 })
assert_equal(7, result["data"]["top"]["addToArgumentValue"])
end

it "raises an execution error if the default value is bad" do
result = schema.execute("{ fieldWithArgumentThatIsBadByDefault }", context: { })
assert_equal(result["errors"], [{"message" => "Always bad"}])
result = schema.execute("{ top { fieldWithArgumentThatIsBadByDefault } }", context: { })
assert_equal(result["data"], {
"top"=>{
"fieldWithArgumentThatIsBadByDefault"=>nil}
})
assert_equal(result["errors"], [
{"message"=>"Always bad",
"locations"=>[{"line"=>1, "column"=>9}],
"path"=>["top", "fieldWithArgumentThatIsBadByDefault"]}
])
end

it "prepares values from variables" do
result = schema.execute("query ($value: Int!) { addToArgumentValue(value: $value) }", variables: { "value" => 1}, context: { val: 2 } )
assert_equal(result["data"]["addToArgumentValue"], 3)
result = schema.execute("query ($value: Int!) { top { addToArgumentValue(value: $value) } }", variables: { "value" => 1}, context: { val: 2 } )
assert_equal(result["data"]["top"]["addToArgumentValue"], 3)
end

it "prepares values correctly if called multiple times with different arguments" do
result = schema.execute("{ first: addToArgumentValue(value: 1) second: addToArgumentValue(value: 2) }", context: { val: 3 })
assert_equal(result["data"]["first"], 4)
assert_equal(result["data"]["second"], 5)
result = schema.execute("{ top { first: addToArgumentValue(value: 1) second: addToArgumentValue(value: 2) } }", context: { val: 3 })
assert_equal(result["data"]["top"]["first"], 4)
assert_equal(result["data"]["top"]["second"], 5)
end

it "adds message to errors key if an ExecutionError is returned from the prepare function" do
result = schema.execute("{ addToArgumentValue(value: 999) }")
result = schema.execute("{ top { addToArgumentValue(value: 999) } }")
assert_equal(result["data"]["top"], nil)
assert_equal(result["errors"][0]["message"], "Can't return more than 3 digits")
assert_equal(result["errors"][0]["locations"][0]["line"], 1)
assert_equal(result["errors"][0]["locations"][0]["column"], 22)
assert_equal(result["errors"][0]["locations"][0]["column"], 28)
assert_equal(result["errors"][0]["path"], ["top", "addToArgumentValue"])
end
end
end
Expand Down

0 comments on commit 2f9b15b

Please sign in to comment.