1
1
package mux
2
2
3
3
import (
4
+ "reflect"
4
5
"testing"
5
6
6
7
"github.com/vardius/gorouter/v4/context"
@@ -39,7 +40,7 @@ type mockroute struct {
39
40
handler interface {}
40
41
}
41
42
42
- func newRoute (h interface {}) * mockroute {
43
+ func newMockRoute (h interface {}) * mockroute {
43
44
if h == nil {
44
45
panic ("Handler can not be nil." )
45
46
}
@@ -54,13 +55,14 @@ func (r *mockroute) Handler() interface{} {
54
55
}
55
56
56
57
func TestStaticNodeMatchRoute (t * testing.T ) {
57
- homeRoute := newRoute ("testhomeroute" )
58
- searchRoute := newRoute ("testsearchroute" )
58
+ paramSize := 3
59
+ homeRoute := newMockRoute ("testhomeroute" )
60
+ searchRoute := newMockRoute ("testsearchroute" )
59
61
60
- homeSkipSubpath := staticNode {name : "home" , route : homeRoute , maxParamsSize : 3 }
62
+ homeSkipSubpath := staticNode {name : "home" , route : homeRoute , maxParamsSize : uint8 ( paramSize ) }
61
63
homeSkipSubpath .SkipSubPath ()
62
64
63
- home := staticNode {name : "home" , route : nil , maxParamsSize : 3 }
65
+ home := staticNode {name : "home" , route : nil , maxParamsSize : uint8 ( paramSize ) }
64
66
home .WithRoute (homeRoute )
65
67
66
68
search := NewNode ("search" , home .MaxParamsSize ())
@@ -81,21 +83,21 @@ func TestStaticNodeMatchRoute(t *testing.T) {
81
83
node : home ,
82
84
path : "home" ,
83
85
expectedRoute : homeRoute ,
84
- expectedParams : make (context.Params , 3 ),
86
+ expectedParams : make (context.Params , paramSize ),
85
87
},
86
88
{
87
89
name : "Exact Match with Skip SubPath" ,
88
90
node : homeSkipSubpath ,
89
91
path : "home/about" ,
90
92
expectedRoute : homeRoute ,
91
- expectedParams : make (context.Params , 3 ),
93
+ expectedParams : make (context.Params , paramSize ),
92
94
},
93
95
{
94
96
name : "Match with SubPath" ,
95
97
node : home ,
96
98
path : "home/search" ,
97
99
expectedRoute : searchRoute ,
98
- expectedParams : make (context.Params , 3 ),
100
+ expectedParams : make (context.Params , paramSize ),
99
101
},
100
102
{
101
103
name : "No Match" ,
@@ -119,7 +121,91 @@ func TestStaticNodeMatchRoute(t *testing.T) {
119
121
if route != tt .expectedRoute {
120
122
t .Errorf ("%s: expected route %v, got %v" , tt .name , tt .expectedRoute , route )
121
123
}
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 ) {
123
209
t .Errorf ("%s: expected params %v, got %v" , tt .name , tt .expectedParams , params )
124
210
}
125
211
})
0 commit comments