diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index bc3dc6ca..377258d5 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -181,7 +181,10 @@ (defn response-coercers [coercion responses opts] (some->> (for [[status model] responses] - [status (response-coercer coercion model opts)]) + (do + (when-not (int? status) + (throw (ex-info "Response status must be int" {:status status}))) + [status (response-coercer coercion model opts)])) (filter second) (seq) (into {}))) (defn -compile-parameters [data coercion] diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 71b11b58..fc4947e0 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -8,7 +8,8 @@ [reitit.ring.coercion] [reitit.ring.middleware.exception :as exception] [ring.util.http-response :as http-response]) - (:import (java.sql SQLException SQLWarning))) + (:import (clojure.lang ExceptionInfo) + (java.sql SQLException SQLWarning))) (derive ::kikka ::kukka) @@ -190,3 +191,15 @@ (is (contains? problems ::s/spec)) (is (contains? problems ::s/value)) (is (contains? problems ::s/problems)))))))) + +(deftest response-keys-test + (is (thrown-with-msg? + ExceptionInfo + #"Response status must be int" + (ring/ring-handler + (ring/router + [["/coercion" + {:middleware [reitit.ring.coercion/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion + :responses {:200 {:body {:total pos-int?}}} + :handler identity}]])))))