server_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package rest
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/tal-tech/go-zero/rest/httpx"
  10. "github.com/tal-tech/go-zero/rest/router"
  11. )
  12. func TestNewServer(t *testing.T) {
  13. _, err := NewServer(RestConf{}, WithNotFoundHandler(nil), WithNotAllowedHandler(nil))
  14. assert.NotNil(t, err)
  15. }
  16. func TestWithMiddleware(t *testing.T) {
  17. m := make(map[string]string)
  18. router := router.NewRouter()
  19. handler := func(w http.ResponseWriter, r *http.Request) {
  20. var v struct {
  21. Nickname string `form:"nickname"`
  22. Zipcode int64 `form:"zipcode"`
  23. }
  24. err := httpx.Parse(r, &v)
  25. assert.Nil(t, err)
  26. _, err = io.WriteString(w, fmt.Sprintf("%s:%d", v.Nickname, v.Zipcode))
  27. assert.Nil(t, err)
  28. }
  29. rs := WithMiddleware(func(next http.HandlerFunc) http.HandlerFunc {
  30. return func(w http.ResponseWriter, r *http.Request) {
  31. var v struct {
  32. Name string `path:"name"`
  33. Year string `path:"year"`
  34. }
  35. assert.Nil(t, httpx.ParsePath(r, &v))
  36. m[v.Name] = v.Year
  37. next.ServeHTTP(w, r)
  38. }
  39. }, Route{
  40. Method: http.MethodGet,
  41. Path: "/first/:name/:year",
  42. Handler: handler,
  43. }, Route{
  44. Method: http.MethodGet,
  45. Path: "/second/:name/:year",
  46. Handler: handler,
  47. })
  48. urls := []string{
  49. "http://hello.com/first/kevin/2017?nickname=whatever&zipcode=200000",
  50. "http://hello.com/second/wan/2020?nickname=whatever&zipcode=200000",
  51. }
  52. for _, route := range rs {
  53. assert.Nil(t, router.Handle(route.Method, route.Path, route.Handler))
  54. }
  55. for _, url := range urls {
  56. r, err := http.NewRequest(http.MethodGet, url, nil)
  57. assert.Nil(t, err)
  58. rr := httptest.NewRecorder()
  59. router.ServeHTTP(rr, r)
  60. assert.Equal(t, "whatever:200000", rr.Body.String())
  61. }
  62. assert.EqualValues(t, map[string]string{
  63. "kevin": "2017",
  64. "wan": "2020",
  65. }, m)
  66. }
  67. func TestMultiMiddlewares(t *testing.T) {
  68. m := make(map[string]string)
  69. router := router.NewRouter()
  70. handler := func(w http.ResponseWriter, r *http.Request) {
  71. var v struct {
  72. Nickname string `form:"nickname"`
  73. Zipcode int64 `form:"zipcode"`
  74. }
  75. err := httpx.Parse(r, &v)
  76. assert.Nil(t, err)
  77. _, err = io.WriteString(w, fmt.Sprintf("%s:%s", v.Nickname, m[v.Nickname]))
  78. assert.Nil(t, err)
  79. }
  80. rs := WithMiddlewares([]Middleware{
  81. func(next http.HandlerFunc) http.HandlerFunc {
  82. return func(w http.ResponseWriter, r *http.Request) {
  83. var v struct {
  84. Name string `path:"name"`
  85. Year string `path:"year"`
  86. }
  87. assert.Nil(t, httpx.ParsePath(r, &v))
  88. m[v.Name] = v.Year
  89. next.ServeHTTP(w, r)
  90. }
  91. },
  92. func(next http.HandlerFunc) http.HandlerFunc {
  93. return func(w http.ResponseWriter, r *http.Request) {
  94. var v struct {
  95. Name string `form:"nickname"`
  96. Zipcode string `form:"zipcode"`
  97. }
  98. assert.Nil(t, httpx.ParseForm(r, &v))
  99. assert.NotEmpty(t, m)
  100. m[v.Name] = v.Zipcode + v.Zipcode
  101. next.ServeHTTP(w, r)
  102. }
  103. },
  104. }, Route{
  105. Method: http.MethodGet,
  106. Path: "/first/:name/:year",
  107. Handler: handler,
  108. }, Route{
  109. Method: http.MethodGet,
  110. Path: "/second/:name/:year",
  111. Handler: handler,
  112. })
  113. urls := []string{
  114. "http://hello.com/first/kevin/2017?nickname=whatever&zipcode=200000",
  115. "http://hello.com/second/wan/2020?nickname=whatever&zipcode=200000",
  116. }
  117. for _, route := range rs {
  118. assert.Nil(t, router.Handle(route.Method, route.Path, route.Handler))
  119. }
  120. for _, url := range urls {
  121. r, err := http.NewRequest(http.MethodGet, url, nil)
  122. assert.Nil(t, err)
  123. rr := httptest.NewRecorder()
  124. router.ServeHTTP(rr, r)
  125. assert.Equal(t, "whatever:200000200000", rr.Body.String())
  126. }
  127. assert.EqualValues(t, map[string]string{
  128. "kevin": "2017",
  129. "wan": "2020",
  130. "whatever": "200000200000",
  131. }, m)
  132. }
  133. func TestWithPriority(t *testing.T) {
  134. var fr featuredRoutes
  135. WithPriority()(&fr)
  136. assert.True(t, fr.priority)
  137. }