github.com/ChicK00o/awgo@v0.29.4/util/files_test.go (about) 1 // Copyright (c) 2019 Dean Jackson <deanishe@deanishe.net> 2 // MIT Licence applies http://opensource.org/licenses/MIT 3 4 package util 5 6 import ( 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func inTempDir(fun func(dir string)) error { 17 curdir, err := os.Getwd() 18 if err != nil { 19 return err 20 } 21 22 dir, err := ioutil.TempDir("", "awgo-util-") 23 if err != nil { 24 return err 25 } 26 // TempDir() returns a symlink on my macOS :( 27 if dir, err = filepath.EvalSymlinks(dir); err != nil { 28 return err 29 } 30 31 defer func() { 32 if err := os.RemoveAll(dir); err != nil { 33 panic(err) 34 } 35 }() 36 37 // Change to temporary directory 38 if err := os.Chdir(dir); err != nil { 39 return err 40 } 41 42 // Change back after we're done 43 defer func() { 44 if err := os.Chdir(curdir); err != nil { 45 panic(err) 46 } 47 }() 48 49 fun(dir) 50 51 return nil 52 } 53 54 func TestMustExist(t *testing.T) { 55 err := inTempDir(func(dir string) { 56 name := "testdir" 57 58 // Create directory 59 s := MustExist(name) 60 assert.Equal(t, name, s, "unexpected dirname") 61 62 _, err := os.Stat(s) 63 assert.Nil(t, err, "stat dir failed") 64 65 // Check path is as expected 66 p := filepath.Join(dir, name) 67 p2, err := filepath.Abs(s) 68 require.Nil(t, err, "filepath.Abs failed") 69 assert.Equal(t, p, p2, "unexpected path") 70 }) 71 72 require.Nil(t, err, "inTempDir failed") 73 } 74 75 func TestPathExists(t *testing.T) { 76 t.Parallel() 77 78 err := inTempDir(func(dir string) { 79 name := "existingdir" 80 path := filepath.Join(dir, name) 81 badName := "nodir" 82 badPath := filepath.Join(dir, badName) 83 84 require.Nil(t, os.MkdirAll(name, 0700), "MkdirAll failed") 85 86 data := []struct { 87 p string 88 x bool 89 }{ 90 {dir, true}, 91 {name, true}, 92 {path, true}, 93 {badName, false}, 94 {badPath, false}, 95 } 96 97 for _, td := range data { 98 assert.Equal(t, td.x, PathExists(td.p), "unexpected result") 99 } 100 }) 101 102 require.Nil(t, err, "inTempDir failed") 103 } 104 105 func TestClearDirectory(t *testing.T) { 106 err := inTempDir(func(dir string) { 107 names := []string{"./root/one", "./root/two", "./root/three"} 108 for _, s := range names { 109 require.Nil(t, os.MkdirAll(s, 0700), "MkdirAll failed") 110 } 111 112 for _, s := range names { 113 _, err := os.Stat(s) 114 assert.Nil(t, err, "stat failed") 115 } 116 assert.Nil(t, ClearDirectory("./root"), "ClearDirectory failed") 117 118 for _, s := range names { 119 s := s 120 t.Run(s, func(t *testing.T) { 121 _, err := os.Stat(s) 122 assert.True(t, os.IsNotExist(err), "file exists") 123 }) 124 } 125 }) 126 require.Nil(t, err, "inTempDir failed") 127 } 128 129 func TestWriteFile(t *testing.T) { 130 err := inTempDir(func(dir string) { 131 var ( 132 name = "test.txt" 133 content = []byte(`test`) 134 ) 135 136 require.False(t, PathExists(name), "path already exists") 137 require.Nil(t, WriteFile(name, content, 0600), "WriteFile failed") 138 require.True(t, PathExists(name), "path does not exist") 139 140 data, err := ioutil.ReadFile(name) 141 require.Nil(t, err, "read file failed") 142 143 assert.Equal(t, content, data, "unexpected file content") 144 145 fi, err := os.Stat(name) 146 require.Nil(t, err, "stat file failed") 147 assert.Equal(t, os.FileMode(0600), fi.Mode(), "unexpected file mode") 148 149 infos, err := ioutil.ReadDir(".") 150 require.Nil(t, err, "ReadDir failed") 151 assert.Equal(t, 1, len(infos), "unexpected no. of files") 152 }) 153 require.Nil(t, err, "inTempDir failed") 154 }