github.com/hairyhenderson/gomplate/v4@v4.0.0-pre-2.0.20240520121557-362f058f0c93/internal/datafs/stdinfs_test.go (about) 1 package datafs 2 3 import ( 4 "bytes" 5 "context" 6 "io" 7 "io/fs" 8 "net/url" 9 "testing" 10 11 "github.com/hairyhenderson/go-fsimpl" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestStdinFS_Open(t *testing.T) { 17 fsys, err := NewStdinFS(nil) 18 require.NoError(t, err) 19 assert.IsType(t, &stdinFS{}, fsys) 20 21 f, err := fsys.Open("foo") 22 require.NoError(t, err) 23 assert.IsType(t, &stdinFile{}, f) 24 } 25 26 func TestStdinFile_Read(t *testing.T) { 27 content := `hello world` 28 29 f := &stdinFile{name: "foo", body: bytes.NewBufferString(content)} 30 b := make([]byte, len(content)) 31 n, err := f.Read(b) 32 require.NoError(t, err) 33 assert.Equal(t, len(content), n) 34 assert.Equal(t, content, string(b)) 35 } 36 37 func TestStdinFile_Stat(t *testing.T) { 38 content := []byte(`hello world`) 39 40 f := &stdinFile{name: "hello", body: bytes.NewReader(content)} 41 42 fi, err := f.Stat() 43 require.NoError(t, err) 44 assert.Equal(t, int64(len(content)), fi.Size()) 45 46 f = &stdinFile{name: "hello", body: &errorReader{err: fs.ErrPermission}} 47 48 _, err = f.Stat() 49 require.ErrorIs(t, err, fs.ErrPermission) 50 } 51 52 func TestStdinFS(t *testing.T) { 53 u, _ := url.Parse("stdin:") 54 55 content := []byte("\nhello file\n") 56 57 ctx := ContextWithStdin(context.Background(), bytes.NewReader(content)) 58 59 fsys, err := NewStdinFS(u) 60 require.NoError(t, err) 61 assert.IsType(t, &stdinFS{}, fsys) 62 63 _, ok := fsys.(*stdinFS) 64 assert.True(t, ok) 65 66 fsys = fsimpl.WithContextFS(ctx, fsys) 67 68 b, err := fs.ReadFile(fsys, "foo") 69 require.NoError(t, err) 70 assert.Equal(t, "\nhello file\n", string(b)) 71 72 ctx = ContextWithStdin(context.Background(), bytes.NewReader(content)) 73 fsys = fsimpl.WithContextFS(ctx, fsys) 74 75 _, err = fsys.Open("..") 76 require.ErrorIs(t, err, fs.ErrInvalid) 77 78 _, err = fs.ReadFile(fsys, "/foo") 79 require.ErrorIs(t, err, fs.ErrInvalid) 80 81 f, err := fsys.Open("doesn't matter what it's named.txt") 82 require.NoError(t, err) 83 84 fi, err := f.Stat() 85 require.NoError(t, err) 86 assert.Equal(t, int64(len(content)), fi.Size()) 87 88 b, err = io.ReadAll(f) 89 require.NoError(t, err) 90 assert.Equal(t, content, b) 91 92 err = f.Close() 93 require.NoError(t, err) 94 95 err = f.Close() 96 require.ErrorIs(t, err, fs.ErrClosed) 97 98 p := make([]byte, 5) 99 _, err = f.Read(p) 100 require.Error(t, err) 101 require.ErrorIs(t, err, io.EOF) 102 } 103 104 type errorReader struct { 105 err error 106 } 107 108 func (r *errorReader) Read(_ []byte) (int, error) { 109 return 0, r.err 110 }