...

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

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

     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  	// Validation as a first call
    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  	// Some other call that should not affect validator behavior
    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  	// Repeating same query and expecting to still return same validation error
    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  	// https://github.com/99designs/gqlgen/issues/2028
   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