github.com/saucelabs/saucectl@v0.175.1/internal/cypress/grep/parser_test.go (about) 1 package grep 2 3 import "testing" 4 5 // Most test cases copied from cypress-grep unit tests: https://github.com/cypress-io/cypress/blob/d422aadfa10e5aaac17ed0e4dd5e18a73d821490/npm/grep/cypress/e2e/unit.js 6 func TestParseGrepTagsExp(t *testing.T) { 7 type testCase struct { 8 exp string 9 tags string 10 want bool 11 } 12 tests := []struct { 13 name string 14 testCases []testCase 15 }{ 16 { 17 name: "Simple expression", 18 testCases: []testCase{ 19 { 20 exp: "@tag", 21 tags: "@tag", 22 want: true, 23 }, 24 { 25 exp: "@tag", 26 tags: "@tag1", 27 want: false, 28 }, 29 { 30 exp: "@tag", 31 tags: "", 32 want: false, 33 }, 34 }, 35 }, 36 { 37 name: "AND matching", 38 testCases: []testCase{ 39 { 40 exp: "smoke+slow", 41 tags: "fast smoke", 42 want: false, 43 }, 44 { 45 exp: "smoke+slow", 46 tags: "mobile smoke slow", 47 want: true, 48 }, 49 { 50 exp: "smoke+slow", 51 tags: "slow extra smoke", 52 want: true, 53 }, 54 { 55 exp: "smoke+slow", 56 tags: "smoke", 57 want: false, 58 }, 59 { 60 exp: "@smoke+@screen-b", 61 tags: "@smoke @screen-b", 62 want: true, 63 }, 64 }, 65 }, 66 { 67 name: "OR matching", 68 testCases: []testCase{ 69 { 70 exp: "smoke slow", 71 tags: "fast smoke", 72 want: true, 73 }, 74 { 75 exp: "smoke", 76 tags: "mobile smoke slow", 77 want: true, 78 }, 79 { 80 exp: "slow", 81 tags: "slow extra smoke", 82 want: true, 83 }, 84 { 85 exp: "smoke", 86 tags: "smoke", 87 want: true, 88 }, 89 { 90 exp: "smoke", 91 tags: "slow", 92 want: false, 93 }, 94 { 95 exp: "@smoke,@slow", 96 tags: "@fast @smoke", 97 want: true, 98 }, 99 }, 100 }, 101 { 102 name: "inverted tag", 103 testCases: []testCase{ 104 { 105 exp: "smoke+-slow", 106 tags: "smoke slow", 107 want: false, 108 }, 109 { 110 exp: "mobile+-slow", 111 tags: "smoke slow", 112 want: false, 113 }, 114 { 115 exp: "smoke -slow", 116 tags: "smoke fast", 117 want: true, 118 }, 119 { 120 exp: "-slow", 121 tags: "smoke slow", 122 want: false, 123 }, 124 { 125 exp: "-slow", 126 tags: "smoke", 127 want: true, 128 }, 129 { 130 exp: "-slow", 131 tags: "", 132 want: true, 133 }, 134 }, 135 }, 136 { 137 name: "global inverted tag", 138 testCases: []testCase{ 139 { 140 // This expression is equivalent to @smoke+-@slow @e2e+-@slow 141 exp: "@smoke @e2e --@slow", 142 tags: "@smoke @slow", 143 want: false, 144 }, 145 { 146 exp: "@smoke @e2e --@slow", 147 tags: "@smoke", 148 want: true, 149 }, 150 { 151 exp: "@smoke @e2e --@slow", 152 tags: "@slow", 153 want: false, 154 }, 155 }, 156 }, 157 { 158 name: "empty values", 159 testCases: []testCase{ 160 { 161 exp: "", 162 tags: "@smoke @slow", 163 want: true, 164 }, 165 { 166 exp: "", 167 tags: "", 168 want: true, 169 }, 170 { 171 exp: "@smoke", 172 tags: "", 173 want: false, 174 }, 175 }, 176 }, 177 { 178 name: "should handle slightly malformed expressions", 179 testCases: []testCase{ 180 { 181 exp: " +@smoke", 182 tags: "@smoke @slow", 183 want: true, 184 }, 185 { 186 exp: " +@smoke", 187 tags: "@slow", 188 want: false, 189 }, 190 { 191 exp: ",, @tag1,-@tag2,, ,, ,", 192 tags: "@tag1", 193 want: true, 194 }, 195 { 196 exp: ",, @tag1,-@tag2,, ,, ,", 197 tags: "@tag2", 198 want: false, 199 }, 200 }, 201 }, 202 } 203 204 for _, tt := range tests { 205 t.Run(tt.name, func(t *testing.T) { 206 for _, tc := range tt.testCases { 207 p := ParseGrepTagsExp(tc.exp) 208 if got := p.Eval(tc.tags); got != tc.want { 209 t.Errorf("expression (%s) for (%s) got = (%t); want = (%t)", tc.exp, tc.tags, got, tc.want) 210 } 211 } 212 }) 213 } 214 } 215 216 func TestParseTitleGrepExp(t *testing.T) { 217 type testCase struct { 218 exp string 219 title string 220 want bool 221 } 222 tests := []struct { 223 name string 224 testCases []testCase 225 }{ 226 { 227 name: "Simple tag", 228 testCases: []testCase{ 229 { 230 exp: "@tag1", 231 title: "no tag1 here", 232 want: false, 233 }, 234 { 235 title: "has @tag1 in the name", 236 want: true, 237 }, 238 }, 239 }, 240 { 241 name: "With invert title", 242 testCases: []testCase{ 243 { 244 exp: "-hello", 245 title: "no greetings", 246 want: true, 247 }, 248 { 249 exp: "-hello", 250 title: "has hello world", 251 want: false, 252 }, 253 }, 254 }, 255 { 256 name: "Multiple invert strings and a simple one", 257 testCases: []testCase{ 258 { 259 exp: "-name;-hey;number", 260 title: "number should only be matches without a n-a-m-e", 261 want: true, 262 }, 263 { 264 exp: "-name;-hey;number", 265 title: "number can't be name", 266 want: false, 267 }, 268 { 269 exp: "-name;-hey;number", 270 title: "The man needs a name", 271 want: false, 272 }, 273 { 274 exp: "-name;-hey;number", 275 title: "number hey name", 276 want: false, 277 }, 278 { 279 exp: "-name;-hey;number", 280 title: "numbers hey name", 281 want: false, 282 }, 283 { 284 exp: "-name;-hey;number", 285 title: "number hsey nsame", 286 want: true, 287 }, 288 { 289 exp: "-name;-hey;number", 290 title: "This wont match", 291 want: false, 292 }, 293 }, 294 }, 295 { 296 name: "Only inverted strings", 297 testCases: []testCase{ 298 { 299 exp: "-name;-hey", 300 title: "I'm matched", 301 want: true, 302 }, 303 { 304 exp: "-name;-hey", 305 title: "hey! I'm not", 306 want: false, 307 }, 308 { 309 exp: "-name;-hey", 310 title: "My name is weird", 311 want: false, 312 }, 313 }, 314 }, 315 { 316 name: "Empty values", 317 testCases: []testCase{ 318 { 319 exp: "", 320 title: "", 321 want: true, 322 }, 323 { 324 exp: "", 325 title: "test title", 326 want: true, 327 }, 328 { 329 exp: "some title to match", 330 title: "", 331 want: false, 332 }, 333 }, 334 }, 335 } 336 337 for _, tt := range tests { 338 t.Run(tt.name, func(t *testing.T) { 339 for _, tc := range tt.testCases { 340 p := ParseGrepTitleExp(tc.exp) 341 if got := p.Eval(tc.title); got != tc.want { 342 t.Errorf("title expression (%s) for (%s) got = (%t); want = (%t)", tc.exp, tc.title, got, tc.want) 343 } 344 } 345 }) 346 } 347 }