github.com/davinci-std/kanvas@v0.11.1/test/snapshot_test.go (about) 1 package test 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/davinci-std/kanvas/app" 10 11 "github.com/davinci-std/kanvas" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 type Config struct { 18 Env string 19 Error string 20 } 21 22 type Option func(*Config) 23 24 func Error(err string) Option { 25 return func(c *Config) { 26 c.Error = err 27 } 28 } 29 30 func Env(env string) Option { 31 return func(c *Config) { 32 c.Env = env 33 } 34 } 35 36 func TestExport(t *testing.T) { 37 if testing.Short() { 38 t.SkipNow() 39 } 40 41 run(t, "reference") 42 run(t, "jsonnet") 43 run(t, "unusedenv", Env("dev"), Error(`environment "dev" uses "missing" but it is not defined`)) 44 } 45 46 func run(t *testing.T, sub string, opts ...Option) { 47 t.Helper() 48 49 var ( 50 config Config 51 ) 52 53 for _, opt := range opts { 54 opt(&config) 55 } 56 57 env := config.Env 58 wantErr := config.Error 59 60 var name string 61 if env == "" { 62 name = sub 63 } else { 64 name = fmt.Sprintf("%s-%s", sub, env) 65 } 66 67 t.Run(name, func(t *testing.T) { 68 var ( 69 exportsDir = filepath.Join(name, "exports") 70 destDir = t.TempDir() 71 72 exports = map[string]string{} 73 ) 74 75 if wantErr == "" { 76 files, err := os.ReadDir(exportsDir) 77 require.NoError(t, err) 78 79 for _, f := range files { 80 fn := filepath.Join(exportsDir, f.Name()) 81 data, err := os.ReadFile(fn) 82 require.NoError(t, err) 83 exports[f.Name()] = string(data) 84 } 85 } 86 87 wd, err := os.Getwd() 88 require.NoError(t, err) 89 require.NoError(t, os.Chdir(sub)) 90 a, err := app.New(kanvas.Options{ 91 Env: env, 92 }) 93 require.NoError(t, os.Chdir(wd)) 94 require.NoError(t, err) 95 96 gotErr := a.Export("githubactions", destDir, "kanvas:example") 97 if wantErr != "" { 98 require.EqualError(t, gotErr, wantErr) 99 } else { 100 require.NoError(t, gotErr) 101 } 102 103 destFiles, err := os.ReadDir(destDir) 104 require.NoError(t, err) 105 106 for _, f := range destFiles { 107 want, ok := exports[f.Name()] 108 109 got, err := os.ReadFile(filepath.Join(destDir, f.Name())) 110 assert.NoError(t, err) 111 112 assert.True(t, ok, "Unexpected file %q has been exported: %s", f.Name(), string(got)) 113 assert.Equal(t, want, string(got)) 114 115 if t.Failed() { 116 if os.Getenv("UPDATE_SNAPSHOT") == t.Name() { 117 fn := filepath.Join(exportsDir, f.Name()) 118 require.Errorf(t, os.WriteFile(fn, got, 0666), "Saving snapshot at %s", fn) 119 } else { 120 t.Errorf("Rerun test with UPDATE_SNAPSHOT=%s in order to update the snapshot", t.Name()) 121 } 122 } 123 124 delete(exports, f.Name()) 125 } 126 127 for f := range exports { 128 t.Errorf("Expected %q to be exported", f) 129 } 130 }) 131 }