(ns reverse-routing.core-test (:use clojure.test reverse-routing.core [compojure.core :only [GET]])) (defn make-request [handler uri] ;; Technically most of this map is required by the ring spec ;; I'm fairly sure we could get away with not having most of it (-> {:request-method :get :scheme :http :uri uri :remote-addr "127.0.0.1" :server-port 8080 :server-name "something"} handler :body)) (deftest test-basic-route (let [handler (-> (routes (register-route :user (GET "/user/:id" [id] (str "user " id))) (GET "/succeed" [] (url-for :user 10)) (GET "/fail1" [] (url-for :user)) (GET "/fail2" [] (url-for :user 10 20))) wrap-reverse-routing)] (is (= (make-request handler "/succeed") "/user/10")) (is (thrown? java.lang.AssertionError (make-request handler "/fail1"))) (is (thrown? java.lang.AssertionError (make-request handler "/fail2"))))) (deftest test-context-routes (let [handler (-> (routes (register-route :user (GET "/user/" [id] (str "user list"))) (context "/user/:id" [] (register-route :user (GET "/" [id] (str "user " id))) (register-route :edit-user (GET "/edit" [id] (str "edit user " id)))) (GET "/succeed1" [] (url-for :user)) (GET "/succeed2" [] (url-for :user 10)) (GET "/succeed3" [] (url-for :edit-user 10)) (GET "/fail1" [] (url-for :user 10 20)) (GET "/fail2" [] (url-for :edit-user)) (GET "/fail3" [] (url-for :edit-user 10 20))) wrap-reverse-routing)] (is (= (make-request handler "/succeed1") "/user/")) (is (= (make-request handler "/succeed2") "/user/10/")) (is (= (make-request handler "/succeed3") "/user/10/edit")) (is (thrown? java.lang.AssertionError (make-request handler "/fail1"))) (is (thrown? java.lang.AssertionError (make-request handler "/fail2"))) (is (thrown? java.lang.AssertionError (make-request handler "/fail3"))))) (deftest test-context-in-context-routes (let [handler (-> (routes (context "/user" [] (register-route :user (GET "/" [id] (str "user list"))) (context "/:id" [id] (register-route :user (GET "/" [] (str "user " id))) (register-route :edit-user (GET "/edit" [] (str "edit user " id))))) (GET "/succeed1" [] (url-for :user)) (GET "/succeed2" [] (url-for :user 10)) (GET "/succeed3" [] (url-for :edit-user 10)) (GET "/fail1" [] (url-for :user 10 20)) (GET "/fail2" [] (url-for :edit-user)) (GET "/fail3" [] (url-for :edit-user 10 20))) wrap-reverse-routing)] (is (= (make-request handler "/succeed1") "/user/")) (is (= (make-request handler "/succeed2") "/user/10/")) (is (= (make-request handler "/succeed3") "/user/10/edit")) (is (thrown? java.lang.AssertionError (make-request handler "/fail1"))) (is (thrown? java.lang.AssertionError (make-request handler "/fail2"))) (is (thrown? java.lang.AssertionError (make-request handler "/fail3"))))) (def ^:dynamic *subroutes* (register-route :user (GET "/user" [] (str "user")))) (deftest test-with-rebinding-vars (let [handler (-> (routes #'*subroutes* (GET "/succeed" [] (url-for :user)) (GET "/fail" [] (url-for :user 10))) wrap-reverse-routing)] (is (= (make-request handler "/succeed") "/user")) (is (thrown? java.lang.AssertionError (make-request handler "/fail"))) (binding [*subroutes* (register-route :user (GET "/not-user" [] (str "user")))] (is (= (make-request handler "/succeed") "/not-user")) (is (thrown? java.lang.AssertionError (make-request handler "/fail"))))))