github.com/vnforks/kid@v5.11.1+incompatible/utils/fileutils/fileutils_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package fileutils 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestFindFile(t *testing.T) { 18 t.Run("files from various paths", func(t *testing.T) { 19 // Create the following directory structure: 20 // tmpDir1/ 21 // file1.json 22 // file2.xml 23 // other.txt 24 // tmpDir2/ 25 // other.txt/ [directory] 26 // tmpDir3/ 27 // tmpDir4/ 28 // tmpDir5/ 29 tmpDir1, err := ioutil.TempDir("", "") 30 require.NoError(t, err) 31 defer os.RemoveAll(tmpDir1) 32 33 tmpDir2, err := ioutil.TempDir(tmpDir1, "") 34 require.NoError(t, err) 35 36 err = os.Mkdir(filepath.Join(tmpDir2, "other.txt"), 0700) 37 require.NoError(t, err) 38 39 tmpDir3, err := ioutil.TempDir(tmpDir2, "") 40 require.NoError(t, err) 41 42 tmpDir4, err := ioutil.TempDir(tmpDir3, "") 43 require.NoError(t, err) 44 45 tmpDir5, err := ioutil.TempDir(tmpDir4, "") 46 require.NoError(t, err) 47 48 type testCase struct { 49 Description string 50 Cwd *string 51 FileName string 52 Expected string 53 } 54 55 testCases := []testCase{} 56 57 for _, fileName := range []string{"file1.json", "file2.xml", "other.txt"} { 58 filePath := filepath.Join(tmpDir1, fileName) 59 require.NoError(t, ioutil.WriteFile(filePath, []byte("{}"), 0600)) 60 61 // Relative paths end up getting symlinks fully resolved, so use this below as necessary. 62 filePathResolved, err := filepath.EvalSymlinks(filePath) 63 require.NoError(t, err) 64 65 testCases = append(testCases, []testCase{ 66 { 67 fmt.Sprintf("absolute path to %s", fileName), 68 nil, 69 filePath, 70 filePath, 71 }, 72 { 73 fmt.Sprintf("absolute path to %s from containing directory", fileName), 74 &tmpDir1, 75 filePath, 76 filePath, 77 }, 78 { 79 fmt.Sprintf("relative path to %s from containing directory", fileName), 80 &tmpDir1, 81 fileName, 82 filePathResolved, 83 }, 84 { 85 fmt.Sprintf("%s: subdirectory of containing directory", fileName), 86 &tmpDir2, 87 fileName, 88 filePathResolved, 89 }, 90 { 91 fmt.Sprintf("%s: twice-nested subdirectory of containing directory", fileName), 92 &tmpDir3, 93 fileName, 94 filePathResolved, 95 }, 96 { 97 fmt.Sprintf("%s: thrice-nested subdirectory of containing directory", fileName), 98 &tmpDir4, 99 fileName, 100 filePathResolved, 101 }, 102 { 103 fmt.Sprintf("%s: can't find from four nesting levels deep", fileName), 104 &tmpDir5, 105 fileName, 106 "", 107 }, 108 }...) 109 } 110 111 for _, testCase := range testCases { 112 t.Run(testCase.Description, func(t *testing.T) { 113 if testCase.Cwd != nil { 114 prevDir, err := os.Getwd() 115 require.NoError(t, err) 116 defer os.Chdir(prevDir) 117 os.Chdir(*testCase.Cwd) 118 } 119 120 assert.Equal(t, testCase.Expected, FindFile(testCase.FileName)) 121 }) 122 } 123 }) 124 }