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