params_test.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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. "github.com/gorilla/mux"
  11. )
  12. func TestFormInt64Value(t *testing.T) {
  13. f := url.Values{}
  14. f.Set("integer value", "42")
  15. f.Set("invalid value", "invalid integer")
  16. r := &http.Request{Form: f}
  17. result := FormInt64Value(r, "integer value")
  18. expected := int64(42)
  19. if result != expected {
  20. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  21. }
  22. result = FormInt64Value(r, "invalid value")
  23. expected = int64(0)
  24. if result != expected {
  25. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  26. }
  27. result = FormInt64Value(r, "missing value")
  28. expected = int64(0)
  29. if result != expected {
  30. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  31. }
  32. }
  33. func TestRouteStringParamWithGorillaMux(t *testing.T) {
  34. router := mux.NewRouter()
  35. router.HandleFunc("/route/{variable}/index", func(w http.ResponseWriter, r *http.Request) {
  36. result := RouteStringParam(r, "variable")
  37. expected := "value"
  38. if result != expected {
  39. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  40. }
  41. result = RouteStringParam(r, "missing variable")
  42. expected = ""
  43. if result != expected {
  44. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  45. }
  46. })
  47. r, err := http.NewRequest("GET", "/route/value/index", nil)
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. w := httptest.NewRecorder()
  52. router.ServeHTTP(w, r)
  53. }
  54. func TestRouteStringParamWithServerMux(t *testing.T) {
  55. router := http.NewServeMux()
  56. router.HandleFunc("GET /route/{variable}/index", func(w http.ResponseWriter, r *http.Request) {
  57. result := RouteStringParam(r, "variable")
  58. expected := "value"
  59. if result != expected {
  60. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  61. }
  62. result = RouteStringParam(r, "missing variable")
  63. expected = ""
  64. if result != expected {
  65. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  66. }
  67. })
  68. r, err := http.NewRequest(http.MethodGet, "/route/value/index", nil)
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. w := httptest.NewRecorder()
  73. router.ServeHTTP(w, r)
  74. }
  75. func TestRouteInt64ParamWithGorillaMux(t *testing.T) {
  76. router := mux.NewRouter()
  77. router.HandleFunc("/a/{variable1}/b/{variable2}/c/{variable3}", func(w http.ResponseWriter, r *http.Request) {
  78. result := RouteInt64Param(r, "variable1")
  79. expected := int64(42)
  80. if result != expected {
  81. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  82. }
  83. result = RouteInt64Param(r, "missing variable")
  84. expected = 0
  85. if result != expected {
  86. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  87. }
  88. result = RouteInt64Param(r, "variable2")
  89. expected = 0
  90. if result != expected {
  91. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  92. }
  93. result = RouteInt64Param(r, "variable3")
  94. expected = 0
  95. if result != expected {
  96. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  97. }
  98. })
  99. r, err := http.NewRequest("GET", "/a/42/b/not-int/c/-10", nil)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. w := httptest.NewRecorder()
  104. router.ServeHTTP(w, r)
  105. }
  106. func TestRouteInt64ParamWithServerMux(t *testing.T) {
  107. router := http.NewServeMux()
  108. router.HandleFunc("GET /a/{variable1}/b/{variable2}/c/{variable3}", func(w http.ResponseWriter, r *http.Request) {
  109. result := RouteInt64Param(r, "variable1")
  110. expected := int64(42)
  111. if result != expected {
  112. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  113. }
  114. result = RouteInt64Param(r, "missing variable")
  115. expected = 0
  116. if result != expected {
  117. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  118. }
  119. result = RouteInt64Param(r, "variable2")
  120. expected = 0
  121. if result != expected {
  122. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  123. }
  124. result = RouteInt64Param(r, "variable3")
  125. expected = 0
  126. if result != expected {
  127. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  128. }
  129. })
  130. r, err := http.NewRequest(http.MethodGet, "/a/42/b/not-int/c/-10", nil)
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. w := httptest.NewRecorder()
  135. router.ServeHTTP(w, r)
  136. }
  137. func TestQueryStringParam(t *testing.T) {
  138. u, _ := url.Parse("http://example.org/?key=value")
  139. r := &http.Request{URL: u}
  140. result := QueryStringParam(r, "key", "fallback")
  141. expected := "value"
  142. if result != expected {
  143. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  144. }
  145. result = QueryStringParam(r, "missing key", "fallback")
  146. expected = "fallback"
  147. if result != expected {
  148. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  149. }
  150. }
  151. func TestQueryIntParam(t *testing.T) {
  152. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  153. r := &http.Request{URL: u}
  154. result := QueryIntParam(r, "key", 84)
  155. expected := 42
  156. if result != expected {
  157. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  158. }
  159. result = QueryIntParam(r, "missing key", 84)
  160. expected = 84
  161. if result != expected {
  162. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  163. }
  164. result = QueryIntParam(r, "negative", 69)
  165. expected = 69
  166. if result != expected {
  167. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  168. }
  169. result = QueryIntParam(r, "invalid", 99)
  170. expected = 99
  171. if result != expected {
  172. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  173. }
  174. }
  175. func TestQueryInt64Param(t *testing.T) {
  176. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  177. r := &http.Request{URL: u}
  178. result := QueryInt64Param(r, "key", int64(84))
  179. expected := int64(42)
  180. if result != expected {
  181. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  182. }
  183. result = QueryInt64Param(r, "missing key", int64(84))
  184. expected = int64(84)
  185. if result != expected {
  186. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  187. }
  188. result = QueryInt64Param(r, "negative", int64(69))
  189. expected = int64(69)
  190. if result != expected {
  191. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  192. }
  193. result = QueryInt64Param(r, "invalid", int64(99))
  194. expected = int64(99)
  195. if result != expected {
  196. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  197. }
  198. }
  199. func TestQueryBoolParam(t *testing.T) {
  200. u, _ := url.Parse("http://example.org/?truthy=true&falsy=false&invalid=wat")
  201. r := &http.Request{URL: u}
  202. result := QueryBoolParam(r, "truthy", false)
  203. expected := true
  204. if result != expected {
  205. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  206. }
  207. result = QueryBoolParam(r, "falsy", true)
  208. expected = false
  209. if result != expected {
  210. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  211. }
  212. result = QueryBoolParam(r, "missing", true)
  213. expected = true
  214. if result != expected {
  215. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  216. }
  217. result = QueryBoolParam(r, "invalid", true)
  218. expected = true
  219. if result != expected {
  220. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  221. }
  222. }
  223. func TestQueryStringParamList(t *testing.T) {
  224. u, _ := url.Parse("http://example.org/?tag=alpha&tag=beta&tag=+&tag=%20%20gamma%20%20&empty=")
  225. r := &http.Request{URL: u}
  226. result := QueryStringParamList(r, "tag")
  227. expected := []string{"alpha", "beta", "gamma"}
  228. if !reflect.DeepEqual(result, expected) {
  229. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  230. }
  231. result = QueryStringParamList(r, "missing")
  232. expected = nil
  233. if !reflect.DeepEqual(result, expected) {
  234. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  235. }
  236. }
  237. func TestHasQueryParam(t *testing.T) {
  238. u, _ := url.Parse("http://example.org/?key=42")
  239. r := &http.Request{URL: u}
  240. result := HasQueryParam(r, "key")
  241. expected := true
  242. if result != expected {
  243. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  244. }
  245. result = HasQueryParam(r, "missing key")
  246. expected = false
  247. if result != expected {
  248. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  249. }
  250. }