diff --git a/lib/graphql/execution/runner.rb b/lib/graphql/execution/runner.rb index 1a40003c7a..4b780dca72 100644 --- a/lib/graphql/execution/runner.rb +++ b/lib/graphql/execution/runner.rb @@ -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 diff --git a/spec/graphql/schema/directive/query_level_directive_spec.rb b/spec/graphql/schema/directive/query_level_directive_spec.rb index 4a3f4b856e..af354c7b58 100644 --- a/spec/graphql/schema/directive/query_level_directive_spec.rb +++ b/spec/graphql/schema/directive/query_level_directive_spec.rb @@ -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) @@ -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 @@ -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 @@ -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