github.com/bewolv/gqlgen@v0.10.12/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/bewolv/gqlgen/example/chat", 126 "github.com/bewolv/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/bewolv/gqlgen/example/scalars/model.Banned", cfg.Models["Banned"].Model[0]) 138 require.Equal(t, "github.com/bewolv/gqlgen/example/chat.Message", cfg.Models["Message"].Model[0]) 139 }