spec/graphql/schema/warden_spec.rb in graphql-1.5.15 vs spec/graphql/schema/warden_spec.rb in graphql-1.6.0
- old
+ new
@@ -101,15 +101,29 @@
field :add_phoneme, PhonemeType do
argument :symbol, types.String
end
end
+ module FilterInstrumentation
+ def self.before_query(query)
+ if query.context[:filters]
+ query.merge_filters(
+ only: query.context[:filters][:only],
+ except: query.context[:filters][:except],
+ )
+ end
+ end
+
+ def self.after_query(q); end
+ end
+
Schema = GraphQL::Schema.define do
query QueryType
mutation MutationType
subscription MutationType
resolve_type ->(obj, ctx) { PhonemeType }
+ instrument :query, FilterInstrumentation
end
module Data
UVULAR_TRILL = OpenStruct.new({name: "Uvular Trill", symbol: "ʀ", manner: "TRILL"})
def self.unit
@@ -587,8 +601,74 @@
query_except = ->(member, ctx) { member.metadata[:hidden_input_object_type] }
res = schema.execute(query_str, except: query_except)
assert_equal nil, res["data"]["input"]
enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
refute_includes enum_values, "TRILL"
+ end
+ end
+
+ describe "multiple filters" do
+ let(:visible_enum_value) { ->(member, ctx) { !member.metadata[:hidden_enum_value] } }
+ let(:visible_abstract_type) { ->(member, ctx) { !member.metadata[:hidden_abstract_type] } }
+ let(:hidden_input_object) { ->(member, ctx) { member.metadata[:hidden_input_object_type] } }
+ let(:hidden_type) { ->(member, ctx) { member.metadata[:hidden_type] } }
+
+ let(:query_str) { <<-GRAPHQL
+ {
+ enum: __type(name: "Manner") { enumValues { name } }
+ input: __type(name: "WithinInput") { name }
+ abstractType: __type(name: "Grapheme") { interfaces { name } }
+ type: __type(name: "Phoneme") { name }
+ }
+ GRAPHQL
+ }
+
+ describe "multiple filters for execution" do
+ it "applies all of them" do
+ res = MaskHelpers.run_query(
+ query_str,
+ only: [visible_enum_value, visible_abstract_type],
+ except: [hidden_input_object, hidden_type],
+ )
+ assert_equal nil, res["data"]["input"]
+ enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
+ assert_equal 5, enum_values.length
+ refute_includes enum_values, "TRILL"
+ # These are also filtered out:
+ assert_equal 0, res["data"]["abstractType"]["interfaces"].length
+ assert_equal nil, res["data"]["type"]
+ end
+ end
+
+ describe "adding filters in instrumentation" do
+ it "applies only/except filters" do
+ filters = {
+ only: visible_enum_value,
+ except: hidden_input_object,
+ }
+ res = MaskHelpers.run_query(query_str, context: { filters: filters })
+ assert_equal nil, res["data"]["input"]
+ enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
+ assert_equal 5, enum_values.length
+ refute_includes enum_values, "TRILL"
+ # These are unaffected:
+ assert_includes res["data"]["abstractType"]["interfaces"].map { |i| i["name"] }, "LanguageMember"
+ assert_equal "Phoneme", res["data"]["type"]["name"]
+ end
+
+ it "applies multiple filters" do
+ filters = {
+ only: [visible_enum_value, visible_abstract_type],
+ except: [hidden_input_object, hidden_type],
+ }
+ res = MaskHelpers.run_query(query_str, context: { filters: filters })
+ assert_equal nil, res["data"]["input"]
+ enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
+ assert_equal 5, enum_values.length
+ refute_includes enum_values, "TRILL"
+ # These are also filtered out:
+ assert_equal 0, res["data"]["abstractType"]["interfaces"].length
+ assert_equal nil, res["data"]["type"]
+ end
end
end
end