github.com/sudo-bmitch/version-bump@v0.0.0-20240503123857-70b0e3f646dd/internal/filesearch/filesearch_test.go (about) 1 package filesearch 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 "testing" 8 9 "github.com/sudo-bmitch/version-bump/internal/config" 10 ) 11 12 func TestPattern(t *testing.T) { 13 tests := []struct { 14 name string 15 expr string 16 newErr error 17 filename string 18 prefix bool 19 expect bool 20 }{ 21 { 22 name: "empty", 23 expr: "", 24 filename: "./filename.txt", 25 prefix: false, 26 expect: false, 27 }, 28 { 29 name: "match file", 30 expr: "filename", 31 filename: "filename", 32 prefix: false, 33 expect: true, 34 }, 35 { 36 name: "match path", 37 expr: "path/to/file.txt", 38 filename: "path/to/file.txt", 39 prefix: false, 40 expect: true, 41 }, 42 { 43 name: "mismatch", 44 expr: "path/to/file.txt", 45 filename: "path/from/file.csv", 46 prefix: false, 47 expect: false, 48 }, 49 { 50 name: "prefix", 51 expr: "path/to/file.txt", 52 filename: "path/to", 53 prefix: true, 54 expect: true, 55 }, 56 { 57 name: "not prefix", 58 expr: "path/to/file.txt", 59 filename: "path/from", 60 prefix: true, 61 expect: false, 62 }, 63 { 64 name: "wildcard name", 65 expr: "path/to/*.txt", 66 filename: "path/to/file.txt", 67 prefix: false, 68 expect: true, 69 }, 70 { 71 name: "wildcard ext", 72 expr: "file*", 73 filename: "file", 74 prefix: false, 75 expect: true, 76 }, 77 { 78 name: "wildcard ext path", 79 expr: "path/to/file.*", 80 filename: "path/to/file.txt", 81 prefix: false, 82 expect: true, 83 }, 84 { 85 name: "wildcard file", 86 expr: "path/to/*", 87 filename: "path/to/file.txt", 88 prefix: false, 89 expect: true, 90 }, 91 { 92 name: "wildcard path", 93 expr: "path/*/file.txt", 94 filename: "path/to/file.txt", 95 prefix: false, 96 expect: true, 97 }, 98 { 99 name: "wildcard path prefix", 100 expr: "path/*/file.txt", 101 filename: "path/to", 102 prefix: true, 103 expect: true, 104 }, 105 { 106 name: "wildcard path not prefix", 107 expr: "path/*/file.txt", 108 filename: "path/to/subdir/file.txt", 109 prefix: true, 110 expect: false, 111 }, 112 { 113 name: "wildcard file not prefix", 114 expr: "path/to/*", 115 filename: "path/to/subdir/file.txt", 116 prefix: true, 117 expect: false, 118 }, 119 { 120 name: "double star path", 121 expr: "**/file.txt", 122 filename: "path/to/file.txt", 123 prefix: false, 124 expect: true, 125 }, 126 { 127 name: "double star root", 128 expr: "**/file.txt", 129 filename: "file.txt", 130 prefix: false, 131 expect: true, 132 }, 133 { 134 name: "double star prefix", 135 expr: "**/file.txt", 136 filename: "path/to", 137 prefix: true, 138 expect: true, 139 }, 140 { 141 name: "double star mid nil", 142 expr: "path/**/file.txt", 143 filename: "path/file.txt", 144 prefix: false, 145 expect: true, 146 }, 147 { 148 name: "double star mid multiple", 149 expr: "path/**/file.txt", 150 filename: "path/to/sub/file.txt", 151 prefix: false, 152 expect: true, 153 }, 154 { 155 name: "escape star", 156 expr: "path/to/star\\*file.txt", 157 filename: "path/to/star*file.txt", 158 prefix: false, 159 expect: true, 160 }, 161 { 162 name: "escape star wild", 163 expr: "path/to/*\\*file.txt", 164 filename: "path/to/star*file.txt", 165 prefix: false, 166 expect: true, 167 }, 168 { 169 name: "escape star prefix", 170 expr: "path/to/star\\*file.txt", 171 filename: "path/to", 172 prefix: true, 173 expect: true, 174 }, 175 } 176 for _, tt := range tests { 177 t.Run(tt.name, func(t *testing.T) { 178 p, err := newPattern(tt.expr) 179 if tt.newErr != nil { 180 if err == nil { 181 t.Errorf("newPattern expected %v, err was nil", tt.newErr) 182 } else if !errors.Is(err, tt.newErr) && err.Error() != tt.newErr.Error() { 183 t.Errorf("newPattern expected %v, received %v", tt.newErr, err) 184 } 185 return 186 } 187 if err != nil { 188 t.Errorf("newPattern failed with %v", err) 189 return 190 } 191 result := p.match(tt.filename, tt.prefix) 192 if result != tt.expect { 193 t.Errorf("p.match expected %v, received %v", tt.expect, result) 194 } 195 }) 196 } 197 } 198 199 func TestWalk(t *testing.T) { 200 curdir, err := os.Getwd() 201 if err != nil { 202 t.Errorf("current directory cannot be determined: %v", err) 203 } 204 defer os.Chdir(curdir) 205 err = os.Chdir("../../testdata") 206 if err != nil { 207 t.Errorf("failed to chdir to testdata: %v", err) 208 return 209 } 210 conf, err := config.LoadFile("ex-conf.yaml") 211 if err != nil { 212 t.Errorf("failed to load config: %v", err) 213 return 214 } 215 w, err := New([]string{}, conf.Files) 216 if err != nil { 217 t.Errorf("failed to create walk: %v", err) 218 } 219 list := []struct { 220 filename string 221 confName string 222 }{} 223 for { 224 filename, confName, err := w.Next() 225 if err != nil { 226 if !errors.Is(err, io.EOF) { 227 t.Errorf("failed with error other than eof: %v", err) 228 } 229 break 230 } 231 list = append(list, struct { 232 filename string 233 confName string 234 }{filename: filename, confName: confName}) 235 } 236 if len(list) < 2 || 237 list[0].filename != "01-example.sh" || list[0].confName != "**/*.sh" || 238 list[1].filename != "01-example.sh" || list[1].confName != "01-example.sh" { 239 t.Errorf("expected 2 entries for 01-example.sh, received: %v", list) 240 } 241 }