github.com/hairyhenderson/gomplate/v4@v4.0.0-pre-2.0.20240520121557-362f058f0c93/internal/datafs/getenv_test.go (about) 1 package datafs 2 3 import ( 4 "errors" 5 "io/fs" 6 "testing" 7 "testing/fstest" 8 9 "github.com/hack-pad/hackpadfs" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestGetenvFsys(t *testing.T) { 15 fsys := fs.FS(fstest.MapFS{ 16 "tmp": &fstest.MapFile{Mode: fs.ModeDir | 0o777}, 17 "tmp/foo": &fstest.MapFile{Data: []byte("foo")}, 18 "tmp/unreadable": &fstest.MapFile{Data: []byte("foo"), Mode: 0o000}, 19 }) 20 fsys = WrapWdFS(fsys) 21 22 t.Setenv("FOO_FILE", "/tmp/foo") 23 assert.Equal(t, "foo", GetenvFsys(fsys, "FOO", "bar")) 24 25 t.Setenv("FOO_FILE", "/tmp/missing") 26 assert.Equal(t, "bar", GetenvFsys(fsys, "FOO", "bar")) 27 28 fsys = writeOnly(fsys) 29 t.Setenv("FOO_FILE", "/tmp/unreadable") 30 assert.Equal(t, "bar", GetenvFsys(fsys, "FOO", "bar")) 31 } 32 33 func TestExpandEnvFsys(t *testing.T) { 34 fsys := fs.FS(fstest.MapFS{ 35 "tmp": &fstest.MapFile{Mode: fs.ModeDir | 0o777}, 36 "tmp/foo": &fstest.MapFile{Data: []byte("foo")}, 37 "tmp/unreadable": &fstest.MapFile{Data: []byte("foo"), Mode: 0o000}, 38 }) 39 fsys = WrapWdFS(fsys) 40 41 t.Setenv("FOO_FILE", "/tmp/foo") 42 assert.Equal(t, "foo is foo", ExpandEnvFsys(fsys, "foo is $FOO")) 43 44 t.Setenv("FOO_FILE", "/tmp/missing") 45 assert.Equal(t, "empty", ExpandEnvFsys(fsys, "${FOO}empty")) 46 47 fsys = writeOnly(fsys) 48 t.Setenv("FOO_FILE", "/tmp/unreadable") 49 assert.Equal(t, "", ExpandEnvFsys(fsys, "${FOO}")) 50 } 51 52 // Maybe extract this into a separate package sometime... 53 // writeOnly - represents a filesystem that's writeable, but read operations fail 54 func writeOnly(fsys fs.FS) fs.FS { 55 return &woFS{fsys} 56 } 57 58 type woFS struct { 59 fsys fs.FS 60 } 61 62 func (fsys woFS) Open(name string) (fs.File, error) { 63 f, err := fsys.fsys.Open(name) 64 return writeOnlyFile(f), err 65 } 66 67 func (fsys woFS) ReadDir(_ string) ([]fs.DirEntry, error) { 68 return nil, ErrWriteOnly 69 } 70 71 func (fsys woFS) Stat(_ string) (fs.FileInfo, error) { 72 return nil, ErrWriteOnly 73 } 74 75 func writeOnlyFile(f fs.File) fs.File { 76 if f == nil { 77 return nil 78 } 79 80 return &woFile{f} 81 } 82 83 type woFile struct { 84 fs.File 85 } 86 87 // Write - 88 func (f woFile) Write(p []byte) (n int, err error) { 89 return hackpadfs.WriteFile(f.File, p) 90 } 91 92 // Read is disabled and returns ErrWriteOnly 93 func (f woFile) Read([]byte) (n int, err error) { 94 return 0, ErrWriteOnly 95 } 96 97 var ErrWriteOnly = errors.New("filesystem is write-only")