1 package validator
2
3 import (
4 "os"
5 "testing"
6
7 "github.com/vektah/gqlparser/v2/gqlerror"
8
9 "github.com/stretchr/testify/require"
10 "github.com/vektah/gqlparser/v2/ast"
11 "github.com/vektah/gqlparser/v2/parser/testrunner"
12 )
13
14 func TestLoadSchema(t *testing.T) {
15 t.Run("prelude", func(t *testing.T) {
16 s, err := LoadSchema(Prelude)
17 require.Nil(t, err)
18
19 boolDef := s.Types["Boolean"]
20 require.Equal(t, "Boolean", boolDef.Name)
21 require.Equal(t, ast.Scalar, boolDef.Kind)
22 require.Equal(t, "The `Boolean` scalar type represents `true` or `false`.", boolDef.Description)
23
24 deferDef := s.Directives["defer"]
25 require.Equal(t, "defer", deferDef.Name, "@defer exists.")
26 require.Equal(t, "if", deferDef.Arguments[0].Name, "@defer has \"if\" argument.")
27 require.Equal(t, "label", deferDef.Arguments[1].Name, "@defer has \"label\" argument.")
28 })
29 t.Run("swapi", func(t *testing.T) {
30 file, err := os.ReadFile("testdata/swapi.graphql")
31 require.Nil(t, err)
32 s, err := LoadSchema(Prelude, &ast.Source{Input: string(file), Name: "TestLoadSchema"})
33 require.Nil(t, err)
34
35 require.Equal(t, "Query", s.Query.Name)
36 require.Equal(t, "hero", s.Query.Fields[0].Name)
37
38 require.Equal(t, "Human", s.Types["Human"].Name)
39
40 require.Equal(t, "Subscription", s.Subscription.Name)
41 require.Equal(t, "reviewAdded", s.Subscription.Fields[0].Name)
42
43 possibleCharacters := s.GetPossibleTypes(s.Types["Character"])
44 require.Len(t, possibleCharacters, 2)
45 require.Equal(t, "Human", possibleCharacters[0].Name)
46 require.Equal(t, "Droid", possibleCharacters[1].Name)
47
48 implements := s.GetImplements(s.Types["Droid"])
49 require.Len(t, implements, 2)
50 require.Equal(t, "Character", implements[0].Name)
51 require.Equal(t, "SearchResult", implements[1].Name)
52 })
53
54 t.Run("default root operation type names", func(t *testing.T) {
55 file, err := os.ReadFile("testdata/default_root_operation_type_names.graphql")
56 require.Nil(t, err)
57 s, err := LoadSchema(Prelude, &ast.Source{Input: string(file), Name: "TestLoadSchema"})
58 require.Nil(t, err)
59
60 require.Nil(t, s.Mutation)
61 require.Nil(t, s.Subscription)
62
63 require.Equal(t, "Mutation", s.Types["Mutation"].Name)
64 require.Equal(t, "Subscription", s.Types["Subscription"].Name)
65 })
66
67 t.Run("type extensions", func(t *testing.T) {
68 file, err := os.ReadFile("testdata/extensions.graphql")
69 require.Nil(t, err)
70 s, err := LoadSchema(Prelude, &ast.Source{Input: string(file), Name: "TestLoadSchema"})
71 require.Nil(t, err)
72
73 require.Equal(t, "Subscription", s.Subscription.Name)
74 require.Equal(t, "dogEvents", s.Subscription.Fields[0].Name)
75
76 require.Equal(t, "owner", s.Types["Dog"].Fields[1].Name)
77
78 directives := s.Types["Person"].Directives
79 require.Len(t, directives, 2)
80 wantArgs := []string{"sushi", "tempura"}
81 for i, directive := range directives {
82 require.Equal(t, "favorite", directive.Name)
83 require.True(t, directive.Definition.IsRepeatable)
84 for _, arg := range directive.Arguments {
85 require.Equal(t, wantArgs[i], arg.Value.Raw)
86 }
87 }
88 })
89
90 t.Run("interfaces", func(t *testing.T) {
91 file, err := os.ReadFile("testdata/interfaces.graphql")
92 require.Nil(t, err)
93 s, err := LoadSchema(Prelude, &ast.Source{Input: string(file), Name: "interfaces"})
94 require.Nil(t, err)
95
96 implements := s.GetImplements(s.Types["Canine"])
97 require.Len(t, implements, 1)
98 require.Equal(t, "Mammal", implements[0].Name)
99
100 possibleTypes := s.GetPossibleTypes(s.Types["Mammal"])
101 require.Len(t, possibleTypes, 1)
102 require.Equal(t, "Canine", possibleTypes[0].Name)
103 })
104
105 testrunner.Test(t, "./schema_test.yml", func(t *testing.T, input string) testrunner.Spec {
106 _, err := LoadSchema(Prelude, &ast.Source{Input: input})
107 if err != nil {
108 return testrunner.Spec{
109 Error: err.(*gqlerror.Error),
110 }
111 }
112 return testrunner.Spec{}
113 })
114 }
115
116 func TestSchemaDescription(t *testing.T) {
117 s, err := LoadSchema(Prelude, &ast.Source{Name: "graph/schema.graphqls", Input: `
118 """
119 A simple GraphQL schema which is well described.
120 """
121 schema {
122 query: Query
123 }
124
125 type Query {
126 entity: String
127 }
128 `, BuiltIn: false})
129 require.Nil(t, err)
130 want := "A simple GraphQL schema which is well described."
131 require.Equal(t, want, s.Description)
132 }
133
View as plain text