github.com/hairyhenderson/templater@v3.5.0+incompatible/env/env_test.go (about) 1 package env 2 3 import ( 4 "errors" 5 "os" 6 "testing" 7 8 "github.com/spf13/afero" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestGetenv(t *testing.T) { 14 assert.Empty(t, Getenv("FOOBARBAZ")) 15 assert.Equal(t, os.Getenv("USER"), Getenv("USER")) 16 assert.Equal(t, "default value", Getenv("BLAHBLAHBLAH", "default value")) 17 } 18 19 func TestGetenvFile(t *testing.T) { 20 fs := afero.NewMemMapFs() 21 _ = fs.Mkdir("/tmp", 0777) 22 f, _ := fs.Create("/tmp/foo") 23 _, _ = f.Write([]byte("foo")) 24 25 defer os.Unsetenv("FOO_FILE") 26 os.Setenv("FOO_FILE", "/tmp/foo") 27 assert.Equal(t, "foo", getenvVFS(fs, "FOO", "bar")) 28 29 os.Setenv("FOO_FILE", "/tmp/missing") 30 assert.Equal(t, "bar", getenvVFS(fs, "FOO", "bar")) 31 32 _, _ = fs.Create("/tmp/unreadable") 33 fs = writeOnly(fs) 34 os.Setenv("FOO_FILE", "/tmp/unreadable") 35 assert.Equal(t, "bar", getenvVFS(fs, "FOO", "bar")) 36 } 37 38 func TestExpandEnv(t *testing.T) { 39 assert.Empty(t, ExpandEnv("${FOOBARBAZ}")) 40 assert.Equal(t, os.Getenv("USER"), ExpandEnv("$USER")) 41 assert.Equal(t, "something", ExpandEnv("something$BLAHBLAHBLAH")) 42 assert.Equal(t, os.Getenv("USER")+": "+os.Getenv("HOME"), 43 ExpandEnv("$USER: ${HOME}")) 44 } 45 46 func TestExpandEnvFile(t *testing.T) { 47 fs := afero.NewMemMapFs() 48 _ = fs.Mkdir("/tmp", 0777) 49 f, _ := fs.Create("/tmp/foo") 50 _, _ = f.Write([]byte("foo")) 51 52 defer os.Unsetenv("FOO_FILE") 53 os.Setenv("FOO_FILE", "/tmp/foo") 54 assert.Equal(t, "foo is foo", expandEnvVFS(fs, "foo is $FOO")) 55 56 os.Setenv("FOO_FILE", "/tmp/missing") 57 assert.Equal(t, "empty", expandEnvVFS(fs, "${FOO}empty")) 58 59 _, _ = fs.Create("/tmp/unreadable") 60 fs = writeOnly(fs) 61 os.Setenv("FOO_FILE", "/tmp/unreadable") 62 assert.Equal(t, "", expandEnvVFS(fs, "${FOO}")) 63 } 64 65 // Maybe extract this into a separate package sometime... 66 // writeOnly - represents a filesystem that's writeable, but read operations fail 67 func writeOnly(fs afero.Fs) afero.Fs { 68 return &woFS{fs} 69 } 70 71 type woFS struct { 72 afero.Fs 73 } 74 75 func (fs woFS) Remove(name string) error { 76 return fs.Fs.Remove(name) 77 } 78 79 func (fs woFS) Rename(oldpath, newpath string) error { 80 return fs.Fs.Rename(oldpath, newpath) 81 } 82 83 func (fs woFS) Mkdir(name string, perm os.FileMode) error { 84 return fs.Fs.Mkdir(name, perm) 85 } 86 87 func (fs woFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { 88 f, err := fs.Fs.OpenFile(name, flag, perm) 89 if err != nil { 90 return writeOnlyFile(f), err 91 } 92 return writeOnlyFile(f), nil 93 } 94 95 func (fs woFS) ReadDir(path string) ([]os.FileInfo, error) { 96 return nil, ErrWriteOnly 97 } 98 99 func (fs woFS) Stat(name string) (os.FileInfo, error) { 100 return nil, ErrWriteOnly 101 } 102 103 func writeOnlyFile(f afero.File) afero.File { 104 return &woFile{f} 105 } 106 107 type woFile struct { 108 afero.File 109 } 110 111 // Write is disabled and returns ErrWriteOnly 112 func (f woFile) Write(p []byte) (n int, err error) { 113 return f.File.Write(p) 114 } 115 116 // Read is disabled and returns ErrWriteOnly 117 func (f woFile) Read([]byte) (n int, err error) { 118 return 0, ErrWriteOnly 119 } 120 121 var ErrWriteOnly = errors.New("filesystem is write-only")