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  }