github.com/fortexxx/gqlgen@v0.10.3-0.20191216030626-ca5ea8b21ead/codegen/config/config_test.go (about)

     1  package config
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"runtime"
     7  	"testing"
     8  
     9  	"github.com/vektah/gqlparser"
    10  	"github.com/vektah/gqlparser/ast"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestLoadConfig(t *testing.T) {
    17  	t.Run("config does not exist", func(t *testing.T) {
    18  		_, err := LoadConfig("doesnotexist.yml")
    19  		require.Error(t, err)
    20  	})
    21  
    22  	t.Run("malformed config", func(t *testing.T) {
    23  		_, err := LoadConfig("testdata/cfg/malformedconfig.yml")
    24  		require.EqualError(t, err, "unable to parse config: yaml: unmarshal errors:\n  line 1: cannot unmarshal !!str `asdf` into config.Config")
    25  	})
    26  
    27  	t.Run("unknown keys", func(t *testing.T) {
    28  		_, err := LoadConfig("testdata/cfg/unknownkeys.yml")
    29  		require.EqualError(t, err, "unable to parse config: yaml: unmarshal errors:\n  line 2: field unknown not found in type config.Config")
    30  	})
    31  
    32  	t.Run("globbed filenames", func(t *testing.T) {
    33  		c, err := LoadConfig("testdata/cfg/glob.yml")
    34  		require.NoError(t, err)
    35  
    36  		if runtime.GOOS == "windows" {
    37  			require.Equal(t, c.SchemaFilename[0], `testdata\cfg\glob\bar\bar with spaces.graphql`)
    38  			require.Equal(t, c.SchemaFilename[1], `testdata\cfg\glob\foo\foo.graphql`)
    39  		} else {
    40  			require.Equal(t, c.SchemaFilename[0], "testdata/cfg/glob/bar/bar with spaces.graphql")
    41  			require.Equal(t, c.SchemaFilename[1], "testdata/cfg/glob/foo/foo.graphql")
    42  		}
    43  	})
    44  
    45  	t.Run("unwalkable path", func(t *testing.T) {
    46  		_, err := LoadConfig("testdata/cfg/unwalkable.yml")
    47  		if runtime.GOOS == "windows" {
    48  			require.EqualError(t, err, "failed to walk schema at root not_walkable/: FindFirstFile not_walkable/: The parameter is incorrect.")
    49  		} else {
    50  			require.EqualError(t, err, "failed to walk schema at root not_walkable/: lstat not_walkable/: no such file or directory")
    51  		}
    52  	})
    53  }
    54  
    55  func TestLoadDefaultConfig(t *testing.T) {
    56  	testDir, err := os.Getwd()
    57  	require.NoError(t, err)
    58  	var cfg *Config
    59  
    60  	t.Run("will find closest match", func(t *testing.T) {
    61  		err = os.Chdir(filepath.Join(testDir, "testdata", "cfg", "subdir"))
    62  		require.NoError(t, err)
    63  
    64  		cfg, err = LoadConfigFromDefaultLocations()
    65  		require.NoError(t, err)
    66  		require.Equal(t, StringList{"inner"}, cfg.SchemaFilename)
    67  	})
    68  
    69  	t.Run("will find config in parent dirs", func(t *testing.T) {
    70  		err = os.Chdir(filepath.Join(testDir, "testdata", "cfg", "otherdir"))
    71  		require.NoError(t, err)
    72  
    73  		cfg, err = LoadConfigFromDefaultLocations()
    74  		require.NoError(t, err)
    75  		require.Equal(t, StringList{"outer"}, cfg.SchemaFilename)
    76  	})
    77  
    78  	t.Run("will return error if config doesn't exist", func(t *testing.T) {
    79  		err = os.Chdir(testDir)
    80  		require.NoError(t, err)
    81  
    82  		cfg, err = LoadConfigFromDefaultLocations()
    83  		require.True(t, os.IsNotExist(err))
    84  	})
    85  }
    86  
    87  func TestReferencedPackages(t *testing.T) {
    88  	t.Run("valid", func(t *testing.T) {
    89  		tm := TypeMap{
    90  			"Foo": {Model: StringList{"github.com/test.Foo"}},
    91  			"Bar": {Model: StringList{"github.com/test.Bar"}},
    92  			"Baz": {Model: StringList{"github.com/otherpkg.Baz"}},
    93  			"Map": {Model: StringList{"map[string]interface{}"}},
    94  			"SkipResolver": {
    95  				Fields: map[string]TypeMapField{
    96  					"field": {Resolver: false},
    97  				},
    98  			},
    99  		}
   100  
   101  		pkgs := tm.ReferencedPackages()
   102  
   103  		assert.Equal(t, []string{"github.com/test", "github.com/otherpkg"}, pkgs)
   104  	})
   105  
   106  }
   107  
   108  func TestConfigCheck(t *testing.T) {
   109  	t.Run("invalid config format due to conflicting package names", func(t *testing.T) {
   110  		config, err := LoadConfig("testdata/cfg/conflictedPackages.yml")
   111  		require.NoError(t, err)
   112  
   113  		err = config.normalize()
   114  		require.NoError(t, err)
   115  
   116  		err = config.Check()
   117  		require.EqualError(t, err, "filenames exec.go and models.go are in the same directory but have different package definitions")
   118  	})
   119  }
   120  
   121  func TestAutobinding(t *testing.T) {
   122  	cfg := Config{
   123  		Models: TypeMap{},
   124  		AutoBind: []string{
   125  			"github.com/99designs/gqlgen/example/chat",
   126  			"github.com/99designs/gqlgen/example/scalars/model",
   127  		},
   128  	}
   129  
   130  	s := gqlparser.MustLoadSchema(&ast.Source{Name: "TestAutobinding.schema", Input: `
   131  		scalar Banned 
   132  		type Message { id: ID }
   133  	`})
   134  
   135  	require.NoError(t, cfg.Autobind(s))
   136  
   137  	require.Equal(t, "github.com/99designs/gqlgen/example/scalars/model.Banned", cfg.Models["Banned"].Model[0])
   138  	require.Equal(t, "github.com/99designs/gqlgen/example/chat.Message", cfg.Models["Message"].Model[0])
   139  }