...
1 package validator_test
2
3 import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7 "github.com/vektah/gqlparser/v2"
8 "github.com/vektah/gqlparser/v2/ast"
9 "github.com/vektah/gqlparser/v2/parser"
10 "github.com/vektah/gqlparser/v2/validator"
11 )
12
13 func TestExtendingNonExistantTypes(t *testing.T) {
14 s := gqlparser.MustLoadSchema(
15 &ast.Source{Name: "graph/schema.graphqls", Input: `
16 extend type User {
17 id: ID!
18 }
19
20 extend type Product {
21 upc: String!
22 }
23
24 union _Entity = Product | User
25
26 extend type Query {
27 entity: _Entity
28 }
29 `, BuiltIn: false},
30 )
31
32 q, err := parser.ParseQuery(&ast.Source{Name: "ff", Input: `{
33 entity {
34 ... on User {
35 id
36 }
37 }
38 }`})
39 require.Nil(t, err)
40 require.Nil(t, validator.Validate(s, q))
41 }
42
43 func TestValidationRulesAreIndependent(t *testing.T) {
44 s := gqlparser.MustLoadSchema(
45 &ast.Source{Name: "graph/schema.graphqls", Input: `
46 extend type Query {
47 myAction(myEnum: Locale!): SomeResult!
48 }
49
50 type SomeResult {
51 id: String
52 }
53
54 enum Locale {
55 EN
56 LT
57 DE
58 }
59 `, BuiltIn: false},
60 )
61
62
63 q1, err := parser.ParseQuery(&ast.Source{
64 Name: "SomeOperation", Input: `
65 query SomeOperation {
66 # Note: Not providing mandatory parameter: (myEnum: Locale!)
67 myAction {
68 id
69 }
70 }
71 `})
72 require.Nil(t, err)
73 r1 := validator.Validate(s, q1)
74 require.Len(t, r1, 1)
75 const errorString = `SomeOperation:4: Field "myAction" argument "myEnum" of type "Locale!" is required, but it was not provided.`
76 require.EqualError(t, r1[0], errorString)
77
78
79 q2, err := parser.ParseQuery(&ast.Source{
80 Name: "SomeOperation", Input: `
81 # Note: there is default enum value in variables
82 query SomeOperation ($locale: Locale! = DE) {
83 myAction(myEnum: $locale) {
84 id
85 }
86 }
87 `})
88 require.Nil(t, err)
89 require.Nil(t, validator.Validate(s, q2))
90
91
92 require.Len(t, r1, 1)
93 require.EqualError(t, r1[0], errorString)
94 }
95
96 func TestDeprecatingTypes(t *testing.T) {
97 schema := &ast.Source{
98 Name: "graph/schema.graphqls",
99 Input: `
100 type DeprecatedType {
101 deprecatedField: String @deprecated
102 newField(deprecatedArg: Int): Boolean
103 }
104
105 enum DeprecatedEnum {
106 ALPHA @deprecated
107 }
108 `,
109 BuiltIn: false,
110 }
111
112 _, err := validator.LoadSchema(append([]*ast.Source{validator.Prelude}, schema)...)
113 require.Nil(t, err)
114 }
115
116 func TestNoUnusedVariables(t *testing.T) {
117
118 t.Run("gqlgen issues #2028", func(t *testing.T) {
119 s := gqlparser.MustLoadSchema(
120 &ast.Source{Name: "graph/schema.graphqls", Input: `
121 type Query {
122 bar: String!
123 }
124 `, BuiltIn: false},
125 )
126
127 q, err := parser.ParseQuery(&ast.Source{Name: "2028", Input: `
128 query Foo($flag: Boolean!) {
129 ...Bar
130 }
131 fragment Bar on Query {
132 bar @include(if: $flag)
133 }
134 `})
135 require.Nil(t, err)
136 require.Nil(t, validator.Validate(s, q))
137 })
138 }
139
View as plain text