Permalink
Fetching contributors…
Cannot retrieve contributors at this time
107 lines (100 sloc) 4.23 KB
(ns ring.util.test.servlet
(:use clojure.test
ring.util.servlet))
(defn- enumeration [coll]
(let [e (atom coll)]
(proxy [java.util.Enumeration] []
(hasMoreElements [] (not (empty? @e)))
(nextElement [] (let [f (first @e)] (swap! e rest) f)))))
(defn- servlet-request [request]
(let [attributes {"javax.servlet.request.X509Certificate"
[(request :ssl-client-cert)]}]
(proxy [javax.servlet.http.HttpServletRequest] []
(getServerPort [] (request :server-port))
(getServerName [] (request :server-name))
(getRemoteAddr [] (request :remote-addr))
(getRequestURI [] (request :uri))
(getQueryString [] (request :query-string))
(getScheme [] (name (request :scheme)))
(getMethod [] (-> request :request-method name .toUpperCase))
(getHeaderNames [] (enumeration (keys (request :headers))))
(getHeaders [name] (enumeration (get-in request [:headers name])))
(getContentType [] (request :content-type))
(getContentLength [] (or (request :content-length) -1))
(getCharacterEncoding [] (request :character-encoding))
(getAttribute [k] (attributes k))
(getInputStream [] (request :body)))))
(defn- servlet-response [response]
(proxy [javax.servlet.http.HttpServletResponse] []
(setStatus [status]
(swap! response assoc :status status))
(setHeader [name value]
(swap! response assoc-in [:headers name] value))
(setCharacterEncoding [value]
(swap! response assoc :character-encoding value))
(setContentType [value]
(swap! response assoc :content-type value))))
(defn- servlet-config []
(proxy [javax.servlet.ServletConfig] []
(getServletContext [] nil)))
(defn- run-servlet [handler request response]
(doto (servlet handler)
(.init (servlet-config))
(.service (servlet-request request)
(servlet-response response))))
(deftest servlet-test
(let [body (proxy [javax.servlet.ServletInputStream] [])
cert (proxy [java.security.cert.X509Certificate] [])
request {:server-port 8080
:server-name "foobar"
:remote-addr "127.0.0.1"
:uri "/foo"
:query-string "a=b"
:scheme :http
:request-method :get
:headers {"X-Client" ["Foo", "Bar"]
"X-Server" ["Baz"]}
:content-type "text/plain"
:content-length 10
:character-encoding "UTF-8"
:ssl-client-cert cert
:body body}
response (atom {})]
(testing "request"
(letfn [(handler [r]
(are [k v] (= (r k) v)
:server-port 8080
:server-name "foobar"
:remote-addr "127.0.0.1"
:uri "/foo"
:query-string "a=b"
:scheme :http
:request-method :get
:headers {"x-client" "Foo,Bar"
"x-server" "Baz"}
:content-type "text/plain"
:content-length 10
:character-encoding "UTF-8"
:ssl-client-cert cert
:body body)
{:status 200, :headers {}})]
(run-servlet handler request response)))
(testing "response"
(letfn [(handler [r]
{:status 200
:headers {"Content-Type" "text/plain"
"X-Server" "Bar"}
:body nil})]
(run-servlet handler request response)
(is (= (@response :status) 200))
(is (= (@response :content-type) "text/plain"))
(is (= (@response :character-encoding) "UTF-8"))
(is (= (get-in @response [:headers "X-Server"]) "Bar"))))
(testing "response with character encoding"
(letfn [(handler [r]
{:status 200
:headers {"Content-Type" "text/plain; charset=utf-16"}
:body nil})]
(run-servlet handler request response)
(is (= (@response :content-type) "text/plain"))
(is (= (@response :character-encoding) "utf-16"))))))