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  }