@@ -384,21 +384,80 @@ func TestStaticNodeMatchMiddleware(t *testing.T) {
384
384
runMiddlewareTests (tests , t )
385
385
}
386
386
387
+ func TestWildcardNodeMatchMiddleware (t * testing.T ) {
388
+ paramSize := 3
389
+ middleware1 := buildMockMiddlewareFunc ("1" )
390
+ middleware2 := buildMockMiddlewareFunc ("2" )
391
+ middleware3 := buildMockMiddlewareFunc ("3" )
392
+ middleware4 := buildMockMiddlewareFunc ("4" )
393
+ mw1 := middleware .NewCollection (middleware1 )
394
+ mw2 := middleware .NewCollection (middleware2 , middleware3 )
395
+ mw3 := middleware .NewCollection (middleware4 )
396
+
397
+ node1 := NewNode ("test" , uint8 (paramSize ))
398
+ node1 .PrependMiddleware (mw1 )
399
+ item := NewNode ("{item}" , node1 .MaxParamsSize ()) // wildcardnode
400
+ item .PrependMiddleware (mw2 )
401
+ view := NewNode ("view" , node1 .MaxParamsSize ()+ 1 )
402
+ view .PrependMiddleware (mw3 )
403
+ node1 .WithChildren (node1 .Tree ().withNode (item ).sort ())
404
+ item .WithChildren (item .Tree ().withNode (view ).sort ())
405
+ node1 .WithChildren (node1 .Tree ().Compile ())
406
+
407
+ node2 := NewNode ("test" , uint8 (paramSize ))
408
+ node2 .PrependMiddleware (mw1 )
409
+ item2 := NewNode ("{item}" , node1 .MaxParamsSize ()) // wildcardnode
410
+ item2 .PrependMiddleware (mw2 )
411
+ item2 .SkipSubPath ()
412
+ node2 .WithChildren (node2 .Tree ().withNode (item2 ).sort ())
413
+ node2 .WithChildren (node2 .Tree ().Compile ())
414
+
415
+ tests := []middlewareTest {
416
+ {
417
+ name : "WildcardNode Exact match" ,
418
+ node : node1 ,
419
+ path : "test/item1" ,
420
+ expectedResult : middleware .NewCollection (middleware1 , middleware2 , middleware3 ),
421
+ },
422
+ {
423
+ name : "WildcardNode Subpath match with skipSubPath" ,
424
+ node : node2 ,
425
+ path : "test/item2/random" ,
426
+ expectedResult : middleware .NewCollection (middleware1 , middleware2 , middleware3 ),
427
+ },
428
+ {
429
+ name : "WildcardNode Subpath match without skipSubPath" ,
430
+ node : node1 ,
431
+ path : "test/item3/view" ,
432
+ expectedResult : middleware .NewCollection (middleware1 , middleware2 , middleware3 , middleware4 ),
433
+ },
434
+ {
435
+ name : "WildcardNode Subpath No match" ,
436
+ node : node1 ,
437
+ path : "test/item4/nomatch" ,
438
+ expectedResult : middleware .NewCollection (middleware1 , middleware2 , middleware3 ),
439
+ },
440
+ }
441
+
442
+ runMiddlewareTests (tests , t )
443
+ }
444
+
387
445
func runMiddlewareTests (tests []middlewareTest , t * testing.T ) {
388
446
for _ , tt := range tests {
389
447
t .Run (tt .name , func (t * testing.T ) {
390
448
got := tt .node .MatchMiddleware (tt .path )
391
449
if len (got ) != len (tt .expectedResult ) {
392
450
t .Errorf ("%s: middleware length mismatch: got= %v, want %v" , tt .name , got , tt .expectedResult )
393
- }
394
- for k , v := range tt .expectedResult {
395
- // reflect.DeepEqual do not work for function values.
396
- // hence compare the pointers of functions as a substitute.
397
- // function pointers are unique to each function, even if the functions have the same code.
398
- expectedPointer := reflect .ValueOf (v ).Pointer ()
399
- gotPointer := reflect .ValueOf (got [k ]).Pointer ()
400
- if expectedPointer != gotPointer {
401
- t .Errorf ("%s: middleware mismatch: got= %v, want %v" , tt .name , v , got [k ])
451
+ } else {
452
+ for k , v := range tt .expectedResult {
453
+ // reflect.DeepEqual do not work for function values.
454
+ // hence compare the pointers of functions as a substitute.
455
+ // function pointers are unique to each function, even if the functions have the same code.
456
+ expectedPointer := reflect .ValueOf (v ).Pointer ()
457
+ gotPointer := reflect .ValueOf (got [k ]).Pointer ()
458
+ if expectedPointer != gotPointer {
459
+ t .Errorf ("%s: middleware mismatch: got= %v, want %v" , tt .name , v , got [k ])
460
+ }
402
461
}
403
462
}
404
463
})
0 commit comments