github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/filter_test.go (about) 1 package render 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/pkg/errors" 8 "github.com/spf13/afero" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func Test_removeDests(t *testing.T) { 13 type fileStruct struct { 14 name string 15 data string 16 } 17 18 tests := []struct { 19 name string 20 inputFiles []fileStruct 21 dests []string 22 wantFiles []fileStruct 23 wantErr bool 24 }{ 25 { 26 name: "nonexistent dest", 27 inputFiles: []fileStruct{ 28 { 29 name: "abc/xyz.test", 30 data: "this is a test file", 31 }, 32 }, 33 dests: []string{"notexist.abc"}, 34 wantFiles: []fileStruct{ 35 { 36 name: "abc/xyz.test", 37 data: "this is a test file", 38 }, 39 }, 40 }, 41 { 42 name: "single file", 43 inputFiles: []fileStruct{ 44 { 45 name: "abc/xyz.test", 46 data: "this is a test file", 47 }, 48 { 49 name: "abc/test.file", 50 data: "this is a test file", 51 }, 52 }, 53 dests: []string{"abc/test.file"}, 54 wantFiles: []fileStruct{}, 55 }, 56 { 57 name: "single dir", 58 inputFiles: []fileStruct{ 59 { 60 name: "abc/xyz.test", 61 data: "this is a test file", 62 }, 63 { 64 name: "abc/test/a.file", 65 data: "this is a test file", 66 }, 67 }, 68 dests: []string{"abc/test"}, 69 wantFiles: []fileStruct{ 70 { 71 name: "abc/xyz.test", 72 data: "this is a test file", 73 }, 74 }, 75 }, 76 { 77 name: "dir and file", 78 inputFiles: []fileStruct{ 79 { 80 name: "another/test.test", 81 data: "this is a test file", 82 }, 83 { 84 name: "abc/xyz.test", 85 data: "this is a test file", 86 }, 87 { 88 name: "abc/test/a.file", 89 data: "this is a test file", 90 }, 91 { 92 name: "abc/test/b.file", 93 data: "this is a test file", 94 }, 95 }, 96 dests: []string{"abc/test", "another/test.test"}, 97 wantFiles: []fileStruct{ 98 { 99 name: "abc/xyz.test", 100 data: "this is a test file", 101 }, 102 }, 103 }, 104 { 105 name: "illegal absolute dest", 106 inputFiles: []fileStruct{ 107 { 108 name: "abc/xyz.test", 109 data: "this is a test file", 110 }, 111 }, 112 dests: []string{"/illegal/absolute/path.abc"}, 113 wantFiles: []fileStruct{ 114 { 115 name: "abc/xyz.test", 116 data: "this is a test file", 117 }, 118 }, 119 }, 120 { 121 name: "illegal relative dest", 122 inputFiles: []fileStruct{ 123 { 124 name: "abc/xyz.test", 125 data: "this is a test file", 126 }, 127 }, 128 dests: []string{"../../../illegal/relative/path.abc"}, 129 wantFiles: []fileStruct{ 130 { 131 name: "abc/xyz.test", 132 data: "this is a test file", 133 }, 134 }, 135 }, 136 } 137 for _, tt := range tests { 138 t.Run(tt.name, func(t *testing.T) { 139 req := require.New(t) 140 141 // setup input FS 142 mockFs := afero.Afero{Fs: afero.NewMemMapFs()} 143 req.NoError(mockFs.MkdirAll("", os.FileMode(0644))) 144 for _, inFile := range tt.inputFiles { 145 req.NoError(mockFs.WriteFile(inFile.name, []byte(inFile.data), os.FileMode(0644))) 146 } 147 148 if err := removeDests(&mockFs, tt.dests); (err != nil) != tt.wantErr { 149 t.Errorf("removeDests() error = %v, wantErr %v", err, tt.wantErr) 150 } 151 152 // compare output FS 153 var expectedFileNames, actualFileNames []string 154 for _, expectedFile := range tt.wantFiles { 155 expectedFileNames = append(expectedFileNames, expectedFile.name) 156 } 157 err := mockFs.Walk("", func(path string, info os.FileInfo, err error) error { 158 if err != nil { 159 return errors.Wrapf(err, "walk path %s", path) 160 } 161 if !info.IsDir() { 162 actualFileNames = append(actualFileNames, path) 163 } 164 return nil 165 }) 166 req.NoError(err) 167 168 req.ElementsMatch(expectedFileNames, actualFileNames, "comparing expected and actual output files, expected %+v got %+v", expectedFileNames, actualFileNames) 169 170 for _, outFile := range tt.wantFiles { 171 fileBytes, err := mockFs.ReadFile(outFile.name) 172 req.NoError(err, "reading output file %s", outFile.name) 173 174 req.Equal(outFile.data, string(fileBytes), "compare file %s", outFile.name) 175 } 176 }) 177 } 178 }