Skip to content

Commit 9b24da9

Browse files
committed
Fix operation directive finalizer registration
1 parent 8b9f621 commit 9b24da9

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

lib/graphql/execution/runner.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,8 @@ def begin_execute(isolated_steps, results, query, root_type, root_value)
281281
end
282282
result = dir_defn.resolve_operation(selected_operation, query, objects, dir_args, query.context)
283283
if result.is_a?(Finalizer)
284-
result.path = path
285-
add_finalizer(query, result, nil, data)
284+
result.path = beginning_path
285+
add_finalizer(query, data, nil, result)
286286
if result.is_a?(HaltExecution)
287287
continue_execution = false
288288
break

spec/graphql/schema/directive/query_level_directive_spec.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ class DirectiveInput < GraphQL::Schema::InputObject
77
argument :val, Integer
88
end
99

10+
class OperationFinalizer
11+
include GraphQL::Execution::Finalizer
12+
13+
def finalize_graphql_result(query, result_data, result_key)
14+
query.context[:operation_finalizer] = {
15+
path: path,
16+
result_data: result_data.dup,
17+
result_key: result_key,
18+
}
19+
end
20+
end
21+
1022
class InitInt < GraphQL::Schema::Directive
1123
locations(GraphQL::Schema::Directive::QUERY)
1224
argument(:val, Integer, "Initial integer value.", required: false)
@@ -19,7 +31,7 @@ def self.resolve(obj, args, ctx)
1931

2032
def self.resolve_operation(ast_node, query, objects, args, context)
2133
context[:int] = args[:val] || args[:input][:val] || 0
22-
nil
34+
OperationFinalizer.new
2335
end
2436
end
2537

@@ -38,6 +50,7 @@ def int
3850

3951
directive(InitInt)
4052
query(Query)
53+
use GraphQL::Execution::Next
4154
end
4255

4356
it "returns an error if directive is not on the query level" do
@@ -67,8 +80,12 @@ def int
6780
}
6881
'
6982

70-
res = QueryDirectiveSchema.execute(str)
83+
res = QueryDirectiveSchema.execute_next(str)
7184
assert_equal({ "int1" => 11, "int2" => 12 }, res["data"])
85+
assert_equal(
86+
{ path: [], result_data: { "int1" => 11, "int2" => 12 }, result_key: nil },
87+
res.context[:operation_finalizer],
88+
)
7289
end
7390

7491
it "works with input object arguments" do

0 commit comments

Comments
 (0)