params_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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 TestRouteStringParam(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 TestRouteInt64Param(t *testing.T) {
  55. router := mux.NewRouter()
  56. router.HandleFunc("/a/{variable1}/b/{variable2}/c/{variable3}", func(w http.ResponseWriter, r *http.Request) {
  57. result := RouteInt64Param(r, "variable1")
  58. expected := int64(42)
  59. if result != expected {
  60. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  61. }
  62. result = RouteInt64Param(r, "missing variable")
  63. expected = 0
  64. if result != expected {
  65. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  66. }
  67. result = RouteInt64Param(r, "variable2")
  68. expected = 0
  69. if result != expected {
  70. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  71. }
  72. result = RouteInt64Param(r, "variable3")
  73. expected = 0
  74. if result != expected {
  75. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  76. }
  77. })
  78. r, err := http.NewRequest("GET", "/a/42/b/not-int/c/-10", nil)
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. w := httptest.NewRecorder()
  83. router.ServeHTTP(w, r)
  84. }
  85. func TestQueryStringParam(t *testing.T) {
  86. u, _ := url.Parse("http://example.org/?key=value")
  87. r := &http.Request{URL: u}
  88. result := QueryStringParam(r, "key", "fallback")
  89. expected := "value"
  90. if result != expected {
  91. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  92. }
  93. result = QueryStringParam(r, "missing key", "fallback")
  94. expected = "fallback"
  95. if result != expected {
  96. t.Errorf(`Unexpected result, got %q instead of %q`, result, expected)
  97. }
  98. }
  99. func TestQueryIntParam(t *testing.T) {
  100. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  101. r := &http.Request{URL: u}
  102. result := QueryIntParam(r, "key", 84)
  103. expected := 42
  104. if result != expected {
  105. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  106. }
  107. result = QueryIntParam(r, "missing key", 84)
  108. expected = 84
  109. if result != expected {
  110. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  111. }
  112. result = QueryIntParam(r, "negative", 69)
  113. expected = 69
  114. if result != expected {
  115. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  116. }
  117. result = QueryIntParam(r, "invalid", 99)
  118. expected = 99
  119. if result != expected {
  120. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  121. }
  122. }
  123. func TestQueryInt64Param(t *testing.T) {
  124. u, _ := url.Parse("http://example.org/?key=42&invalid=value&negative=-5")
  125. r := &http.Request{URL: u}
  126. result := QueryInt64Param(r, "key", int64(84))
  127. expected := int64(42)
  128. if result != expected {
  129. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  130. }
  131. result = QueryInt64Param(r, "missing key", int64(84))
  132. expected = int64(84)
  133. if result != expected {
  134. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  135. }
  136. result = QueryInt64Param(r, "negative", int64(69))
  137. expected = int64(69)
  138. if result != expected {
  139. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  140. }
  141. result = QueryInt64Param(r, "invalid", int64(99))
  142. expected = int64(99)
  143. if result != expected {
  144. t.Errorf(`Unexpected result, got %d instead of %d`, result, expected)
  145. }
  146. }
  147. func TestQueryBoolParam(t *testing.T) {
  148. u, _ := url.Parse("http://example.org/?truthy=true&falsy=false&invalid=wat")
  149. r := &http.Request{URL: u}
  150. result := QueryBoolParam(r, "truthy", false)
  151. expected := true
  152. if result != expected {
  153. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  154. }
  155. result = QueryBoolParam(r, "falsy", true)
  156. expected = false
  157. if result != expected {
  158. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  159. }
  160. result = QueryBoolParam(r, "missing", true)
  161. expected = true
  162. if result != expected {
  163. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  164. }
  165. result = QueryBoolParam(r, "invalid", true)
  166. expected = true
  167. if result != expected {
  168. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  169. }
  170. }
  171. func TestQueryStringParamList(t *testing.T) {
  172. u, _ := url.Parse("http://example.org/?tag=alpha&tag=beta&tag=+&tag=%20%20gamma%20%20&empty=")
  173. r := &http.Request{URL: u}
  174. result := QueryStringParamList(r, "tag")
  175. expected := []string{"alpha", "beta", "gamma"}
  176. if !reflect.DeepEqual(result, expected) {
  177. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  178. }
  179. result = QueryStringParamList(r, "missing")
  180. expected = nil
  181. if !reflect.DeepEqual(result, expected) {
  182. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  183. }
  184. }
  185. func TestHasQueryParam(t *testing.T) {
  186. u, _ := url.Parse("http://example.org/?key=42")
  187. r := &http.Request{URL: u}
  188. result := HasQueryParam(r, "key")
  189. expected := true
  190. if result != expected {
  191. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  192. }
  193. result = HasQueryParam(r, "missing key")
  194. expected = false
  195. if result != expected {
  196. t.Errorf(`Unexpected result, got %v instead of %v`, result, expected)
  197. }
  198. }