intercerptors with cps-ring

This commit is contained in:
Tommi Reiman 2018-08-25 14:21:11 +03:00
parent eeed8576da
commit a68cafe5ce
2 changed files with 64 additions and 58 deletions

View file

@ -96,17 +96,24 @@
(interceptor/execute executor default-queue request))) (interceptor/execute executor default-queue request)))
(interceptor/execute executor default-queue request))) (interceptor/execute executor default-queue request)))
([request respond raise] ([request respond raise]
(if-let [match (r/match-by-path router (:uri request))] (let [default #(interceptor/execute executor default-queue % respond raise)]
(let [method (:request-method request) (if-let [match (r/match-by-path router (:uri request))]
path-params (:path-params match) (let [method (:request-method request)
endpoint (-> match :result method) path-params (:path-params match)
interceptors (or (:queue endpoint) (:interceptors endpoint)) endpoint (-> match :result method)
request (-> request interceptors (or (:queue endpoint) (:interceptors endpoint))
(impl/fast-assoc :path-params path-params) request (-> request
(impl/fast-assoc ::r/match match) (impl/fast-assoc :path-params path-params)
(impl/fast-assoc ::r/router router))] (impl/fast-assoc ::r/match match)
(interceptor/execute executor interceptors request respond raise)) (impl/fast-assoc ::r/router router))
(interceptor/execute executor default-queue request respond raise)) respond' (fn [response]
(if response
(respond response)
(default request)))]
(if interceptors
(interceptor/execute executor interceptors request respond' raise)
(default request)))
(default request)))
nil)) nil))
{::r/router router}))) {::r/router router})))

View file

@ -170,69 +170,68 @@
(testing "handler rejects" (testing "handler rejects"
(is (= -406 (:status (app {:request-method :get, :uri "/pong"})))))))))) (is (= -406 (:status (app {:request-method :get, :uri "/pong"}))))))))))
#_(deftest async-http-test (deftest async-http-test
(let [promise #(let [value (atom ::nil)] (let [promise #(let [value (atom ::nil)]
(fn (fn
([] @value) ([] @value)
([x] (reset! value x)))) ([x]
response {:status 200, :body "ok"} (reset! value x))))
router (http/router response {:status 200, :body "ok"}
[["/ping" {:get (fn [_ respond _] router (http/router
(respond response))}] [["/ping" {:get (fn [_] response)}]
["/pong" (fn [_ respond _] ["/pong" (fn [_] nil)]])
(respond nil))]]) app (http/ring-handler router nil {:executor sieppari/executor})]
app (http/ring-handler router)]
(testing "match" (testing "match"
(let [respond (promise) (let [respond (promise)
raise (promise)] raise (promise)]
(app {:request-method :get, :uri "/ping"} respond raise) (app {:request-method :get, :uri "/ping"} respond raise)
(is (= response (respond))) (is (= response (respond)))
(is (= ::nil (raise))))) (is (= ::nil (raise)))))
(testing "no match" (testing "no match"
(testing "with defaults" (testing "with defaults"
(testing "route doesn't match"
(let [respond (promise)
raise (promise)]
(app {:request-method :get, :uri "/"} respond raise)
(is (= nil (respond)))
(is (= ::nil (raise)))))
(testing "method doesn't match"
(let [respond (promise)
raise (promise)]
(app {:request-method :post, :uri "/ping"} respond raise)
(is (= nil (respond)))
(is (= ::nil (raise)))))
(testing "handler rejects"
(let [respond (promise)
raise (promise)]
(app {:request-method :get, :uri "/pong"} respond raise)
(is (= nil (respond)))
(is (= ::nil (raise))))))
(testing "with default http responses"
(let [app (http/ring-handler router (ring/create-default-handler) {:executor sieppari/executor})]
(testing "route doesn't match" (testing "route doesn't match"
(let [respond (promise) (let [respond (promise)
raise (promise)] raise (promise)]
(app {:request-method :get, :uri "/"} respond raise) (app {:request-method :get, :uri "/"} respond raise)
(is (= nil (respond))) (is (= 404 (:status (respond))))
(is (= ::nil (raise))))) (is (= ::nil (raise)))))
(testing "method doesn't match" (testing "method doesn't match"
(let [respond (promise) (let [respond (promise)
raise (promise)] raise (promise)]
(app {:request-method :post, :uri "/ping"} respond raise) (app {:request-method :post, :uri "/ping"} respond raise)
(is (= nil (respond))) (is (= 405 (:status (respond))))
(is (= ::nil (raise))))) (is (= ::nil (raise)))))
(testing "handler rejects" (testing "if handler rejects"
(let [respond (promise) (let [respond (promise)
raise (promise)] raise (promise)]
(app {:request-method :get, :uri "/pong"} respond raise) (app {:request-method :get, :uri "/pong"} respond raise)
(is (= nil (respond))) (is (= 406 (:status (respond))))
(is (= ::nil (raise)))))) (is (= ::nil (raise))))))))))
(testing "with default http responses"
(let [app (http/ring-handler router (ring/create-default-handler))]
(testing "route doesn't match"
(let [respond (promise)
raise (promise)]
(app {:request-method :get, :uri "/"} respond raise)
(is (= 404 (:status (respond))))
(is (= ::nil (raise)))))
(testing "method doesn't match"
(let [respond (promise)
raise (promise)]
(app {:request-method :post, :uri "/ping"} respond raise)
(is (= 405 (:status (respond))))
(is (= ::nil (raise)))))
(testing "if handler rejects"
(let [respond (promise)
raise (promise)]
(app {:request-method :get, :uri "/pong"} respond raise)
(is (= 406 (:status (respond))))
(is (= ::nil (raise))))))))))
(deftest interceptor-transform-test (deftest interceptor-transform-test
(let [interceptor (fn [name] {:name name (let [interceptor (fn [name] {:name name