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