|
1 | 1 | (ns clj-http.test.core
|
2 |
| - (:use [clojure.test] |
3 |
| - [clojure.java.io :only [file]]) |
4 |
| - (:require [clojure.pprint :as pp] |
5 |
| - [clj-http.lite.core :as core] |
| 2 | + (:require [clj-http.lite.core :as core] |
6 | 3 | [clj-http.lite.util :as util]
|
| 4 | + [clojure.pprint :as pp] |
| 5 | + [clojure.java.io :refer [file]] |
| 6 | + [clojure.test :refer [deftest is use-fixtures]] |
7 | 7 | [ring.adapter.jetty :as ring])
|
8 |
| - (:import (java.io ByteArrayInputStream))) |
| 8 | + (:import (java.io ByteArrayInputStream) |
| 9 | + (org.eclipse.jetty.server Server) |
| 10 | + (org.eclipse.jetty.server.nio SelectChannelConnector))) |
9 | 11 |
|
10 | 12 | (defn handler [req]
|
11 |
| - ;;(pp/pprint req) |
12 |
| - ;;(println) (println) |
13 | 13 | (condp = [(:request-method req) (:uri req)]
|
14 | 14 | [:get "/get"]
|
15 | 15 | {:status 200 :body "get"}
|
|
33 | 33 | [:post "/multipart"]
|
34 | 34 | {:status 200 :body (:body req)}))
|
35 | 35 |
|
36 |
| -(defn run-server |
37 |
| - [] |
38 |
| - (defonce server |
39 |
| - (do |
40 |
| - (future |
41 |
| - (ring/run-jetty handler {:port 18080})) |
42 |
| - (Thread/sleep 1000)))) |
| 36 | +(defn make-server ^Server [] |
| 37 | + (ring/run-jetty handler {:port 0 ;; Use a free port |
| 38 | + :join? false})) |
| 39 | + |
| 40 | +(def ^:dynamic *server* nil) |
| 41 | + |
| 42 | +(defn current-port [] |
| 43 | + (let [^Server s *server*] |
| 44 | + (-> s .getConnectors ^SelectChannelConnector (first) .getLocalPort))) |
| 45 | + |
| 46 | +(defn with-server [t] |
| 47 | + (let [s (make-server)] |
| 48 | + (try |
| 49 | + (binding [*server* s] |
| 50 | + (t)) |
| 51 | + (finally |
| 52 | + (-> s .stop))))) |
43 | 53 |
|
44 |
| -(def base-req |
45 |
| - {:scheme :http |
46 |
| - :server-name "localhost" |
47 |
| - :server-port 18080}) |
| 54 | +(use-fixtures :each with-server) |
| 55 | + |
| 56 | +(defn base-req [] |
| 57 | + {:scheme :http |
| 58 | + :server-name (str "localhost:" (current-port)) |
| 59 | + :port (current-port)}) |
48 | 60 |
|
49 | 61 | (defn request [req]
|
50 |
| - (core/request (merge base-req req))) |
| 62 | + (core/request (merge (base-req) req))) |
51 | 63 |
|
52 | 64 | (defn slurp-body [req]
|
53 | 65 | (slurp (:body req)))
|
54 | 66 |
|
55 | 67 | (deftest ^{:integration true} makes-get-request
|
56 |
| - (run-server) |
| 68 | + (current-port) |
57 | 69 | (let [resp (request {:request-method :get :uri "/get"})]
|
58 | 70 | (is (= 200 (:status resp)))
|
59 | 71 | (is (= "get" (slurp-body resp)))))
|
60 | 72 |
|
61 | 73 | (deftest ^{:integration true} makes-head-request
|
62 |
| - (run-server) |
63 | 74 | (let [resp (request {:request-method :head :uri "/head"})]
|
64 | 75 | (is (= 200 (:status resp)))
|
65 | 76 | (is (nil? (:body resp)))))
|
66 | 77 |
|
67 | 78 | (deftest ^{:integration true} sets-content-type-with-charset
|
68 |
| - (run-server) |
69 |
| - (let [resp (request {:request-method :get :uri "/content-type" |
70 |
| - :content-type "text/plain" :character-encoding "UTF-8"})] |
| 79 | + (let [resp (request {:request-method :get :uri "/content-type" |
| 80 | + :content-type "text/plain" :character-encoding "UTF-8"})] |
71 | 81 | (is (= "text/plain; charset=UTF-8" (slurp-body resp)))))
|
72 | 82 |
|
73 | 83 | (deftest ^{:integration true} sets-content-type-without-charset
|
74 |
| - (run-server) |
75 | 84 | (let [resp (request {:request-method :get :uri "/content-type"
|
76 |
| - :content-type "text/plain"})] |
| 85 | + :content-type "text/plain"})] |
77 | 86 | (is (= "text/plain" (slurp-body resp)))))
|
78 | 87 |
|
79 | 88 | (deftest ^{:integration true} sets-arbitrary-headers
|
80 |
| - (run-server) |
81 | 89 | (let [resp (request {:request-method :get :uri "/header"
|
82 |
| - :headers {"X-My-Header" "header-val"}})] |
| 90 | + :headers {"X-My-Header" "header-val"}})] |
83 | 91 | (is (= "header-val" (slurp-body resp)))))
|
84 | 92 |
|
85 | 93 | (deftest ^{:integration true} sends-and-returns-byte-array-body
|
86 |
| - (run-server) |
87 | 94 | (let [resp (request {:request-method :post :uri "/post"
|
88 |
| - :body (util/utf8-bytes "contents")})] |
| 95 | + :body (util/utf8-bytes "contents")})] |
89 | 96 | (is (= 200 (:status resp)))
|
90 | 97 | (is (= "contents" (slurp-body resp)))))
|
91 | 98 |
|
92 | 99 | (deftest ^{:integration true} returns-arbitrary-headers
|
93 |
| - (run-server) |
94 | 100 | (let [resp (request {:request-method :get :uri "/get"})]
|
95 | 101 | (is (string? (get-in resp [:headers "date"])))))
|
96 | 102 |
|
97 | 103 | (deftest ^{:integration true} returns-status-on-exceptional-responses
|
98 |
| - (run-server) |
99 | 104 | (let [resp (request {:request-method :get :uri "/error"})]
|
100 | 105 | (is (= 500 (:status resp)))))
|
101 | 106 |
|
102 | 107 | (deftest ^{:integration true} returns-status-on-redirect
|
103 |
| - (run-server) |
104 | 108 | (let [resp (request {:request-method :get :uri "/redirect" :follow-redirects false})]
|
105 | 109 | (is (= 302 (:status resp)))))
|
106 | 110 |
|
107 | 111 | (deftest ^{:integration true} auto-follows-on-redirect
|
108 |
| - (run-server) |
109 | 112 | (let [resp (request {:request-method :get :uri "/redirect"})]
|
110 | 113 | (is (= 200 (:status resp)))
|
111 | 114 | (is (= "get" (slurp-body resp)))))
|
112 | 115 |
|
113 | 116 | (deftest ^{:integration true} sets-conn-timeout
|
114 |
| - ; indirect way of testing if a connection timeout will fail by passing in an |
115 |
| - ; invalid argument |
| 117 | + ;; indirect way of testing if a connection timeout will fail by passing in an |
| 118 | + ;; invalid argument |
116 | 119 | (try
|
117 | 120 | (request {:request-method :get :uri "/timeout" :conn-timeout -1})
|
118 | 121 | (throw (Exception. "Shouldn't get here."))
|
119 | 122 | (catch Exception e
|
120 | 123 | (is (= IllegalArgumentException (class e))))))
|
121 | 124 |
|
122 | 125 | (deftest ^{:integration true} sets-socket-timeout
|
123 |
| - (run-server) |
124 | 126 | (try
|
125 | 127 | (request {:request-method :get :uri "/timeout" :socket-timeout 1})
|
126 | 128 | (throw (Exception. "Shouldn't get here."))
|
|
137 | 139 |
|
138 | 140 | (deftest ^{:integration true} self-signed-ssl-get
|
139 | 141 | (let [t (doto (Thread. #(ring/run-jetty handler
|
140 |
| - {:port 8081 :ssl-port 18082 :ssl? true |
141 |
| - :keystore "test-resources/keystore" |
| 142 | + {:ssl? true |
| 143 | + :keystore "test-resources/keystore" |
142 | 144 | :key-password "keykey"})) .start)]
|
143 | 145 | (Thread/sleep 1000)
|
144 | 146 | (try
|
145 | 147 | (is (thrown? javax.net.ssl.SSLException
|
146 | 148 | (request {:request-method :get :uri "/get"
|
147 |
| - :server-port 18082 :scheme :https}))) |
148 |
| - #_(let [resp (request {:request-method :get :uri "/get" :server-port 18082 |
149 |
| - :scheme :https :insecure? true})] |
150 |
| - (is (= 200 (:status resp))) |
151 |
| - (is (= "get" (slurp-body resp)))) |
| 149 | + :scheme :https}))) |
| 150 | + #_(let [resp (request {:request-method :get :uri "/get" :server-port 18082 |
| 151 | + :scheme :https :insecure? true})] |
| 152 | + (is (= 200 (:status resp))) |
| 153 | + (is (= "get" (slurp-body resp)))) |
152 | 154 | (finally
|
153 |
| - (.stop t))))) |
| 155 | + (.stop t))))) |
154 | 156 |
|
155 | 157 | ;; (deftest ^{:integration true} multipart-form-uploads
|
156 | 158 | ;; (run-server)
|
|
170 | 172 | ;; (is (re-find #"name=\"d\"" resp-body))))
|
171 | 173 |
|
172 | 174 | (deftest ^{:integration true} t-save-request-obj
|
173 |
| - (run-server) |
174 | 175 | (let [resp (request {:request-method :post :uri "/post"
|
175 |
| - :body (.getBytes "foo bar") |
176 |
| - :save-request? true})] |
| 176 | + :body (.getBytes "foo bar") |
| 177 | + :save-request? true})] |
177 | 178 | (is (= 200 (:status resp)))
|
178 |
| - (is (= {:scheme :http |
179 |
| - :http-url "http://localhost:18080/post" |
| 179 | + (is (= {:scheme :http |
| 180 | + :http-url (str "http://localhost:" (current-port) "/post") |
180 | 181 | :request-method :post
|
181 |
| - :uri "/post" |
182 |
| - :server-name "localhost" |
183 |
| - :server-port 18080} |
184 |
| - (dissoc (:request resp) :body))))) |
| 182 | + :uri "/post" |
| 183 | + :server-name (str "localhost:" (current-port)) |
| 184 | + :port (current-port)} |
| 185 | + (-> resp |
| 186 | + :request |
| 187 | + (dissoc :body)))))) |
185 | 188 |
|
186 | 189 | ;; (deftest parse-headers
|
187 | 190 | ;; (are [headers expected]
|
|
211 | 214 | ;; "server" "some-server"}))
|
212 | 215 |
|
213 | 216 | (deftest ^{:integration true} t-streaming-response
|
214 |
| - (run-server) |
215 | 217 | (let [stream (:body (request {:request-method :get :uri "/get" :as :stream}))
|
216 | 218 | body (slurp stream)]
|
217 | 219 | (is (= "get" body))))
|
0 commit comments