17 | 17 |
(zip/edit loc #(str "REGEX: " (.pattern %)))
|
18 | 18 |
(zip/next loc)))))))
|
19 | 19 |
|
20 | |
(deftest handler-schema-test
|
21 | |
(testing "handler schema"
|
22 | |
(is (nil? (schema/check Handler :foo)))
|
23 | |
(is (nil? (schema/check Handler (fn [] :foo))))
|
24 | |
(is (nil? (schema/check Handler {:get (fn [] :foo)})))
|
25 | |
(is (nil? (schema/check Handler {:post :foo})))))
|
26 | |
|
27 | 20 |
(deftest update-route-info-test
|
28 | 21 |
(let [orig-route-info {:path []
|
29 | 22 |
:request-method :any}]
|
|
32 | 25 |
(is (= {:path []
|
33 | 26 |
:request-method verb}
|
34 | 27 |
(update-route-info* orig-route-info verb)))))
|
|
28 |
(testing "string path gets added to the path"
|
|
29 |
(is (= {:path ["/foo"]
|
|
30 |
:request-method :any}
|
|
31 |
(update-route-info* orig-route-info "/foo"))))
|
35 | 32 |
(testing "string path elements get added to the path"
|
36 | 33 |
(is (= {:path ["/foo"]
|
37 | 34 |
:request-method :any}
|
38 | |
(update-route-info* orig-route-info "/foo"))))
|
|
35 |
(update-route-info* orig-route-info ["/foo"]))))
|
39 | 36 |
(testing "keyword path elements get added to the path"
|
40 | 37 |
(is (= {:path [:foo]
|
41 | 38 |
:request-method :any}
|
|
44 | 41 |
(is (= {:path ["/foo/" :foo]
|
45 | 42 |
:request-method :any}
|
46 | 43 |
(update-route-info* orig-route-info ["/foo/" :foo]))))
|
|
44 |
(testing "boolean true is handled specially"
|
|
45 |
(is (= {:path ["*"]
|
|
46 |
:request-method :any}
|
|
47 |
(update-route-info* orig-route-info true))))
|
|
48 |
(testing "boolean false is handled specially"
|
|
49 |
(is (= {:path ["!"]
|
|
50 |
:request-method :any}
|
|
51 |
(update-route-info* orig-route-info false))))
|
47 | 52 |
(testing "regex path element gets added to the path"
|
48 | 53 |
(is (= {:path ["/foo/" ["REGEX: .*" :foo]]
|
49 | 54 |
:request-method :any}
|
|
52 | 57 |
|
53 | 58 |
(deftest route-metadata-test
|
54 | 59 |
(testing "route metadata includes ordered list of routes and lookup by handler"
|
55 | |
(let [routes ["" [[["/foo/" :foo]
|
56 | |
:foo-handler]
|
|
60 |
(let [routes ["" [[["/foo/" :foo] :foo-handler]
|
57 | 61 |
[["/bar/" :bar]
|
58 | 62 |
[["/baz" {:get :baz-handler}]
|
59 | 63 |
["/bam" {:put :bam-handler}]
|
|
64 |
["/boop" :boop-handler]
|
60 | 65 |
["/bap" {:options :bap-handler}]]]
|
61 | |
["/buzz" {:post :buzz-handler}]]]
|
|
66 |
["/buzz" {:post :buzz-handler}]
|
|
67 |
[true {:get :true-handler}]]]
|
62 | 68 |
expected-foo-meta {:path ["" "/foo/" :foo]
|
63 | 69 |
:route-id "foo-:foo"
|
64 | 70 |
:request-method :any}
|
|
68 | 74 |
expected-bam-meta {:path ["" "/bar/" :bar "/bam"]
|
69 | 75 |
:route-id "bar-:bar-bam"
|
70 | 76 |
:request-method :put}
|
|
77 |
expected-boop-meta {:path ["" "/bar/" :bar "/boop"]
|
|
78 |
:route-id "bar-:bar-boop"
|
|
79 |
:request-method :any}
|
71 | 80 |
expected-bap-meta {:path ["" "/bar/" :bar "/bap"]
|
72 | 81 |
:route-id "bar-:bar-bap"
|
73 | 82 |
:request-method :options}
|
74 | 83 |
expected-buzz-meta {:path ["" "/buzz"]
|
75 | 84 |
:route-id "buzz"
|
76 | |
:request-method :post}]
|
77 | |
(is (= (comidi/route-metadata routes)
|
78 | |
{:routes [expected-foo-meta
|
79 | |
expected-baz-meta
|
80 | |
expected-bam-meta
|
81 | |
expected-bap-meta
|
82 | |
expected-buzz-meta]
|
83 | |
:handlers {:foo-handler expected-foo-meta
|
84 | |
:baz-handler expected-baz-meta
|
85 | |
:bam-handler expected-bam-meta
|
86 | |
:bap-handler expected-bap-meta
|
87 | |
:buzz-handler expected-buzz-meta}})))))
|
|
85 |
:request-method :post}
|
|
86 |
expected-true-meta {:path ["" "*"]
|
|
87 |
:route-id "*"
|
|
88 |
:request-method :get}]
|
|
89 |
(is (= (comidi/route-metadata* routes)
|
|
90 |
{:routes [expected-foo-meta
|
|
91 |
expected-baz-meta
|
|
92 |
expected-bam-meta
|
|
93 |
expected-boop-meta
|
|
94 |
expected-bap-meta
|
|
95 |
expected-buzz-meta
|
|
96 |
expected-true-meta]
|
|
97 |
:handlers {:foo-handler expected-foo-meta
|
|
98 |
:baz-handler expected-baz-meta
|
|
99 |
:bam-handler expected-bam-meta
|
|
100 |
:boop-handler expected-boop-meta
|
|
101 |
:bap-handler expected-bap-meta
|
|
102 |
:buzz-handler expected-buzz-meta
|
|
103 |
:true-handler expected-true-meta}})))))
|
88 | 104 |
|
89 | 105 |
(deftest routes-test
|
90 | 106 |
(is (= ["" [["/foo" :foo-handler]
|
|
114 | 130 |
(fn [req] :bar)]
|
115 | 131 |
[["/baz/" :baz]
|
116 | 132 |
(fn [req]
|
117 | |
{:endpoint :baz
|
118 | |
:route-params (:route-params req)})]]]]])]
|
|
133 |
{:endpoint :baz
|
|
134 |
:route-params (:route-params req)})]
|
|
135 |
[true
|
|
136 |
(fn [req] :true)]]]]])]
|
|
137 |
(is (= :true (handler {:uri "/foo/something/else"})))
|
119 | 138 |
(is (= :bar (handler {:uri "/foo/bar"})))
|
120 | 139 |
(is (= {:endpoint :baz
|
121 | 140 |
:route-params {:baz "howdy"}}
|
|
221 | 240 |
|
222 | 241 |
(deftest route-names-test
|
223 | 242 |
(let [test-routes (routes
|
224 | |
(GET ["/foo/something/"] request
|
225 | |
"foo!")
|
226 | |
(POST ["/bar"] request
|
227 | |
"bar!")
|
228 | |
(PUT ["/baz" [#".*" :rest]] request
|
229 | |
"baz!")
|
230 | |
(ANY ["/bam/" [#"(?:bip|bap)" :rest]] request
|
231 | |
"bam!")
|
232 | |
(HEAD ["/bang/" [#".*" :rest] "/pow/" :pow] request
|
233 | |
"bang!"))
|
|
243 |
; Bidi Pattern: Path
|
|
244 |
(GET "/foo" request
|
|
245 |
"foo!")
|
|
246 |
(GET ["/foo/something/"] request
|
|
247 |
"foo something!")
|
|
248 |
; Bidi Pattern: [ PatternSegment+ ]
|
|
249 |
(POST ["/bar"] request
|
|
250 |
"bar!")
|
|
251 |
(POST ["/bar" "bie"] request
|
|
252 |
"barbie!")
|
|
253 |
(PUT ["/baz" [#".*" :rest]] request
|
|
254 |
"baz!")
|
|
255 |
(ANY ["/bam/" [#"(?:bip|bap)" :rest]] request
|
|
256 |
"bam!")
|
|
257 |
(HEAD ["/bang/" [#".*" :rest] "/pow/" :pow] request
|
|
258 |
"bang!")
|
|
259 |
; Bidi Pattern: false
|
|
260 |
(GET false request
|
|
261 |
"catch none!")
|
|
262 |
(GET "/false" request
|
|
263 |
"omg why would you do this?")
|
|
264 |
(GET ["/is" :false] request
|
|
265 |
"it hurts so bad")
|
|
266 |
; Bidi Pattern: true
|
|
267 |
(GET true request
|
|
268 |
"catch all!")
|
|
269 |
(GET "/true" request
|
|
270 |
"omg why would you do this?")
|
|
271 |
(GET ["/is" :true] request
|
|
272 |
"it hurts so bad"))
|
234 | 273 |
route-meta (route-metadata test-routes)
|
235 | 274 |
route-ids (map :route-id (:routes route-meta))]
|
236 | |
(is (= #{"foo-something" "bar" "baz-/*/" "bam-/bip_bap/" "bang-/*/-pow-:pow"}
|
|
275 |
(is (= #{"foo"
|
|
276 |
"foo-something"
|
|
277 |
"bar"
|
|
278 |
"bar-bie"
|
|
279 |
"baz-/*/"
|
|
280 |
"bam-/bip_bap/"
|
|
281 |
"bang-/*/-pow-:pow"
|
|
282 |
"*"
|
|
283 |
"true"
|
|
284 |
"is-:true"
|
|
285 |
"!"
|
|
286 |
"false"
|
|
287 |
"is-:false"}
|
237 | 288 |
(set route-ids)))))
|
238 | 289 |
|
239 | 290 |
(deftest wrap-with-route-metadata-test
|
|
241 | 292 |
(ANY ["/foo/" :foo] request
|
242 | 293 |
"foo!")
|
243 | 294 |
(GET ["/bar/" :bar] request
|
244 | |
"bar!"))
|
|
295 |
"bar!")
|
|
296 |
(GET "/false" request "falsefalse!")
|
|
297 |
(GET false request "truefalse!")
|
|
298 |
(GET "/true" request "falsetrue!")
|
|
299 |
(GET true request "truetrue!"))
|
245 | 300 |
route-meta (route-metadata test-routes)
|
246 | 301 |
test-atom (atom {})
|
247 | 302 |
test-middleware (fn [f]
|
|
257 | 312 |
|
258 | 313 |
(handler {:uri "/bar/something" :request-method :get})
|
259 | 314 |
(is (= (-> test-atom deref :route-info :route-id) "bar-:bar"))
|
|
315 |
(is (= (-> test-atom deref :route-metadata) route-meta))
|
|
316 |
|
|
317 |
(handler {:uri "/false" :request-method :get})
|
|
318 |
(is (= (-> test-atom deref :route-info :route-id) "false"))
|
|
319 |
(is (= (-> test-atom deref :route-metadata) route-meta))
|
|
320 |
|
|
321 |
(handler {:uri "/true" :request-method :get})
|
|
322 |
(is (= (-> test-atom deref :route-info :route-id) "true"))
|
|
323 |
(is (= (-> test-atom deref :route-metadata) route-meta))
|
|
324 |
|
|
325 |
(handler {:uri "/wat" :request-method :get})
|
|
326 |
(is (= (-> test-atom deref :route-info :route-id) "*"))
|
260 | 327 |
(is (= (-> test-atom deref :route-metadata) route-meta))))
|
261 | 328 |
|
262 | 329 |
(deftest route-handler-uses-existing-match-context-test
|
|
316 | 383 |
(is (= (:body (handler {:uri "/middle/dd" :request-method :delete})) "dd!"))
|
317 | 384 |
(is (= (:body (handler {:uri "/right/ee" :request-method :get})) "outer-ee!"))
|
318 | 385 |
(is (= (:body (handler {:uri "/right/ff" :request-method :delete})) "outer-ff!"))))))
|
|
386 |
|
|
387 |
(deftest destructuring-test
|
|
388 |
(testing "Compojure-style destructuring works as expected"
|
|
389 |
(let [test-request {:uri "/foo"
|
|
390 |
:params {:aa "aa"
|
|
391 |
:bb "bb"}}]
|
|
392 |
(testing "A single binding outside a vector is the whole request"
|
|
393 |
((routes->handler (ANY "/foo" request
|
|
394 |
(is (= test-request (select-keys request [:uri :params])))
|
|
395 |
"foo!")) test-request))
|
|
396 |
(testing "A vector binding called 'request' tries to bind to non-existent query param of the same name"
|
|
397 |
((routes->handler (ANY "/foo" [request]
|
|
398 |
(is (nil? request))
|
|
399 |
"foo!")) test-request))
|
|
400 |
(testing "A vector binding with two params binds as expected"
|
|
401 |
((routes->handler (ANY "/foo" [aa bb]
|
|
402 |
(is (= aa "aa"))
|
|
403 |
(is (= bb "bb"))
|
|
404 |
"foo!")) test-request))
|
|
405 |
(testing "A vector binding with two valid params, one invalid param and an ':as request' segment binds as expected"
|
|
406 |
((routes->handler (ANY "/foo" [aa bb cc :as request]
|
|
407 |
(is (= aa "aa"))
|
|
408 |
(is (= bb "bb"))
|
|
409 |
(is (nil? cc))
|
|
410 |
(is (= test-request (select-keys request [:uri :params])))
|
|
411 |
"foo!")) test-request)))))
|