github.com/brody192/genqlient@v0.0.1/generate/config_test.go (about) 1 package generate 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "github.com/brody192/genqlient/internal/testutil" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 const ( 14 findConfigDir = "testdata/find-config" 15 validConfigDir = "testdata/valid-config" 16 invalidConfigDir = "testdata/invalid-config" 17 ) 18 19 func TestFindCfg(t *testing.T) { 20 cwd, err := os.Getwd() 21 require.NoError(t, err) 22 23 cases := map[string]struct { 24 startDir string 25 expectedCfg string 26 expectedErr error 27 }{ 28 "yaml in parent directory": { 29 startDir: filepath.Join(cwd, findConfigDir, "parent", "child"), 30 expectedCfg: filepath.Join(cwd, findConfigDir, "parent", "genqlient.yaml"), 31 }, 32 "yaml in current directory": { 33 startDir: filepath.Join(cwd, findConfigDir, "current"), 34 expectedCfg: filepath.Join(cwd, findConfigDir, "current", "genqlient.yaml"), 35 }, 36 "no yaml": { 37 startDir: filepath.Join(cwd, findConfigDir, "none", "child"), 38 expectedErr: os.ErrNotExist, 39 }, 40 } 41 42 for name, tc := range cases { 43 t.Run(name, func(t *testing.T) { 44 defer func() { 45 require.NoError(t, os.Chdir(cwd), "Test cleanup failed") 46 }() 47 48 err = os.Chdir(tc.startDir) 49 require.NoError(t, err) 50 51 path, err := findCfg() 52 assert.Equal(t, tc.expectedCfg, path) 53 assert.Equal(t, tc.expectedErr, err) 54 }) 55 } 56 } 57 58 func TestFindCfgInDir(t *testing.T) { 59 cwd, err := os.Getwd() 60 require.NoError(t, err) 61 62 cases := map[string]struct { 63 startDir string 64 found bool 65 }{ 66 "yaml": { 67 startDir: filepath.Join(cwd, findConfigDir, "filenames", "yaml"), 68 found: true, 69 }, 70 "yml": { 71 startDir: filepath.Join(cwd, findConfigDir, "filenames", "yml"), 72 found: true, 73 }, 74 ".yaml": { 75 startDir: filepath.Join(cwd, findConfigDir, "filenames", "dotyaml"), 76 found: true, 77 }, 78 ".yml": { 79 startDir: filepath.Join(cwd, findConfigDir, "filenames", "dotyml"), 80 found: true, 81 }, 82 "none": { 83 startDir: filepath.Join(cwd, findConfigDir, "filenames", "none"), 84 found: false, 85 }, 86 } 87 88 for name, tc := range cases { 89 t.Run(name, func(t *testing.T) { 90 path := findCfgInDir(tc.startDir) 91 if tc.found { 92 assert.NotEmpty(t, path) 93 } else { 94 assert.Empty(t, path) 95 } 96 }) 97 } 98 } 99 100 func TestAbsoluteAndRelativePathsInConfigFiles(t *testing.T) { 101 cwd, err := os.Getwd() 102 require.NoError(t, err) 103 104 config, err := ReadAndValidateConfig( 105 filepath.Join(cwd, findConfigDir, "current", "genqlient.yaml")) 106 require.NoError(t, err) 107 108 require.Equal(t, 1, len(config.Schema)) 109 require.Equal( 110 t, 111 filepath.Join(cwd, findConfigDir, "current", "schema.graphql"), 112 config.Schema[0], 113 ) 114 require.Equal(t, 1, len(config.Operations)) 115 require.Equal(t, "/tmp/genqlient.graphql", config.Operations[0]) 116 } 117 118 func testAllSnapshots( 119 t *testing.T, 120 dir string, 121 testfunc func(t *testing.T, filename string), 122 ) { 123 files, err := os.ReadDir(dir) 124 if err != nil { 125 t.Fatal(err) 126 } 127 128 for _, file := range files { 129 name := file.Name() 130 if name[0] == '.' { 131 continue // editor backup files, etc. 132 } 133 t.Run(name, func(t *testing.T) { 134 filename := filepath.Join(dir, file.Name()) 135 testfunc(t, filename) 136 }) 137 } 138 } 139 140 func TestValidConfigs(t *testing.T) { 141 testAllSnapshots(t, validConfigDir, func(t *testing.T, filename string) { 142 config, err := ReadAndValidateConfig(filename) 143 require.NoError(t, err) 144 testutil.Cupaloy.SnapshotT(t, config) 145 }) 146 } 147 148 func TestInvalidConfigs(t *testing.T) { 149 testAllSnapshots(t, invalidConfigDir, func(t *testing.T, filename string) { 150 _, err := ReadAndValidateConfig(filename) 151 require.Error(t, err) 152 testutil.Cupaloy.SnapshotT(t, err.Error()) 153 }) 154 }