github.com/gogf/gf@v1.16.9/net/ghttp/ghttp_unit_router_basic_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package ghttp_test 8 9 import ( 10 "fmt" 11 "testing" 12 "time" 13 14 "github.com/gogf/gf/frame/g" 15 "github.com/gogf/gf/net/ghttp" 16 "github.com/gogf/gf/test/gtest" 17 ) 18 19 func Test_Router_Basic1(t *testing.T) { 20 p, _ := ports.PopRand() 21 s := g.Server(p) 22 s.BindHandler("/:name", func(r *ghttp.Request) { 23 r.Response.Write("/:name") 24 }) 25 s.BindHandler("/:name/update", func(r *ghttp.Request) { 26 r.Response.Write(r.Get("name")) 27 }) 28 s.BindHandler("/:name/:action", func(r *ghttp.Request) { 29 r.Response.Write(r.Get("action")) 30 }) 31 s.BindHandler("/:name/*any", func(r *ghttp.Request) { 32 r.Response.Write(r.Get("any")) 33 }) 34 s.BindHandler("/user/list/{field}.html", func(r *ghttp.Request) { 35 r.Response.Write(r.Get("field")) 36 }) 37 s.SetPort(p) 38 s.SetDumpRouterMap(false) 39 s.Start() 40 defer s.Shutdown() 41 42 time.Sleep(100 * time.Millisecond) 43 gtest.C(t, func(t *gtest.T) { 44 client := g.Client() 45 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 46 t.Assert(client.GetContent("/john"), "") 47 t.Assert(client.GetContent("/john/update"), "john") 48 t.Assert(client.GetContent("/john/edit"), "edit") 49 t.Assert(client.GetContent("/user/list/100.html"), "100") 50 }) 51 } 52 53 func Test_Router_Basic2(t *testing.T) { 54 p, _ := ports.PopRand() 55 s := g.Server(p) 56 s.BindHandler("/{hash}", func(r *ghttp.Request) { 57 r.Response.Write(r.Get("hash")) 58 }) 59 s.BindHandler("/{hash}.{type}", func(r *ghttp.Request) { 60 r.Response.Write(r.Get("type")) 61 }) 62 s.SetPort(p) 63 s.SetDumpRouterMap(false) 64 s.Start() 65 defer s.Shutdown() 66 67 time.Sleep(100 * time.Millisecond) 68 gtest.C(t, func(t *gtest.T) { 69 client := g.Client() 70 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 71 t.Assert(client.GetContent("/data"), "data") 72 t.Assert(client.GetContent("/data.json"), "json") 73 }) 74 } 75 76 func Test_Router_Value(t *testing.T) { 77 p, _ := ports.PopRand() 78 s := g.Server(p) 79 s.BindHandler("/{hash}", func(r *ghttp.Request) { 80 r.Response.Write(r.GetRouterString("hash")) 81 }) 82 s.BindHandler("/{hash}.{type}", func(r *ghttp.Request) { 83 r.Response.Write(r.GetRouterString("type")) 84 }) 85 s.BindHandler("/{hash}.{type}.map", func(r *ghttp.Request) { 86 r.Response.Write(r.GetRouterMap()["type"]) 87 }) 88 s.SetPort(p) 89 s.SetDumpRouterMap(false) 90 s.Start() 91 defer s.Shutdown() 92 93 time.Sleep(100 * time.Millisecond) 94 gtest.C(t, func(t *gtest.T) { 95 client := g.Client() 96 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 97 t.Assert(client.GetContent("/data"), "data") 98 t.Assert(client.GetContent("/data.json"), "json") 99 t.Assert(client.GetContent("/data.json.map"), "json") 100 }) 101 } 102 103 // HTTP method register. 104 func Test_Router_Method(t *testing.T) { 105 p, _ := ports.PopRand() 106 s := g.Server(p) 107 s.BindHandler("GET:/get", func(r *ghttp.Request) { 108 109 }) 110 s.BindHandler("POST:/post", func(r *ghttp.Request) { 111 112 }) 113 s.SetPort(p) 114 s.SetDumpRouterMap(false) 115 s.Start() 116 defer s.Shutdown() 117 118 time.Sleep(100 * time.Millisecond) 119 gtest.C(t, func(t *gtest.T) { 120 client := g.Client() 121 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 122 123 resp1, err := client.Get("/get") 124 defer resp1.Close() 125 t.Assert(err, nil) 126 t.Assert(resp1.StatusCode, 200) 127 128 resp2, err := client.Post("/get") 129 defer resp2.Close() 130 t.Assert(err, nil) 131 t.Assert(resp2.StatusCode, 404) 132 133 resp3, err := client.Get("/post") 134 defer resp3.Close() 135 t.Assert(err, nil) 136 t.Assert(resp3.StatusCode, 404) 137 138 resp4, err := client.Post("/post") 139 defer resp4.Close() 140 t.Assert(err, nil) 141 t.Assert(resp4.StatusCode, 200) 142 }) 143 } 144 145 // Extra char '/' of the router. 146 func Test_Router_ExtraChar(t *testing.T) { 147 p, _ := ports.PopRand() 148 s := g.Server(p) 149 s.Group("/api", func(group *ghttp.RouterGroup) { 150 group.GET("/test", func(r *ghttp.Request) { 151 r.Response.Write("test") 152 }) 153 }) 154 s.SetPort(p) 155 s.SetDumpRouterMap(false) 156 s.Start() 157 defer s.Shutdown() 158 159 time.Sleep(100 * time.Millisecond) 160 gtest.C(t, func(t *gtest.T) { 161 client := g.Client() 162 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 163 164 t.Assert(client.GetContent("/api/test"), "test") 165 t.Assert(client.GetContent("/api/test/"), "test") 166 t.Assert(client.GetContent("/api/test//"), "test") 167 t.Assert(client.GetContent("//api/test//"), "test") 168 t.Assert(client.GetContent("//api//test//"), "test") 169 t.Assert(client.GetContent("///api///test///"), "test") 170 }) 171 } 172 173 // Custom status handler. 174 func Test_Router_Status(t *testing.T) { 175 p, _ := ports.PopRand() 176 s := g.Server(p) 177 s.BindHandler("/200", func(r *ghttp.Request) { 178 r.Response.WriteStatus(200) 179 }) 180 s.BindHandler("/300", func(r *ghttp.Request) { 181 r.Response.WriteStatus(300) 182 }) 183 s.BindHandler("/400", func(r *ghttp.Request) { 184 r.Response.WriteStatus(400) 185 }) 186 s.BindHandler("/500", func(r *ghttp.Request) { 187 r.Response.WriteStatus(500) 188 }) 189 s.SetPort(p) 190 s.SetDumpRouterMap(false) 191 s.Start() 192 defer s.Shutdown() 193 194 time.Sleep(100 * time.Millisecond) 195 gtest.C(t, func(t *gtest.T) { 196 client := g.Client() 197 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 198 199 resp1, err := client.Get("/200") 200 defer resp1.Close() 201 t.Assert(err, nil) 202 t.Assert(resp1.StatusCode, 200) 203 204 resp2, err := client.Get("/300") 205 defer resp2.Close() 206 t.Assert(err, nil) 207 t.Assert(resp2.StatusCode, 300) 208 209 resp3, err := client.Get("/400") 210 defer resp3.Close() 211 t.Assert(err, nil) 212 t.Assert(resp3.StatusCode, 400) 213 214 resp4, err := client.Get("/500") 215 defer resp4.Close() 216 t.Assert(err, nil) 217 t.Assert(resp4.StatusCode, 500) 218 219 resp5, err := client.Get("/404") 220 defer resp5.Close() 221 t.Assert(err, nil) 222 t.Assert(resp5.StatusCode, 404) 223 }) 224 } 225 226 func Test_Router_CustomStatusHandler(t *testing.T) { 227 p, _ := ports.PopRand() 228 s := g.Server(p) 229 s.BindHandler("/", func(r *ghttp.Request) { 230 r.Response.Write("hello") 231 }) 232 s.BindStatusHandler(404, func(r *ghttp.Request) { 233 r.Response.Write("404 page") 234 }) 235 s.SetPort(p) 236 s.SetDumpRouterMap(false) 237 s.Start() 238 defer s.Shutdown() 239 240 time.Sleep(100 * time.Millisecond) 241 gtest.C(t, func(t *gtest.T) { 242 client := g.Client() 243 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 244 245 t.Assert(client.GetContent("/"), "hello") 246 resp, err := client.Get("/ThisDoesNotExist") 247 defer resp.Close() 248 t.Assert(err, nil) 249 t.Assert(resp.StatusCode, 404) 250 t.Assert(resp.ReadAllString(), "404 page") 251 }) 252 } 253 254 // 404 not found router. 255 func Test_Router_404(t *testing.T) { 256 p, _ := ports.PopRand() 257 s := g.Server(p) 258 s.BindHandler("/", func(r *ghttp.Request) { 259 r.Response.Write("hello") 260 }) 261 s.SetPort(p) 262 s.SetDumpRouterMap(false) 263 s.Start() 264 defer s.Shutdown() 265 266 time.Sleep(100 * time.Millisecond) 267 gtest.C(t, func(t *gtest.T) { 268 client := g.Client() 269 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 270 271 t.Assert(client.GetContent("/"), "hello") 272 resp, err := client.Get("/ThisDoesNotExist") 273 defer resp.Close() 274 t.Assert(err, nil) 275 t.Assert(resp.StatusCode, 404) 276 }) 277 } 278 279 func Test_Router_Priority(t *testing.T) { 280 p, _ := ports.PopRand() 281 s := g.Server(p) 282 s.BindHandler("/admin", func(r *ghttp.Request) { 283 r.Response.Write("admin") 284 }) 285 s.BindHandler("/admin-{page}", func(r *ghttp.Request) { 286 r.Response.Write("admin-{page}") 287 }) 288 s.BindHandler("/admin-goods", func(r *ghttp.Request) { 289 r.Response.Write("admin-goods") 290 }) 291 s.BindHandler("/admin-goods-{page}", func(r *ghttp.Request) { 292 r.Response.Write("admin-goods-{page}") 293 }) 294 s.SetPort(p) 295 s.SetDumpRouterMap(false) 296 s.Start() 297 defer s.Shutdown() 298 299 time.Sleep(100 * time.Millisecond) 300 gtest.C(t, func(t *gtest.T) { 301 client := g.Client() 302 client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)) 303 304 t.Assert(client.GetContent("/admin"), "admin") 305 t.Assert(client.GetContent("/admin-1"), "admin-{page}") 306 t.Assert(client.GetContent("/admin-goods"), "admin-goods") 307 t.Assert(client.GetContent("/admin-goods-2"), "admin-goods-{page}") 308 }) 309 }