requests_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package httpx
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "strconv"
  6. "strings"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestParseForm(t *testing.T) {
  11. var v struct {
  12. Name string `form:"name"`
  13. Age int `form:"age"`
  14. Percent float64 `form:"percent,optional"`
  15. }
  16. r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", nil)
  17. assert.Nil(t, err)
  18. err = Parse(r, &v)
  19. assert.Nil(t, err)
  20. assert.Equal(t, "hello", v.Name)
  21. assert.Equal(t, 18, v.Age)
  22. assert.Equal(t, 3.4, v.Percent)
  23. }
  24. func TestParseHeader(t *testing.T) {
  25. m := ParseHeader("key=value;")
  26. assert.EqualValues(t, map[string]string{
  27. "key": "value",
  28. }, m)
  29. }
  30. func TestParseFormOutOfRange(t *testing.T) {
  31. var v struct {
  32. Age int `form:"age,range=[10:20)"`
  33. }
  34. tests := []struct {
  35. url string
  36. pass bool
  37. }{
  38. {
  39. url: "http://hello.com/a?age=5",
  40. pass: false,
  41. },
  42. {
  43. url: "http://hello.com/a?age=10",
  44. pass: true,
  45. },
  46. {
  47. url: "http://hello.com/a?age=15",
  48. pass: true,
  49. },
  50. {
  51. url: "http://hello.com/a?age=20",
  52. pass: false,
  53. },
  54. {
  55. url: "http://hello.com/a?age=28",
  56. pass: false,
  57. },
  58. }
  59. for _, test := range tests {
  60. r, err := http.NewRequest(http.MethodGet, test.url, nil)
  61. assert.Nil(t, err)
  62. err = Parse(r, &v)
  63. if test.pass {
  64. assert.Nil(t, err)
  65. } else {
  66. assert.NotNil(t, err)
  67. }
  68. }
  69. }
  70. func TestParseMultipartForm(t *testing.T) {
  71. var v struct {
  72. Name string `form:"name"`
  73. Age int `form:"age"`
  74. }
  75. body := strings.Replace(`----------------------------220477612388154780019383
  76. Content-Disposition: form-data; name="name"
  77. kevin
  78. ----------------------------220477612388154780019383
  79. Content-Disposition: form-data; name="age"
  80. 18
  81. ----------------------------220477612388154780019383--`, "\n", "\r\n", -1)
  82. r := httptest.NewRequest(http.MethodPost, "http://localhost:3333/", strings.NewReader(body))
  83. r.Header.Set(ContentType, "multipart/form-data; boundary=--------------------------220477612388154780019383")
  84. err := Parse(r, &v)
  85. assert.Nil(t, err)
  86. assert.Equal(t, "kevin", v.Name)
  87. assert.Equal(t, 18, v.Age)
  88. }
  89. func TestParseRequired(t *testing.T) {
  90. v := struct {
  91. Name string `form:"name"`
  92. Percent float64 `form:"percent"`
  93. }{}
  94. r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello", nil)
  95. assert.Nil(t, err)
  96. err = Parse(r, &v)
  97. assert.NotNil(t, err)
  98. }
  99. func TestParseOptions(t *testing.T) {
  100. v := struct {
  101. Position int8 `form:"pos,options=1|2"`
  102. }{}
  103. r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?pos=4", nil)
  104. assert.Nil(t, err)
  105. err = Parse(r, &v)
  106. assert.NotNil(t, err)
  107. }
  108. func BenchmarkParseRaw(b *testing.B) {
  109. r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", nil)
  110. if err != nil {
  111. b.Fatal(err)
  112. }
  113. for i := 0; i < b.N; i++ {
  114. v := struct {
  115. Name string `form:"name"`
  116. Age int `form:"age"`
  117. Percent float64 `form:"percent,optional"`
  118. }{}
  119. v.Name = r.FormValue("name")
  120. v.Age, err = strconv.Atoi(r.FormValue("age"))
  121. if err != nil {
  122. b.Fatal(err)
  123. }
  124. v.Percent, err = strconv.ParseFloat(r.FormValue("percent"), 64)
  125. if err != nil {
  126. b.Fatal(err)
  127. }
  128. }
  129. }
  130. func BenchmarkParseAuto(b *testing.B) {
  131. r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", nil)
  132. if err != nil {
  133. b.Fatal(err)
  134. }
  135. for i := 0; i < b.N; i++ {
  136. v := struct {
  137. Name string `form:"name"`
  138. Age int `form:"age"`
  139. Percent float64 `form:"percent,optional"`
  140. }{}
  141. if err = Parse(r, &v); err != nil {
  142. b.Fatal(err)
  143. }
  144. }
  145. }