reitit/test/cljs/reitit/frontend/core_test.cljs

130 lines
4.8 KiB
Text
Raw Normal View History

2018-06-08 13:00:49 +00:00
(ns reitit.frontend.core-test
(:require [clojure.test :refer [deftest testing is are]]
[reitit.core :as r]
[reitit.frontend :as rf]
[reitit.coercion :as rc]
2018-06-08 13:00:49 +00:00
[schema.core :as s]
[reitit.coercion.schema :as rsc]
[reitit.frontend.test-utils :refer [capture-console]]))
2018-06-08 13:00:49 +00:00
2018-07-11 06:52:35 +00:00
(defn m [x]
(assoc x :data nil :result nil))
2018-06-08 13:00:49 +00:00
(deftest match-by-path-test
(testing "simple"
(let [router (r/router ["/"
["" ::frontpage]
["foo" ::foo]
["bar" ::bar]])]
(is (= (r/map->Match
{:template "/"
:data {:name ::frontpage}
:path-params {}
:query-params {}
:path "/"
:parameters {:query {}
:path {}}})
2018-06-08 13:00:49 +00:00
(rf/match-by-path router "/")))
2018-07-11 06:52:35 +00:00
(is (= "/"
(r/match->path (rf/match-by-name router ::frontpage))))
(is (= (r/map->Match
{:template "/foo"
:data {:name ::foo}
:path-params {}
:query-params {}
:path "/foo"
:parameters {:query {}
:path {}}})
2018-07-11 06:52:35 +00:00
(rf/match-by-path router "/foo")))
(is (= (r/map->Match
{:template "/foo"
:data {:name ::foo}
:path-params {}
:query-params {:mode ["foo", "bar"]}
:path "/foo"
:parameters {:query {:mode ["foo", "bar"]}
:path {}}})
(rf/match-by-path router "/foo?mode=foo&mode=bar")))
2018-07-11 06:52:35 +00:00
(is (= "/foo"
(r/match->path (rf/match-by-name router ::foo))))
2018-08-22 07:47:04 +00:00
(testing "console warning about missing route"
(is (= [{:type :warn
:message ["missing route" ::asd]}]
(:messages
2023-01-10 06:05:42 +00:00
(capture-console
(fn []
(rf/match-by-name! router ::asd)))))))))
2018-06-08 13:00:49 +00:00
(testing "schema coercion"
(let [router (r/router ["/"
[":id" {:name ::foo
:parameters {:path {:id s/Int}
:query {(s/optional-key :mode) s/Keyword}}}]]
{:compile rc/compile-request-coercers
:data {:coercion rsc/coercion}})]
2018-08-22 07:47:04 +00:00
(is (= (r/map->Match
{:template "/:id"
:path-params {:id "5"}
:query-params {}
:path "/5"
:parameters {:query {}
:path {:id 5}}})
2018-07-11 06:52:35 +00:00
(m (rf/match-by-path router "/5"))))
(is (= "/5"
(r/match->path (rf/match-by-name router ::foo {:id 5}))))
2022-04-05 14:33:25 +00:00
(testing "coercion error"
(testing "throws without options"
(is (thrown? js/Error (m (rf/match-by-path router "/a")))))
(testing "thows and calles on-coercion-error"
2022-04-05 14:55:09 +00:00
(let [exception (atom nil)
match (atom nil)]
(is (thrown? js/Error (m (rf/match-by-path router "/a" {:on-coercion-error (fn [m e]
(reset! match m)
(reset! exception e))}))))
(is (= {:id "a"} (-> @match :path-params)))
2022-04-05 14:33:25 +00:00
(is (= {:id "a"} (-> @exception (ex-data) :value))))))
2018-08-22 07:47:04 +00:00
(testing "query param is read"
(is (= (r/map->Match
{:template "/:id"
:path-params {:id "5"}
:query-params {:mode "foo"}
2018-08-22 07:47:04 +00:00
:path "/5"
:parameters {:path {:id 5}
:query {:mode :foo}}})
2018-08-22 07:47:04 +00:00
(m (rf/match-by-path router "/5?mode=foo"))))
(is (= "/5?mode=foo"
(r/match->path (rf/match-by-name router ::foo {:id 5}) {:mode :foo}))))
2018-07-11 06:52:35 +00:00
(testing "fragment is ignored"
2018-08-22 07:47:04 +00:00
(is (= (r/map->Match
{:template "/:id"
:path-params {:id "5"}
:query-params {:mode "foo"}
2018-08-22 07:47:04 +00:00
:path "/5"
:parameters {:path {:id 5}
:query {:mode :foo}}})
(m (rf/match-by-path router "/5?mode=foo#fragment")))))
2018-08-22 07:47:04 +00:00
(testing "console warning about missing params"
(is (= [{:type :warn
:message ["missing path-params for route" ::foo
{:template "/:id"
:missing #{:id}
:required #{:id}
:path-params {}}]}]
(:messages
2023-01-10 06:05:42 +00:00
(capture-console
(fn []
(rf/match-by-name! router ::foo {}))))))))))