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  }