diff --git a/lib/graphql/schema/directive.rb b/lib/graphql/schema/directive.rb index baa47515da..aa0941bcd9 100644 --- a/lib/graphql/schema/directive.rb +++ b/lib/graphql/schema/directive.rb @@ -84,6 +84,11 @@ def resolve_each(object, arguments, context) yield end + def resolve_field(...); end + def resolve_fragment_spread(...); end + def resolve_inline_fragment(...); end + def resolve_operation(...); end + def validate!(arguments, context) Schema::Validator.validate!(validators, self, context, arguments) end diff --git a/spec/graphql/schema/directive_spec.rb b/spec/graphql/schema/directive_spec.rb index 552154e08c..6340777ace 100644 --- a/spec/graphql/schema/directive_spec.rb +++ b/spec/graphql/schema/directive_spec.rb @@ -220,6 +220,10 @@ def self.resolve_field(*_args) end end + class NoOp < GraphQL::Schema::Directive + locations(FIELD, FRAGMENT_SPREAD, INLINE_FRAGMENT, QUERY) + end + class Thing < GraphQL::Schema::Object field :name, String, null: false, hash_key: :name end @@ -292,6 +296,7 @@ def fetch(names) class Schema < GraphQL::Schema query(Query) directive(CountFields) + directive(NoOp) directive(ValidationTest) lazy_resolve(Proc, :call) use GraphQL::Dataloader @@ -304,6 +309,20 @@ def exec_query(...) end describe "runtime directives" do + it "treats directives without runtime hooks as no-ops" do + queries = [ + "{ __typename @noOp }", + "{ ... on Query @noOp { __typename } }", + "{ ...NoOpFragment @noOp } fragment NoOpFragment on Query { __typename }", + "query @noOp { __typename }", + ] + + queries.each do |query| + result = RuntimeDirectiveTest::Schema.execute_next(query) + assert_equal({ "data" => { "__typename" => "Query" } }, result.to_h) + end + end + it "works with fragment spreads, inline fragments, and fields" do query_str = <<-GRAPHQL {