diff --git a/project.clj b/project.clj index f3d141d..971a992 100644 --- a/project.clj +++ b/project.clj @@ -5,9 +5,11 @@ :url "http://opensource.org/licenses/MIT"} :dependencies [[org.clojure/clojure "1.3.0"] [cheshire "5.3.1"] - [ring/ring-core "1.2.2"]] + [ring/ring-core "1.3.2"] + [ring/ring-defaults "0.1.4"]] :plugins [[codox "0.8.0"]] :profiles - {:1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]} + {:dev {:dependencies [[ring/ring-mock "0.2.0"]]} + :1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]} :1.5 {:dependencies [[org.clojure/clojure "1.5.1"]]} :1.6 {:dependencies [[org.clojure/clojure "1.6.0"]]}}) diff --git a/test/ring/middleware/test/json.clj b/test/ring/middleware/test/json.clj index 7f8e799..c064ad9 100644 --- a/test/ring/middleware/test/json.clj +++ b/test/ring/middleware/test/json.clj @@ -1,124 +1,124 @@ (ns ring.middleware.test.json - (:use ring.middleware.json - clojure.test - ring.util.io)) + (:require [clojure.test :refer :all] + [ring.middleware.json :refer :all] + [ring.mock.request :refer [request content-type body]] + [ring.util.response :refer [response header]] + [ring.middleware.params :refer [wrap-params]] + [ring.middleware.defaults :refer [wrap-defaults api-defaults]])) (deftest test-json-body (let [handler (wrap-json-body identity)] (testing "xml body" - (let [request {:content-type "application/xml" - :body (string-input-stream "")} - response (handler request)] - (is (= "") (slurp (:body response))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/xml") + (body "")))] + (is (= "") (:body resp)))) (testing "json body" - (let [request {:content-type "application/json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"}")} - response (handler request)] - (is (= {"foo" "bar"} (:body response))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/json; charset=UTF-8") + (body "{\"foo\": \"bar\"}")))] + (is (= {"foo" "bar"} (:body resp))))) (testing "custom json body" - (let [request {:content-type "application/vnd.foobar+json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"}")} - response (handler request)] - (is (= {"foo" "bar"} (:body response))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/vnd.foobar+json; charset=UTF-8") + (body "{\"foo\": \"bar\"}")))] + (is (= {"foo" "bar"} (:body resp))))) (testing "json patch body" - (let [json-string "[{\"op\": \"add\",\"path\":\"/foo\",\"value\": \"bar\"}]" - request {:content-type "application/json-patch+json; charset=UTF-8" - :body (string-input-stream json-string)} - response (handler request)] - (is (= [{"op" "add" "path" "/foo" "value" "bar"}] (:body response))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/json-patch+json; charset=UTF-8") + (body "[{\"op\": \"add\",\"path\":\"/foo\",\"value\": \"bar\"}]")))] + (is (= [{"op" "add" "path" "/foo" "value" "bar"}] (:body resp))))) (testing "malformed json" - (let [request {:content-type "application/json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"")}] - (is (= (handler request) + (let [resp (handler (-> (request :get "/") + (content-type "application/json; charset=UTF-8") + (body "{\"foo\": \"bar\"")))] + (is (= resp {:status 400 :headers {"Content-Type" "text/plain"} :body "Malformed JSON in request body."}))))) (let [handler (wrap-json-body identity {:keywords? true})] (testing "keyword keys" - (let [request {:content-type "application/json" - :body (string-input-stream "{\"foo\": \"bar\"}")} - response (handler request)] - (is (= {:foo "bar"} (:body response)))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/json") + (body "{\"foo\": \"bar\"}")))] + (is (= {:foo "bar"} (:body resp)))))) (let [handler (wrap-json-body identity {:keywords? true :bigdecimals? true})] (testing "bigdecimal floats" - (let [request {:content-type "application/json" - :body (string-input-stream "{\"foo\": 5.5}")} - response (handler request)] - (is (decimal? (-> response :body :foo))) - (is (= {:foo 5.5M} (:body response)))))) + (let [resp (handler (-> (request :get "/") + (content-type "application/json") + (body "{\"foo\": 5.5}")))] + (is (decimal? (-> resp :body :foo))) + (is (= {:foo 5.5M} (:body resp)))))) (testing "custom malformed json" (let [malformed {:status 400 :headers {"Content-Type" "text/html"} :body "Your JSON is wrong!"} - handler (wrap-json-body identity {:malformed-response malformed}) - request {:content-type "application/json" - :body (string-input-stream "{\"foo\": \"bar\"")}] - (is (= (handler request) malformed))))) + handler (wrap-json-body identity {:malformed-response malformed})] + (is (= (handler (-> (request :get "/") + (content-type "application/json") + (body "{\"foo\": \"bar\""))) + malformed))))) (deftest test-json-params - (let [handler (wrap-json-params identity)] + (let [handler (-> identity + (wrap-defaults api-defaults) + (wrap-json-params {:bigdecimals? true}))] (testing "xml body" - (let [request {:content-type "application/xml" - :body (string-input-stream "") - :params {"id" 3}} - response (handler request)] - (is (= "") (slurp (:body response))) - (is (= {"id" 3} (:params response))) - (is (nil? (:json-params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/xml") + (body "")))] + (is (= "") (:body resp)) + (is (= {:id "3"} (:params resp))) + (is (nil? (:json-params resp))))) (testing "json body" - (let [request {:content-type "application/json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"}") - :params {"id" 3}} - response (handler request)] - (is (= {"id" 3, "foo" "bar"} (:params response))) - (is (= {"foo" "bar"} (:json-params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/json; charset=UTF-8") + (body "{\"foo\": \"bar\"}")))] + (is (= {:id "3", :foo "bar"} (:params resp))) + (is (= {"foo" "bar"} (:json-params resp))))) (testing "json body with bigdecimals" - (let [handler (wrap-json-params identity {:bigdecimals? true}) - request {:content-type "application/json; charset=UTF-8" - :body (string-input-stream "{\"foo\": 5.5}") - :params {"id" 3}} - response (handler request)] - (is (decimal? (get-in response [:params "foo"]))) - (is (decimal? (get-in response [:json-params "foo"]))) - (is (= {"id" 3, "foo" 5.5M} (:params response))) - (is (= {"foo" 5.5M} (:json-params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/json; charset=UTF-8") + (body "{\"foo\": 5.5}")))] + (is (decimal? (get-in resp [:params :foo]))) + (is (decimal? (get-in resp [:json-params "foo"]))) + (is (= {:id "3" :foo 5.5M} (:params resp))) + (is (= {"foo" 5.5M} (:json-params resp))))) (testing "custom json body" - (let [request {:content-type "application/vnd.foobar+json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"}") - :params {"id" 3}} - response (handler request)] - (is (= {"id" 3, "foo" "bar"} (:params response))) - (is (= {"foo" "bar"} (:json-params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/vnd.foobar+json; charset=UTF-8") + (body "{\"foo\": \"bar\"}")))] + (is (= {:id "3", :foo "bar"} (:params resp))) + (is (= {"foo" "bar"} (:json-params resp))))) (testing "json schema body" - (let [request {:content-type "application/schema+json; charset=UTF-8" - :body (string-input-stream "{\"type\": \"schema\",\"properties\":{}}") - :params {"id" 3}} - response (handler request)] - (is (= {"id" 3, "type" "schema", "properties" {}} (:params response))) - (is (= {"type" "schema", "properties" {}} (:json-params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/schema+json; charset=UTF-8") + (body "{\"type\": \"schema\",\"properties\":{}}")))] + (is (= {:id "3", :type "schema", :properties {}} (:params resp))) + (is (= {"type" "schema", "properties" {}} (:json-params resp))))) (testing "array json body" - (let [request {:content-type "application/vnd.foobar+json; charset=UTF-8" - :body (string-input-stream "[\"foo\"]") - :params {"id" 3}} - response (handler request)] - (is (= {"id" 3} (:params response))))) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/vnd.foobar+json; charset=UTF-8") + (body "[\"foo\"]")))] + (is (= {:id "3"} (:params resp))))) (testing "malformed json" - (let [request {:content-type "application/json; charset=UTF-8" - :body (string-input-stream "{\"foo\": \"bar\"")}] - (is (= (handler request) + (let [resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/vnd.foobar+json; charset=UTF-8") + (body "{\"foo\": \"bar\"")))] + (is (= resp {:status 400 :headers {"Content-Type" "text/plain"} :body "Malformed JSON in request body."}))))) @@ -128,50 +128,51 @@ :headers {"Content-Type" "text/html"} :body "Your JSON is wrong!"} handler (wrap-json-params identity {:malformed-response malformed}) - request {:content-type "application/json" - :body (string-input-stream "{\"foo\": \"bar\"")}] - (is (= (handler request) malformed))))) + resp (handler (-> (request :get "/" {"id" 3}) + (content-type "application/vnd.foobar+json; charset=UTF-8") + (body "{\"foo\": \"bar\"")))] + (is (= resp malformed))))) (deftest test-json-response (testing "map body" - (let [handler (constantly {:status 200 :headers {} :body {:foo "bar"}}) - response ((wrap-json-response handler) {})] - (is (= (get-in response [:headers "Content-Type"]) "application/json; charset=utf-8")) - (is (= (:body response) "{\"foo\":\"bar\"}")))) + (let [handler (constantly (response {"foo" "bar"})) + resp ((wrap-json-response handler) {})] + (is (= (get-in resp [:headers "Content-Type"]) "application/json; charset=utf-8")) + (is (= (:body resp) "{\"foo\":\"bar\"}")))) (testing "string body" - (let [handler (constantly {:status 200 :headers {} :body "foobar"}) - response ((wrap-json-response handler) {})] - (is (= (:headers response) {})) - (is (= (:body response) "foobar")))) + (let [handler (constantly (response "foobar")) + resp ((wrap-json-response handler) {})] + (is (= (:headers resp) {})) + (is (= (:body resp) "foobar")))) (testing "vector body" - (let [handler (constantly {:status 200 :headers {} :body [:foo :bar]}) - response ((wrap-json-response handler) {})] - (is (= (get-in response [:headers "Content-Type"]) "application/json; charset=utf-8")) - (is (= (:body response) "[\"foo\",\"bar\"]")))) + (let [handler (constantly (response [:foo :bar])) + resp ((wrap-json-response handler) {})] + (is (= (get-in resp [:headers "Content-Type"]) "application/json; charset=utf-8")) + (is (= (:body resp) "[\"foo\",\"bar\"]")))) (testing "list body" - (let [handler (constantly {:status 200 :headers {} :body '(:foo :bar)}) - response ((wrap-json-response handler) {})] - (is (= (get-in response [:headers "Content-Type"]) "application/json; charset=utf-8")) - (is (= (:body response) "[\"foo\",\"bar\"]")))) + (let [handler (constantly (response '(:foo :bar))) + resp ((wrap-json-response handler) {})] + (is (= (get-in resp [:headers "Content-Type"]) "application/json; charset=utf-8")) + (is (= (:body resp) "[\"foo\",\"bar\"]")))) (testing "set body" - (let [handler (constantly {:status 200 :headers {} :body #{:foo :bar}}) - response ((wrap-json-response handler) {})] - (is (= (get-in response [:headers "Content-Type"]) "application/json; charset=utf-8")) - (is (or (= (:body response) "[\"foo\",\"bar\"]") - (= (:body response) "[\"bar\",\"foo\"]"))))) + (let [handler (constantly (response #{:foo :bar})) + resp ((wrap-json-response handler) {})] + (is (= (get-in resp [:headers "Content-Type"]) "application/json; charset=utf-8")) + (is (or (= (:body resp) "[\"foo\",\"bar\"]") + (= (:body resp) "[\"bar\",\"foo\"]"))))) (testing "JSON options" - (let [handler (constantly {:status 200 :headers {} :body {:foo "bar" :baz "quz"}}) - response ((wrap-json-response handler {:pretty true}) {})] - (is (or (= (:body response) "{\n \"foo\" : \"bar\",\n \"baz\" : \"quz\"\n}") - (= (:body response) "{\n \"baz\" : \"quz\",\n \"foo\" : \"bar\"\n}"))))) + (let [handler (constantly (response {:foo "bar" :baz "quz"})) + resp ((wrap-json-response handler {:pretty true}) {})] + (is (or (= (:body resp) "{\n \"foo\" : \"bar\",\n \"baz\" : \"quz\"\n}") + (= (:body resp) "{\n \"baz\" : \"quz\",\n \"foo\" : \"bar\"\n}"))))) (testing "don’t overwrite Content-Type if already set" - (let [handler (constantly {:status 200 :headers {"Content-Type" "application/json; some-param=some-value"} :body {:foo "bar"}}) - response ((wrap-json-response handler) {})] - (is (= (get-in response [:headers "Content-Type"]) "application/json; some-param=some-value")) - (is (= (:body response) "{\"foo\":\"bar\"}"))))) + (let [handler (constantly (header (response {:foo "bar"}) "Content-Type" "application/json; some-param=some-value")) + resp ((wrap-json-response handler) {})] + (is (= (get-in resp [:headers "Content-Type"]) "application/json; some-param=some-value")) + (is (= (:body resp) "{\"foo\":\"bar\"}"))))) \ No newline at end of file