Skip to content

Commit b1a0809

Browse files
authored
Update node_test.go with TestWildcardNodeMatchRoute test case
1 parent d124c05 commit b1a0809

File tree

1 file changed

+95
-9
lines changed

1 file changed

+95
-9
lines changed

mux/node_test.go

Lines changed: 95 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mux
22

33
import (
4+
"reflect"
45
"testing"
56

67
"github.com/vardius/gorouter/v4/context"
@@ -39,7 +40,7 @@ type mockroute struct {
3940
handler interface{}
4041
}
4142

42-
func newRoute(h interface{}) *mockroute {
43+
func newMockRoute(h interface{}) *mockroute {
4344
if h == nil {
4445
panic("Handler can not be nil.")
4546
}
@@ -54,13 +55,14 @@ func (r *mockroute) Handler() interface{} {
5455
}
5556

5657
func TestStaticNodeMatchRoute(t *testing.T) {
57-
homeRoute := newRoute("testhomeroute")
58-
searchRoute := newRoute("testsearchroute")
58+
paramSize := 3
59+
homeRoute := newMockRoute("testhomeroute")
60+
searchRoute := newMockRoute("testsearchroute")
5961

60-
homeSkipSubpath := staticNode{name: "home", route: homeRoute, maxParamsSize: 3}
62+
homeSkipSubpath := staticNode{name: "home", route: homeRoute, maxParamsSize: uint8(paramSize)}
6163
homeSkipSubpath.SkipSubPath()
6264

63-
home := staticNode{name: "home", route: nil, maxParamsSize: 3}
65+
home := staticNode{name: "home", route: nil, maxParamsSize: uint8(paramSize)}
6466
home.WithRoute(homeRoute)
6567

6668
search := NewNode("search", home.MaxParamsSize())
@@ -81,21 +83,21 @@ func TestStaticNodeMatchRoute(t *testing.T) {
8183
node: home,
8284
path: "home",
8385
expectedRoute: homeRoute,
84-
expectedParams: make(context.Params, 3),
86+
expectedParams: make(context.Params, paramSize),
8587
},
8688
{
8789
name: "Exact Match with Skip SubPath",
8890
node: homeSkipSubpath,
8991
path: "home/about",
9092
expectedRoute: homeRoute,
91-
expectedParams: make(context.Params, 3),
93+
expectedParams: make(context.Params, paramSize),
9294
},
9395
{
9496
name: "Match with SubPath",
9597
node: home,
9698
path: "home/search",
9799
expectedRoute: searchRoute,
98-
expectedParams: make(context.Params, 3),
100+
expectedParams: make(context.Params, paramSize),
99101
},
100102
{
101103
name: "No Match",
@@ -119,7 +121,91 @@ func TestStaticNodeMatchRoute(t *testing.T) {
119121
if route != tt.expectedRoute {
120122
t.Errorf("%s: expected route %v, got %v", tt.name, tt.expectedRoute, route)
121123
}
122-
if len(params) != len(tt.expectedParams) {
124+
if !reflect.DeepEqual(params, tt.expectedParams) {
125+
t.Errorf("%s: expected params %v, got %v", tt.name, tt.expectedParams, params)
126+
}
127+
})
128+
}
129+
}
130+
131+
func TestWildcardNodeMatchRoute(t *testing.T) {
132+
paramSize := 3
133+
productRoute := newMockRoute("testproductroute")
134+
itemRoute := newMockRoute("testitemroute")
135+
viewRoute := newMockRoute("testviewroute")
136+
params := make(context.Params, paramSize)
137+
138+
product := staticNode{name: "product", route: nil, maxParamsSize: uint8(paramSize)}
139+
product.WithRoute(productRoute)
140+
141+
// Create a wildcard node for "{item}" under "product"
142+
item := NewNode("{item}", product.MaxParamsSize())
143+
item.WithRoute(itemRoute)
144+
145+
view := NewNode("view", product.MaxParamsSize()+1)
146+
view.WithRoute(viewRoute)
147+
148+
// Build the tree structure
149+
product.WithChildren(product.Tree().withNode(item).sort())
150+
item.WithChildren(item.Tree().withNode(view).sort())
151+
product.WithChildren(product.Tree().Compile())
152+
153+
// Create a static node for "product" with skip subpath functionality
154+
productSkipSubpath := staticNode{name: "product", route: nil, maxParamsSize: uint8(paramSize)}
155+
productSkipSubpath.WithRoute(productRoute)
156+
157+
itemSkipSubpath := NewNode("{item}", productSkipSubpath.MaxParamsSize()) // wildcardNode
158+
itemSkipSubpath.WithRoute(itemRoute)
159+
itemSkipSubpath.SkipSubPath()
160+
161+
// Build the tree structure
162+
productSkipSubpath.WithChildren(productSkipSubpath.Tree().withNode(itemSkipSubpath).sort())
163+
productSkipSubpath.WithChildren(productSkipSubpath.Tree().Compile())
164+
165+
tests := []struct {
166+
name string
167+
node staticNode
168+
path string
169+
expectedRoute Route
170+
expectedParams context.Params
171+
}{
172+
{
173+
name: "Exact Match",
174+
node: product,
175+
path: "product/item1",
176+
expectedRoute: itemRoute,
177+
expectedParams: append(params, context.Param{Key: "item", Value: "item1"}),
178+
},
179+
{
180+
name: "Match with SubPath",
181+
node: product,
182+
path: "product/item1/view",
183+
expectedRoute: viewRoute,
184+
expectedParams: append(params, context.Param{Key: "item", Value: "item1"}),
185+
},
186+
{
187+
name: "Exact Match with Skip SubPath",
188+
node: productSkipSubpath,
189+
path: "product/item1/order",
190+
expectedRoute: itemRoute,
191+
expectedParams: append(params, context.Param{Key: "item", Value: "item1"}),
192+
},
193+
{
194+
name: "No Match with SubPath",
195+
node: product,
196+
path: "product/item1/order",
197+
expectedRoute: nil,
198+
expectedParams: nil,
199+
},
200+
}
201+
202+
for _, tt := range tests {
203+
t.Run(tt.name, func(t *testing.T) {
204+
route, params := tt.node.MatchRoute(tt.path)
205+
if route != tt.expectedRoute {
206+
t.Errorf("%s: expected route %v, got %v", tt.name, tt.expectedRoute, route)
207+
}
208+
if !reflect.DeepEqual(params, tt.expectedParams) {
123209
t.Errorf("%s: expected params %v, got %v", tt.name, tt.expectedParams, params)
124210
}
125211
})

0 commit comments

Comments
 (0)