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