Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/graphql/execution/runner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,8 @@ def begin_execute(isolated_steps, results, query, root_type, root_value)
end
result = dir_defn.resolve_operation(selected_operation, query, objects, dir_args, query.context)
if result.is_a?(Finalizer)
result.path = path
add_finalizer(query, result, nil, data)
result.path = beginning_path
add_finalizer(query, data, nil, result)
if result.is_a?(HaltExecution)
continue_execution = false
break
Expand Down
21 changes: 19 additions & 2 deletions spec/graphql/schema/directive/query_level_directive_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@ class DirectiveInput < GraphQL::Schema::InputObject
argument :val, Integer
end

class OperationFinalizer
include GraphQL::Execution::Finalizer

def finalize_graphql_result(query, result_data, result_key)
query.context[:operation_finalizer] = {
path: path,
result_data: result_data.dup,
result_key: result_key,
}
end
end

class InitInt < GraphQL::Schema::Directive
locations(GraphQL::Schema::Directive::QUERY)
argument(:val, Integer, "Initial integer value.", required: false)
Expand All @@ -19,7 +31,7 @@ def self.resolve(obj, args, ctx)

def self.resolve_operation(ast_node, query, objects, args, context)
context[:int] = args[:val] || args[:input][:val] || 0
nil
OperationFinalizer.new
end
end

Expand All @@ -38,6 +50,7 @@ def int

directive(InitInt)
query(Query)
use GraphQL::Execution::Next
end

it "returns an error if directive is not on the query level" do
Expand Down Expand Up @@ -67,8 +80,12 @@ def int
}
'

res = QueryDirectiveSchema.execute(str)
res = QueryDirectiveSchema.execute_next(str)
assert_equal({ "int1" => 11, "int2" => 12 }, res["data"])
assert_equal(
{ path: [], result_data: { "int1" => 11, "int2" => 12 }, result_key: nil },
res.context[:operation_finalizer],
)
end

it "works with input object arguments" do
Expand Down
Loading