goyave.dev/goyave/v5@v5.0.0-rc9.0.20240517145003-d3f977d0b9f3/util/fsutil/osfs/osfs_test.go (about) 1 package osfs 2 3 import ( 4 "io" 5 "io/fs" 6 "os" 7 "path" 8 "runtime" 9 "testing" 10 11 "github.com/samber/lo" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 "goyave.dev/goyave/v5/util/fsutil" 15 ) 16 17 func setRootWorkingDirectory() { 18 _, filename, _, _ := runtime.Caller(1) 19 directory := path.Dir(filename) 20 for !fsutil.FileExists(&FS{}, path.Join(directory, "go.mod")) { 21 directory = path.Join(directory, "..") 22 if !fsutil.IsDirectory(&FS{}, directory) { 23 panic("Couldn't find project's root directory.") 24 } 25 } 26 if err := os.Chdir(directory); err != nil { 27 panic(err) 28 } 29 } 30 31 func TestOSFS(t *testing.T) { 32 33 setRootWorkingDirectory() 34 35 t.Run("Open", func(t *testing.T) { 36 fs := &FS{} 37 file, err := fs.Open("resources/test_file.txt") 38 require.NoError(t, err) 39 defer func() { 40 assert.NoError(t, file.Close()) 41 }() 42 contents, err := io.ReadAll(file) 43 assert.NoError(t, err) 44 assert.Equal(t, append([]byte{0xef, 0xbb, 0xbf}, []byte("utf-8 with BOM content")...), contents) 45 }) 46 47 t.Run("OpenFile", func(t *testing.T) { 48 fs := &FS{} 49 file, err := fs.OpenFile("resources/test_file.txt", os.O_RDONLY, 0660) 50 require.NoError(t, err) 51 defer func() { 52 assert.NoError(t, file.Close()) 53 }() 54 contents, err := io.ReadAll(file) 55 assert.NoError(t, err) 56 assert.Equal(t, append([]byte{0xef, 0xbb, 0xbf}, []byte("utf-8 with BOM content")...), contents) 57 }) 58 59 t.Run("ReadDir", func(t *testing.T) { 60 osfs := &FS{} 61 entries, err := osfs.ReadDir("resources/lang") 62 require.NoError(t, err) 63 64 type result struct { 65 name string 66 isdir bool 67 } 68 69 expected := []result{ 70 {name: "en-UK", isdir: true}, 71 {name: "en-US", isdir: true}, 72 {name: "invalid.json", isdir: false}, 73 } 74 75 assert.Equal(t, expected, lo.Map(entries, func(e fs.DirEntry, _ int) result { 76 return result{name: e.Name(), isdir: e.IsDir()} 77 })) 78 }) 79 80 t.Run("Stat", func(t *testing.T) { 81 fs := &FS{} 82 info, err := fs.Stat("resources/test_file.txt") 83 require.NoError(t, err) 84 85 assert.False(t, info.IsDir()) 86 assert.Equal(t, "test_file.txt", info.Name()) 87 }) 88 89 t.Run("Getwd", func(t *testing.T) { 90 fs := &FS{} 91 wd, err := fs.Getwd() 92 require.NoError(t, err) 93 assert.NotEmpty(t, wd) 94 }) 95 96 t.Run("FileExists", func(t *testing.T) { 97 fs := &FS{} 98 assert.True(t, fs.FileExists("resources/test_file.txt")) 99 assert.False(t, fs.FileExists("resources")) 100 assert.False(t, fs.FileExists("resources/notafile.txt")) 101 }) 102 103 t.Run("IsDirectory", func(t *testing.T) { 104 fs := &FS{} 105 assert.False(t, fs.IsDirectory("resources/test_file.txt")) 106 assert.True(t, fs.IsDirectory("resources")) 107 assert.False(t, fs.IsDirectory("resources/notadir")) 108 }) 109 110 t.Run("Mkdir", func(t *testing.T) { 111 fs := &FS{} 112 path := "resources/testdir" 113 114 t.Cleanup(func() { 115 if err := os.RemoveAll(path); err != nil { 116 panic(err) 117 } 118 }) 119 120 require.NoError(t, fs.Mkdir(path, 0770)) 121 assert.True(t, fs.IsDirectory(path)) 122 }) 123 124 t.Run("MkdirAll", func(t *testing.T) { 125 fs := &FS{} 126 path := "resources/testdirall/subdir" 127 128 t.Cleanup(func() { 129 if err := os.RemoveAll("resources/testdirall"); err != nil { 130 panic(err) 131 } 132 }) 133 134 require.NoError(t, fs.MkdirAll(path, 0770)) 135 assert.True(t, fs.IsDirectory(path)) 136 }) 137 138 t.Run("Remove", func(t *testing.T) { 139 fs := &FS{} 140 path := "resources/testdirremove" 141 assert.NoError(t, fs.MkdirAll(path, 0770)) 142 assert.True(t, fs.IsDirectory(path)) 143 assert.NoError(t, fs.Remove(path)) 144 assert.False(t, fs.IsDirectory(path)) 145 }) 146 147 t.Run("RemoveAll", func(t *testing.T) { 148 fs := &FS{} 149 path := "resources/testdirremoveall/subdir" 150 assert.NoError(t, fs.MkdirAll(path, 0770)) 151 assert.True(t, fs.IsDirectory(path)) 152 assert.NoError(t, fs.RemoveAll("resources/testdirremoveall")) 153 assert.False(t, fs.IsDirectory(path)) 154 assert.False(t, fs.IsDirectory("resources/testdirremoveall")) 155 }) 156 157 t.Run("Sub", func(t *testing.T) { 158 f, err := (&FS{}).Sub("resources") 159 require.NoError(t, err) 160 require.Equal(t, "resources", f.dir) 161 162 file, err := f.Open("test_file.txt") 163 require.NoError(t, err) 164 defer func() { 165 assert.NoError(t, file.Close()) 166 }() 167 contents, err := io.ReadAll(file) 168 assert.NoError(t, err) 169 assert.Equal(t, append([]byte{0xef, 0xbb, 0xbf}, []byte("utf-8 with BOM content")...), contents) 170 171 subfs, err := f.Sub("lang") 172 require.NoError(t, err) 173 require.Equal(t, "resources/lang", subfs.dir) 174 175 file2, err := subfs.Open("invalid.json") 176 require.NoError(t, err) 177 defer func() { 178 assert.NoError(t, file2.Close()) 179 }() 180 contents, err = io.ReadAll(file2) 181 assert.NoError(t, err) 182 assert.Equal(t, []byte("[]"), contents) 183 184 dotFS, err := subfs.Sub(".") 185 assert.NoError(t, err) 186 assert.Same(t, subfs, dotFS) 187 188 _, err = subfs.Sub("\xC0") 189 require.Error(t, err) 190 if pathErr, ok := err.(*fs.PathError); assert.True(t, ok) { 191 assert.Equal(t, "sub", pathErr.Op) 192 assert.Equal(t, "resources/lang/\xC0", pathErr.Path) 193 assert.Equal(t, "invalid name", pathErr.Err.Error()) 194 } 195 }) 196 197 t.Run("New", func(t *testing.T) { 198 fs := New("/home") 199 assert.Equal(t, "/home", fs.dir) 200 }) 201 }