goyave.dev/goyave/v4@v4.4.11/util/fsutil/fsutil_test.go (about) 1 package fsutil 2 3 import ( 4 "bytes" 5 "io" 6 "mime/multipart" 7 "net/http" 8 "os" 9 "path" 10 "path/filepath" 11 "runtime" 12 "strings" 13 "testing" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func addFileToRequest(writer *multipart.Writer, path, name, fileName string) { 19 file, err := os.Open(path) 20 if err != nil { 21 panic(err) 22 } 23 defer file.Close() 24 part, err := writer.CreateFormFile(name, fileName) 25 if err != nil { 26 panic(err) 27 } 28 _, err = io.Copy(part, file) 29 if err != nil { 30 panic(err) 31 } 32 } 33 34 func createTestFiles(files ...string) []File { 35 _, filename, _, _ := runtime.Caller(1) 36 37 body := &bytes.Buffer{} 38 writer := multipart.NewWriter(body) 39 for _, p := range files { 40 fp := path.Dir(filename) + "/../../" + p 41 addFileToRequest(writer, fp, "file", filepath.Base(fp)) 42 } 43 err := writer.Close() 44 if err != nil { 45 panic(err) 46 } 47 48 req, err := http.NewRequest("POST", "/test-route", body) 49 if err != nil { 50 panic(err) 51 } 52 req.Header.Set("Content-Type", writer.FormDataContentType()) 53 if err := req.ParseMultipartForm(10 << 20); err != nil { 54 panic(err) 55 } 56 return ParseMultipartFiles(req, "file") 57 } 58 59 func toAbsolutePath(relativePath string) string { 60 _, filename, _, _ := runtime.Caller(1) 61 return path.Dir(filename) + "/../../" + relativePath 62 } 63 64 func TestGetFileExtension(t *testing.T) { 65 assert.Equal(t, "png", GetFileExtension("test.png")) 66 assert.Equal(t, "gz", GetFileExtension("test.tar.gz")) 67 assert.Equal(t, "", GetFileExtension("test")) 68 } 69 70 func TestGetMIMEType(t *testing.T) { 71 mime, size := GetMIMEType(toAbsolutePath("resources/img/logo/goyave_16.png")) 72 assert.Equal(t, "image/png", mime) 73 assert.Equal(t, int64(716), size) 74 75 mime, _ = GetMIMEType(toAbsolutePath("resources/test_script.sh")) 76 assert.Equal(t, "text/plain; charset=utf-8", mime) 77 78 mime, _ = GetMIMEType(toAbsolutePath(".gitignore")) 79 assert.Equal(t, "application/octet-stream", mime) 80 81 mime, _ = GetMIMEType(toAbsolutePath("config/config.test.json")) 82 assert.Equal(t, "application/json", mime) 83 84 mime, _ = GetMIMEType(toAbsolutePath("resources/test_script.js")) 85 assert.Equal(t, "text/javascript; charset=utf-8", mime) 86 87 cssPath := toAbsolutePath("util/fsutil/test.css") 88 err := os.WriteFile(cssPath, []byte("body{ margin:0; }"), 0644) 89 if err != nil { 90 panic(err) 91 } 92 mime, _ = GetMIMEType(cssPath) 93 assert.Equal(t, "text/css", mime) 94 Delete(cssPath) 95 96 assert.Panics(t, func() { 97 GetMIMEType(toAbsolutePath("doesn't exist")) 98 }) 99 100 t.Run("empty_file", func(t *testing.T) { 101 filename := "empty_GetMIMEType.json" 102 if err := os.WriteFile(filename, []byte{}, 0644); err != nil { 103 panic(err) 104 } 105 106 t.Cleanup(func() { 107 Delete(filename) 108 }) 109 110 mime, size = GetMIMEType(filename) 111 112 assert.Equal(t, "application/json", mime) 113 assert.Equal(t, int64(0), size) 114 }) 115 } 116 117 func TestFileExists(t *testing.T) { 118 assert.True(t, FileExists(toAbsolutePath("resources/img/logo/goyave_16.png"))) 119 assert.False(t, FileExists(toAbsolutePath("doesn't exist"))) 120 } 121 122 func TestIsDirectory(t *testing.T) { 123 assert.True(t, IsDirectory(toAbsolutePath("resources/img/logo"))) 124 assert.False(t, IsDirectory(toAbsolutePath("resources/img/logo/goyave_16.png"))) 125 assert.False(t, IsDirectory(toAbsolutePath("doesn't exist"))) 126 } 127 128 func TestSaveDelete(t *testing.T) { 129 file := createTestFiles("resources/img/logo/goyave_16.png")[0] 130 actualName := file.Save(toAbsolutePath("."), "saved.png") 131 actualPath := toAbsolutePath(actualName) 132 assert.True(t, FileExists(actualPath)) 133 134 Delete(actualPath) 135 assert.False(t, FileExists(actualPath)) 136 137 file = createTestFiles("resources/img/logo/goyave_16.png")[0] 138 actualName = file.Save(toAbsolutePath("."), "saved") 139 actualPath = toAbsolutePath(actualName) 140 assert.Equal(t, -1, strings.Index(actualName, ".")) 141 assert.True(t, FileExists(actualPath)) 142 143 Delete(actualPath) 144 assert.False(t, FileExists(actualPath)) 145 146 assert.Panics(t, func() { 147 Delete(actualPath) 148 }) 149 150 file = createTestFiles("resources/img/logo/goyave_16.png")[0] 151 path := toAbsolutePath("./subdir") 152 actualName = file.Save(path, "saved") 153 actualPath = toAbsolutePath("./subdir/" + actualName) 154 assert.True(t, FileExists(actualPath)) 155 156 os.RemoveAll(path) 157 assert.False(t, FileExists(actualPath)) 158 159 file = createTestFiles("resources/img/logo/goyave_16.png")[0] 160 assert.Panics(t, func() { 161 file.Save(toAbsolutePath("./go.mod"), "saved") 162 }) 163 } 164 165 func TestOpenFileError(t *testing.T) { 166 dir := "./forbidden_directory" 167 assert.Panics(t, func() { 168 os.Mkdir(dir, 0500) 169 defer os.RemoveAll(dir) 170 file := createTestFiles("resources/img/logo/goyave_16.png")[0] 171 file.Save(dir, "saved.png") 172 }) 173 }