...

Source file src/github.com/vektah/gqlparser/v2/validator/schema_test.go

Documentation: github.com/vektah/gqlparser/v2/validator

     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)    // interface
    51  		require.Equal(t, "SearchResult", implements[1].Name) // union
    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