File: variables_spec.rb

package info (click to toggle)
ruby-graphql 2.5.19-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 13,868 kB
  • sloc: ruby: 80,420; ansic: 1,808; yacc: 845; javascript: 480; makefile: 6
file content (139 lines) | stat: -rw-r--r-- 4,061 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# frozen_string_literal: true
require "spec_helper"

describe "GraphQL::Query::Variables" do
  module VariablesTest
    class MaxValidationSchema < GraphQL::Schema
      class Query < GraphQL::Schema::Object
        field :items, [String], null: false do
          argument :a, Int
          argument :b, Int
          argument :c, Int
        end

        def items(a:, b:, c:)
          [a, b, c].map(&:to_s)
        end
      end

      query(Query)
    end
  end

  let(:variables) { {a: "1", b: "1", c: "1"} }
  let(:query_string) { "query($a: Int!, $b: Int!, $c: Int!) { items(a: $a, b: $b, c: $c)}" }

  describe "when there are no variable errors" do
    let(:schema) { VariablesTest::MaxValidationSchema }
    let(:variables) { {a: 1, b: 1, c: 1} }

    it "does not return any error" do
      res = schema.execute(query_string, variables: variables)
      assert_nil res["errors"]
    end
  end

  describe "when validate_max_errors is nil" do
    let(:schema) { VariablesTest::MaxValidationSchema }

    it "returns all errors" do
      res = schema.execute(query_string, variables: variables)
      assert_equal 3, res["errors"].count
    end
  end

  describe "when max validation error is set" do
    class TestSchema < VariablesTest::MaxValidationSchema
      validate_max_errors(2)
    end
    let(:schema) { TestSchema }

    describe "when errors are more than validate_max_value value" do
      it "raises only as many errors as the validate_max_errors value and appends the too many errors message" do
        res = schema.execute(query_string, variables: variables)
        assert_equal 3, res["errors"].count
        assert_match(/Too many errors processing variables/, res["errors"].last["message"])
      end
    end

    describe "when errors are equal with validate_max_value" do
      let(:variables) { {a: 1, b: "1", c: "1"} }

      it "raises all errors" do
        res = schema.execute(query_string, variables: variables)
        assert_equal 2, res["errors"].count
      end
    end

    describe "when variables are empty" do
      let(:variables) { {} }

      it "raises all errors" do
        res = schema.execute(query_string, variables: variables)
        assert_equal 3, res["errors"].count
        assert_match(/Too many errors processing variables/, res["errors"].last["message"])
      end
    end
  end

  describe "when an invalid enum value is given" do
    class EnumVariableSchema < GraphQL::Schema
      class Filter < GraphQL::Schema::Enum
        value(:contains) { def visible?(ctx); !ctx[:hide_enum_value]; end }
        value(:equals) { def visible?(ctx); !ctx[:hide_enum_value]; end }

        def self.visible?(ctx)
          !ctx[:hide_enum]
        end
      end

      class FilterInput < GraphQL::Schema::InputObject
        argument :filter, Filter, default_value: "contains" do
          def visible?(_ctx); true; end
        end
      end

      class Query < GraphQL::Schema::Object
        field :filter, String do
          argument :input, FilterInput
        end

        def filter(input:)
          input.filter.to_s
        end
      end

      query(Query)
    end

    it "handles the error nicely" do
      query_str = "query EchoFilter($input: FilterInput!) { filter(input: $input) }"
      variables = { "input"  => { "filter" => "contains" } }

      query = GraphQL::Query.new(
        EnumVariableSchema,
        query_str,
        variables: variables,
        context: { hide_enum_value: true }
      )

      assert_raises GraphQL::Schema::Enum::MissingValuesError do
        query.result
      end

      query2 = GraphQL::Query.new(
        EnumVariableSchema,
        query_str,
        variables: variables,
        context: { hide_enum_value: true, hide_enum: true }
      )

      expected_messages = [
        "Variable $input of type FilterInput! was provided invalid value for filter (Field is not defined on FilterInput)"
      ]

      assert query2.variables
      assert_equal expected_messages, query2.result["errors"].map { |err| err["message"] }
    end
  end
end