PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/test/aleph/http/client_middleware_test.clj

https://github.com/ztellman/aleph
Clojure | 169 lines | 158 code | 10 blank | 1 comment | 43 complexity | 34e0b8187706e496e7619cab94fc75fe MD5 | raw file
Possible License(s): MIT
  1. (ns aleph.http.client-middleware-test
  2. (:require [aleph.http.client-middleware :as middleware]
  3. [clojure.test :as t :refer [deftest is]])
  4. (:import java.net.URLDecoder))
  5. (deftest test-empty-query-string
  6. (is (= "" (middleware/generate-query-string {})))
  7. (is (= "" (middleware/generate-query-string {} "text/plain; charset=utf-8")))
  8. (is (= "" (middleware/generate-query-string {} "text/html;charset=ISO-8859-1"))))
  9. (deftest test-basic-auth-value-encoding
  10. ;; see https://tools.ietf.org/html/rfc2617#page-5
  11. (is (= "Basic Og==" (middleware/basic-auth-value nil)))
  12. (is (= "Basic Og==" (middleware/basic-auth-value [])))
  13. (is (= "Basic " (middleware/basic-auth-value "")))
  14. (is (= "Basic dXNlcm5hbWU6cGFzc3dvcmQ=" (middleware/basic-auth-value "username:password")))
  15. (is (= "Basic dXNlcm5hbWU6cGFzc3dvcmQ=" (middleware/basic-auth-value ["username" "password"])))
  16. (is (= "Basic dXNlcm5hbWU6" (middleware/basic-auth-value ["username"])))
  17. (is (= "Basic dXNlcm5hbWU=" (middleware/basic-auth-value "username"))))
  18. (deftest test-coerce-form-params
  19. (is (= "{\"foo\":\"bar\"}" (middleware/coerce-form-params {:content-type :json
  20. :form-params {:foo :bar}})))
  21. (is (= "[\"^ \",\"~:foo\",\"~:bar\"]"
  22. (slurp (middleware/coerce-form-params {:content-type :transit+json
  23. :form-params {:foo :bar}}))))
  24. (is (= "{:foo :bar}" (middleware/coerce-form-params {:content-type :edn
  25. :form-params {:foo :bar}})))
  26. (is (= "foo=%3Abar" (middleware/coerce-form-params {:content-type :default
  27. :form-params {:foo :bar}})))
  28. (is (= "foo=%3Abar&foo=%3Abaz"
  29. (middleware/coerce-form-params {:content-type :default
  30. :form-params {:foo [:bar :baz]}})))
  31. (is (= "foo[]=%3Abar&foo[]=%3Abaz"
  32. (middleware/coerce-form-params {:content-type :default
  33. :multi-param-style :array
  34. :form-params {:foo [:bar :baz]}})))
  35. (is (= "foo[0]=%3Abar&foo[1]=%3Abaz"
  36. (middleware/coerce-form-params {:content-type :default
  37. :multi-param-style :indexed
  38. :form-params {:foo [:bar :baz]}})))
  39. (is (= (middleware/coerce-form-params {:content-type :default
  40. :form-params {:foo :bar}})
  41. (middleware/coerce-form-params {:form-params {:foo :bar}}))))
  42. (deftest test-nested-query-params
  43. (let [req {:query-params {:foo {:bar "baz"}}}
  44. {:keys [query-string]} (reduce #(%2 %1) req middleware/default-middleware)]
  45. (is (= "foo[bar]=baz" (URLDecoder/decode query-string)))))
  46. (deftest test-cookie-store
  47. (let [c1 {:name "id"
  48. :value "42"
  49. :domain "domain.com"
  50. :path "/"
  51. :max-age nil
  52. :http-only? true
  53. :secure? false}
  54. c2 {:name "track"
  55. :value "off"
  56. :domain "domain.com"
  57. :path "/"
  58. :max-age nil
  59. :http-only? true
  60. :secure? true}
  61. c3 {:name "track"
  62. :value "on"
  63. :domain "domain.com"
  64. :path "/blog"
  65. :max-age nil
  66. :http-only? true
  67. :secure? true}
  68. c4 {:name "subdomain"
  69. :value "detect"
  70. :domain "subdomain.com"}
  71. c5 (middleware/decode-set-cookie-header "outdated=val; Domain=outdomain.com; Expires=Wed, 21 Oct 2015 07:28:00 GMT")
  72. cs (middleware/in-memory-cookie-store [c1 c2 c3 c4 c5])
  73. spec middleware/default-cookie-spec
  74. dc (middleware/decode-set-cookie-header "id=42; Domain=domain.com; Path=/; HttpOnly")]
  75. (is (= c1 dc))
  76. (is (= "id=42; track=off" (-> (middleware/add-cookie-header cs spec {:url "https://domain.com/"})
  77. (get-in [:headers "cookie"])))
  78. "emit cookie for /blog path")
  79. (is (= "id=42" (-> (middleware/add-cookie-header cs spec {:url "http://domain.com/"})
  80. (get-in [:headers "cookie"])))
  81. "http request should not set secure cookies")
  82. (is (= "id=42; track=on" (-> (middleware/add-cookie-header cs spec {:url "https://domain.com/blog"})
  83. (get-in [:headers "cookie"])))
  84. "the most specific path")
  85. (is (= "subdomain=detect" (-> (middleware/add-cookie-header cs spec {:url "https://www.subdomain.com"})
  86. (get-in [:headers "cookie"])))
  87. "subdomain should match w/o leading dot under latest specifications")
  88. (is (nil? (-> (middleware/add-cookie-header cs spec {:url "https://anotherdomain.com/"})
  89. (get-in [:headers "cookie"])))
  90. "domain mistmatch")
  91. (is (nil? (-> (middleware/add-cookie-header cs spec {:url "https://outdomain.com/"})
  92. (get-in [:headers "cookie"])))
  93. "should not set expired")
  94. (is (= "no_override"
  95. (-> (middleware/wrap-cookies {:cookie-store cs
  96. :cookie-spec spec
  97. :url "https://domain.com/"
  98. :headers {"cookie" "no_override"}})
  99. (get-in [:headers "cookie"])))
  100. "no attempts to override when header is already set")
  101. (is (= "id=44" (-> (middleware/wrap-cookies {:url "https://domain.com/"
  102. :cookies [{:name "id"
  103. :value "44"
  104. :domain "domain.com"}]})
  105. (get-in [:headers "cookie"])))
  106. "accept cookies from req directly")
  107. (is (= "name=John" (-> (middleware/wrap-cookies {:url "https://domain.com/"
  108. :cookies [{:name "name" :value "John"}]
  109. :cookie-store cs})
  110. (get-in [:headers "cookie"])))
  111. "explicitly set cookies override cookie-store even when specified")
  112. (is (nil? (middleware/decode-set-cookie-header ""))
  113. "empty set-cookie header doesn't crash")))
  114. (defn req->query-string [req]
  115. (-> (reduce #(%2 %1) req middleware/default-middleware)
  116. :query-string
  117. URLDecoder/decode))
  118. (defn req->body-raw [req]
  119. (:body (reduce #(%2 %1) req middleware/default-middleware)))
  120. (defn req->body-decoded [req]
  121. (URLDecoder/decode (req->body-raw req)))
  122. (deftest test-nested-params
  123. (is (= "foo[bar]=baz" (req->query-string {:query-params {:foo {:bar "baz"}}})))
  124. (is (= "foo[bar]=baz" (req->query-string {:query-params {:foo {:bar "baz"}}
  125. :content-type :json})))
  126. (is (= "foo[bar]=baz" (req->query-string {:query-params {:foo {:bar "baz"}}
  127. :ignore-nested-query-string false})))
  128. (is (= "foo={:bar \"baz\"}" (req->query-string {:query-params {:foo {:bar "baz"}}
  129. :ignore-nested-query-string true})))
  130. (is (= "foo[bar]=baz" (req->body-decoded {:method :post
  131. :form-params {:foo {:bar "baz"}}})))
  132. (is (= "foo[bar]=baz" (req->body-decoded {:method :post
  133. :flatten-nested-form-params true
  134. :form-params {:foo {:bar "baz"}}})))
  135. (is (= "foo={:bar \"baz\"}" (req->body-decoded {:method :post
  136. :flatten-nested-form-params false
  137. :form-params {:foo {:bar "baz"}}})))
  138. (is (= "foo={:bar \"baz\"}" (req->body-decoded {:method :post
  139. :flatten-nested-keys []
  140. :form-params {:foo {:bar "baz"}}})))
  141. (is (= "foo={:bar \"baz\"}" (req->body-decoded {:method :post
  142. :flatten-nested-keys [:query-params]
  143. :form-params {:foo {:bar "baz"}}})))
  144. (is (= "foo[bar]=baz" (req->body-decoded {:method :post
  145. :flatten-nested-keys [:form-params]
  146. :form-params {:foo {:bar "baz"}}})))
  147. (is (= "{\"foo\":{\"bar\":\"baz\"}}"
  148. (req->body-raw {:method :post
  149. :content-type :json
  150. :form-params {:foo {:bar "baz"}}}))))
  151. (deftest test-query-string-multi-param
  152. (is (= "name=John" (middleware/generate-query-string {:name "John"})))
  153. (is (= "name=John&name=Mark" (middleware/generate-query-string {:name ["John" "Mark"]})))
  154. (is (= "name=John&name=Mark"
  155. (middleware/generate-query-string {:name ["John" "Mark"]} nil :default)))
  156. (is (= "name[]=John&name[]=Mark"
  157. (middleware/generate-query-string {:name ["John" "Mark"]} nil :array)))
  158. (is (= "name[0]=John&name[1]=Mark"
  159. (middleware/generate-query-string {:name ["John" "Mark"]} nil :indexed))))