github.com/wangyougui/gf/v2@v2.6.5/net/ghttp/ghttp_z_unit_feature_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/wangyougui/gf.
     6  
     7  package ghttp_test
     8  
     9  import (
    10  	"fmt"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/wangyougui/gf/v2/frame/g"
    15  	"github.com/wangyougui/gf/v2/net/ghttp"
    16  	"github.com/wangyougui/gf/v2/test/gtest"
    17  	"github.com/wangyougui/gf/v2/util/guid"
    18  )
    19  
    20  func Test_Router_Basic1(t *testing.T) {
    21  	s := g.Server(guid.S())
    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.SetDumpRouterMap(false)
    38  	s.Start()
    39  	defer s.Shutdown()
    40  
    41  	time.Sleep(100 * time.Millisecond)
    42  	gtest.C(t, func(t *gtest.T) {
    43  		client := g.Client()
    44  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    45  		t.Assert(client.GetContent(ctx, "/john"), "")
    46  		t.Assert(client.GetContent(ctx, "/john/update"), "john")
    47  		t.Assert(client.GetContent(ctx, "/john/edit"), "edit")
    48  		t.Assert(client.GetContent(ctx, "/user/list/100.html"), "100")
    49  	})
    50  }
    51  
    52  func Test_Router_Basic2(t *testing.T) {
    53  	s := g.Server(guid.S())
    54  	s.BindHandler("/{hash}", func(r *ghttp.Request) {
    55  		r.Response.Write(r.Get("hash"))
    56  	})
    57  	s.BindHandler("/{hash}.{type}", func(r *ghttp.Request) {
    58  		r.Response.Write(r.Get("type"))
    59  	})
    60  	s.SetDumpRouterMap(false)
    61  	s.Start()
    62  	defer s.Shutdown()
    63  
    64  	time.Sleep(100 * time.Millisecond)
    65  	gtest.C(t, func(t *gtest.T) {
    66  		client := g.Client()
    67  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    68  		t.Assert(client.GetContent(ctx, "/data"), "data")
    69  		t.Assert(client.GetContent(ctx, "/data.json"), "json")
    70  	})
    71  }
    72  
    73  func Test_Router_Value(t *testing.T) {
    74  	s := g.Server(guid.S())
    75  	s.BindHandler("/", func(r *ghttp.Request) {
    76  		r.Response.Write(r.GetRouterMap()["hash"])
    77  	})
    78  	s.BindHandler("/GetRouter", func(r *ghttp.Request) {
    79  		r.Response.Write(r.GetRouter("name", "john").String())
    80  	})
    81  	s.BindHandler("/{hash}", func(r *ghttp.Request) {
    82  		r.Response.Write(r.GetRouter("hash").String())
    83  	})
    84  	s.BindHandler("/{hash}.{type}", func(r *ghttp.Request) {
    85  		r.Response.Write(r.GetRouter("type").String())
    86  	})
    87  	s.BindHandler("/{hash}.{type}.map", func(r *ghttp.Request) {
    88  		r.Response.Write(r.GetRouterMap()["type"])
    89  	})
    90  	s.SetDumpRouterMap(false)
    91  	s.Start()
    92  	defer s.Shutdown()
    93  
    94  	time.Sleep(100 * time.Millisecond)
    95  	gtest.C(t, func(t *gtest.T) {
    96  		client := g.Client()
    97  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    98  		t.Assert(client.GetContent(ctx, "/"), "")
    99  		t.Assert(client.GetContent(ctx, "/GetRouter"), "john")
   100  		t.Assert(client.GetContent(ctx, "/data"), "data")
   101  		t.Assert(client.GetContent(ctx, "/data.json"), "json")
   102  		t.Assert(client.GetContent(ctx, "/data.json.map"), "json")
   103  	})
   104  }
   105  
   106  // HTTP method register.
   107  func Test_Router_Method(t *testing.T) {
   108  	s := g.Server(guid.S())
   109  	s.BindHandler("GET:/get", func(r *ghttp.Request) {
   110  
   111  	})
   112  	s.BindHandler("POST:/post", func(r *ghttp.Request) {
   113  
   114  	})
   115  	s.SetDumpRouterMap(false)
   116  	s.Start()
   117  	defer s.Shutdown()
   118  
   119  	time.Sleep(100 * time.Millisecond)
   120  	gtest.C(t, func(t *gtest.T) {
   121  		client := g.Client()
   122  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   123  
   124  		resp1, err := client.Get(ctx, "/get")
   125  		t.AssertNil(err)
   126  		defer resp1.Close()
   127  		t.Assert(resp1.StatusCode, 200)
   128  
   129  		resp2, err := client.Post(ctx, "/get")
   130  		t.AssertNil(err)
   131  		defer resp2.Close()
   132  		t.Assert(resp2.StatusCode, 404)
   133  
   134  		resp3, err := client.Get(ctx, "/post")
   135  		t.AssertNil(err)
   136  		defer resp3.Close()
   137  		t.Assert(resp3.StatusCode, 404)
   138  
   139  		resp4, err := client.Post(ctx, "/post")
   140  		t.AssertNil(err)
   141  		defer resp4.Close()
   142  		t.Assert(resp4.StatusCode, 200)
   143  	})
   144  }
   145  
   146  // Extra char '/' of the router.
   147  func Test_Router_ExtraChar(t *testing.T) {
   148  	s := g.Server(guid.S())
   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.SetDumpRouterMap(false)
   155  	s.Start()
   156  	defer s.Shutdown()
   157  
   158  	time.Sleep(100 * time.Millisecond)
   159  	gtest.C(t, func(t *gtest.T) {
   160  		client := g.Client()
   161  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   162  
   163  		t.Assert(client.GetContent(ctx, "/api/test"), "test")
   164  		t.Assert(client.GetContent(ctx, "/api/test/"), "test")
   165  		t.Assert(client.GetContent(ctx, "/api/test//"), "test")
   166  		t.Assert(client.GetContent(ctx, "//api/test//"), "test")
   167  		t.Assert(client.GetContent(ctx, "//api//test//"), "test")
   168  		t.Assert(client.GetContent(ctx, "///api///test///"), "test")
   169  	})
   170  }
   171  
   172  // Custom status handler.
   173  func Test_Router_Status(t *testing.T) {
   174  	s := g.Server(guid.S())
   175  	s.BindHandler("/200", func(r *ghttp.Request) {
   176  		r.Response.WriteStatus(200)
   177  	})
   178  	s.BindHandler("/300", func(r *ghttp.Request) {
   179  		r.Response.WriteStatus(300)
   180  	})
   181  	s.BindHandler("/400", func(r *ghttp.Request) {
   182  		r.Response.WriteStatus(400)
   183  	})
   184  	s.BindHandler("/500", func(r *ghttp.Request) {
   185  		r.Response.WriteStatus(500)
   186  	})
   187  	s.SetDumpRouterMap(false)
   188  	s.Start()
   189  	defer s.Shutdown()
   190  
   191  	time.Sleep(100 * time.Millisecond)
   192  	gtest.C(t, func(t *gtest.T) {
   193  		client := g.Client()
   194  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   195  
   196  		resp1, err := client.Get(ctx, "/200")
   197  		t.AssertNil(err)
   198  		defer resp1.Close()
   199  		t.Assert(resp1.StatusCode, 200)
   200  
   201  		resp2, err := client.Get(ctx, "/300")
   202  		t.AssertNil(err)
   203  		defer resp2.Close()
   204  		t.Assert(resp2.StatusCode, 300)
   205  
   206  		resp3, err := client.Get(ctx, "/400")
   207  		t.AssertNil(err)
   208  		defer resp3.Close()
   209  		t.Assert(resp3.StatusCode, 400)
   210  
   211  		resp4, err := client.Get(ctx, "/500")
   212  		t.AssertNil(err)
   213  		defer resp4.Close()
   214  		t.Assert(resp4.StatusCode, 500)
   215  
   216  		resp5, err := client.Get(ctx, "/404")
   217  		t.AssertNil(err)
   218  		defer resp5.Close()
   219  		t.Assert(resp5.StatusCode, 404)
   220  	})
   221  }
   222  
   223  func Test_Router_CustomStatusHandler(t *testing.T) {
   224  	s := g.Server(guid.S())
   225  	s.BindHandler("/", func(r *ghttp.Request) {
   226  		r.Response.Write("hello")
   227  	})
   228  	s.BindStatusHandler(404, func(r *ghttp.Request) {
   229  		r.Response.Write("404 page")
   230  	})
   231  	s.SetDumpRouterMap(false)
   232  	s.Start()
   233  	defer s.Shutdown()
   234  
   235  	time.Sleep(100 * time.Millisecond)
   236  	gtest.C(t, func(t *gtest.T) {
   237  		client := g.Client()
   238  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   239  
   240  		t.Assert(client.GetContent(ctx, "/"), "hello")
   241  		resp, err := client.Get(ctx, "/ThisDoesNotExist")
   242  		t.AssertNil(err)
   243  		defer resp.Close()
   244  		t.Assert(resp.StatusCode, 404)
   245  		t.Assert(resp.ReadAllString(), "404 page")
   246  	})
   247  }
   248  
   249  // 404 not found router.
   250  func Test_Router_404(t *testing.T) {
   251  	s := g.Server(guid.S())
   252  	s.BindHandler("/", func(r *ghttp.Request) {
   253  		r.Response.Write("hello")
   254  	})
   255  	s.SetDumpRouterMap(false)
   256  	s.Start()
   257  	defer s.Shutdown()
   258  
   259  	time.Sleep(100 * time.Millisecond)
   260  	gtest.C(t, func(t *gtest.T) {
   261  		client := g.Client()
   262  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   263  
   264  		t.Assert(client.GetContent(ctx, "/"), "hello")
   265  		resp, err := client.Get(ctx, "/ThisDoesNotExist")
   266  		t.AssertNil(err)
   267  		defer resp.Close()
   268  		t.Assert(resp.StatusCode, 404)
   269  	})
   270  }
   271  
   272  func Test_Router_Priority(t *testing.T) {
   273  	s := g.Server(guid.S())
   274  	s.BindHandler("/admin", func(r *ghttp.Request) {
   275  		r.Response.Write("admin")
   276  	})
   277  	s.BindHandler("/admin-{page}", func(r *ghttp.Request) {
   278  		r.Response.Write("admin-{page}")
   279  	})
   280  	s.BindHandler("/admin-goods", func(r *ghttp.Request) {
   281  		r.Response.Write("admin-goods")
   282  	})
   283  	s.BindHandler("/admin-goods-{page}", func(r *ghttp.Request) {
   284  		r.Response.Write("admin-goods-{page}")
   285  	})
   286  	s.SetDumpRouterMap(false)
   287  	s.Start()
   288  	defer s.Shutdown()
   289  
   290  	time.Sleep(100 * time.Millisecond)
   291  	gtest.C(t, func(t *gtest.T) {
   292  		client := g.Client()
   293  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   294  
   295  		t.Assert(client.GetContent(ctx, "/admin"), "admin")
   296  		t.Assert(client.GetContent(ctx, "/admin-1"), "admin-{page}")
   297  		t.Assert(client.GetContent(ctx, "/admin-goods"), "admin-goods")
   298  		t.Assert(client.GetContent(ctx, "/admin-goods-2"), "admin-goods-{page}")
   299  	})
   300  }