params_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package request // import "miniflux.app/v2/internal/http/request"
  4. import (
  5. "net/http"
  6. "net/http/httptest"
  7. "net/url"
  8. "reflect"
  9. "testing"
  10. )
  11. func TestFormInt64Value(t *testing.T) {
  12. f := url.Values{}
  13. f.Set("integer value", "42")
  14. f.Set("invalid value", "invalid integer")
  15. r := &http.Request{Form: f}
  16. result := FormInt64Value(r, "integer value")
  17. expected := int64(42)
  18. if result != expected {
  19. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  20. }
  21. result = FormInt64Value(r, "invalid value")
  22. expected = int64(0)
  23. if result != expected {
  24. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  25. }
  26. result = FormInt64Value(r, "missing value")
  27. expected = int64(0)
  28. if result != expected {
  29. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  30. }
  31. }
  32. func TestRouteStringParamWithServerMux(t *testing.T) {
  33. router := http.NewServeMux()
  34. router.HandleFunc("GET /route/{variable}/index", func(w http.ResponseWriter, r *http.Request) {
  35. result := RouteStringParam(r, "variable")
  36. expected := "value"
  37. if result != expected {
  38. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  39. }
  40. result = RouteStringParam(r, "missing variable")
  41. expected = ""
  42. if result != expected {
  43. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  44. }
  45. })
  46. r, err := http.NewRequest(http.MethodGet, "/route/value/index", nil)
  47. if err != nil {
  48. t.Fatal(err)
  49. }
  50. w := httptest.NewRecorder()
  51. router.ServeHTTP(w, r)
  52. }
  53. func TestRouteInt64ParamWithServerMux(t *testing.T) {
  54. router := http.NewServeMux()
  55. router.HandleFunc("GET /a/{variable1}/b/{variable2}/c/{variable3}", func(w http.ResponseWriter, r *http.Request) {
  56. result := RouteInt64Param(r, "variable1")
  57. expected := int64(42)
  58. if result != expected {
  59. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  60. }
  61. result = RouteInt64Param(r, "missing variable")
  62. expected = 0
  63. if result != expected {
  64. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  65. }
  66. result = RouteInt64Param(r, "variable2")
  67. expected = 0
  68. if result != expected {
  69. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  70. }
  71. result = RouteInt64Param(r, "variable3")
  72. expected = 0
  73. if result != expected {
  74. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  75. }
  76. })
  77. r, err := http.NewRequest(http.MethodGet, "/a/42/b/not-int/c/-10", nil)
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. w := httptest.NewRecorder()
  82. router.ServeHTTP(w, r)
  83. }
  84. func TestQueryStringParam(t *testing.T) {
  85. u, _ := url.Parse("http://example.org/?key=value")
  86. r := &http.Request{URL: u}
  87. result := QueryStringParam(r, "key", "fallback")
  88. expected := "value"
  89. if result != expected {
  90. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  91. }
  92. result = QueryStringParam(r, "missing key", "fallback")
  93. expected = "fallback"
  94. if result != expected {
  95. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  96. }
  97. }
  98. func TestQueryIntParam(t *testing.T) {
  99. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  100. r := &http.Request{URL: u}
  101. result := QueryIntParam(r, "key", 84)
  102. expected := 42
  103. if result != expected {
  104. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  105. }
  106. result = QueryIntParam(r, "missing key", 84)
  107. expected = 84
  108. if result != expected {
  109. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  110. }
  111. result = QueryIntParam(r, "negative", 69)
  112. expected = 69
  113. if result != expected {
  114. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  115. }
  116. result = QueryIntParam(r, "invalid", 99)
  117. expected = 99
  118. if result != expected {
  119. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  120. }
  121. }
  122. func TestQueryInt64Param(t *testing.T) {
  123. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  124. r := &http.Request{URL: u}
  125. result := QueryInt64Param(r, "key", int64(84))
  126. expected := int64(42)
  127. if result != expected {
  128. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  129. }
  130. result = QueryInt64Param(r, "missing key", int64(84))
  131. expected = int64(84)
  132. if result != expected {
  133. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  134. }
  135. result = QueryInt64Param(r, "negative", int64(69))
  136. expected = int64(69)
  137. if result != expected {
  138. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  139. }
  140. result = QueryInt64Param(r, "invalid", int64(99))
  141. expected = int64(99)
  142. if result != expected {
  143. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  144. }
  145. }
  146. func TestQueryBoolParam(t *testing.T) {
  147. u, _ := url.Parse("http://example.org/?truthy=true&falsy=false&invalid=wat")
  148. r := &http.Request{URL: u}
  149. result := QueryBoolParam(r, "truthy", false)
  150. expected := true
  151. if result != expected {
  152. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  153. }
  154. result = QueryBoolParam(r, "falsy", true)
  155. expected = false
  156. if result != expected {
  157. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  158. }
  159. result = QueryBoolParam(r, "missing", true)
  160. expected = true
  161. if result != expected {
  162. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  163. }
  164. result = QueryBoolParam(r, "invalid", true)
  165. expected = true
  166. if result != expected {
  167. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  168. }
  169. }
  170. func TestQueryStringParamList(t *testing.T) {
  171. u, _ := url.Parse("http://example.org/?tag=alpha&tag=beta&tag=+&tag=%20%20gamma%20%20&empty=")
  172. r := &http.Request{URL: u}
  173. result := QueryStringParamList(r, "tag")
  174. expected := []string{"alpha", "beta", "gamma"}
  175. if !reflect.DeepEqual(result, expected) {
  176. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  177. }
  178. result = QueryStringParamList(r, "missing")
  179. expected = nil
  180. if !reflect.DeepEqual(result, expected) {
  181. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  182. }
  183. }
  184. func TestHasQueryParam(t *testing.T) {
  185. u, _ := url.Parse("http://example.org/?key=42")
  186. r := &http.Request{URL: u}
  187. result := HasQueryParam(r, "key")
  188. expected := true
  189. if result != expected {
  190. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  191. }
  192. result = HasQueryParam(r, "missing key")
  193. expected = false
  194. if result != expected {
  195. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  196. }
  197. }