Skip to content
Merged
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
5 changes: 5 additions & 0 deletions lib/graphql/schema/directive.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 19 additions & 0 deletions spec/graphql/schema/directive_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
{
Expand Down
Loading