File: test_execution_model.clj

package info (click to toggle)
liberator-clojure 0.15.3-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid, trixie
  • size: 436 kB
  • sloc: makefile: 18; sh: 2
file content (90 lines) | stat: -rw-r--r-- 3,670 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(ns test-execution-model
  (:use
   midje.sweet
   [ring.mock.request :only [request header]]
   [liberator.core :only [defresource resource]]
   [liberator.representation :only [ring-response]]))


(facts "truethy return values"
  (fact (-> (request :get "/")
             ((resource :exists? true)))
    => (contains {:status 200}))
  (fact (-> (request :get "/")
             ((resource :exists? 1)))
    => (contains {:status 200}))
  (fact "map merged with context"
    (-> (request :get "/")
        ((resource :exists? {:a 1}
                   :handle-ok #(ring-response %))))
    => (contains {:a 1}))
  (fact "vector and map merged with context"
    (-> (request :get "/")
        ((resource :exists? [true  {:a 1}]
                   :handle-ok #(ring-response %))))
    => (contains {:a 1 :status 200}))
  (fact "vector concated to context value"
    (-> (request :get "/")
        ((resource :service-available? {:a [1]}
                   :exists? {:a [2]}
                   :handle-ok #(ring-response %))))
    => (contains {:a [1 2] :status 200}))
  (fact "function returned as context is evaluated"
        (-> (request :get "/")
            ((resource :service-available? {:a [1]}
                       :exists? (fn [ctx] #(assoc ctx :a [2]))
                       :handle-ok #(ring-response %))))
        => (contains {:a [2] :status 200})))

(facts "falsey return values"
  (fact (-> (request :get "/")
             ((resource :exists? false)))
    => (contains {:status 404}))
  (fact (-> (request :get "/")
             ((resource :exists? nil)))
    => (contains {:status 404}))
  (fact "vector and map merged with context"
    (-> (request :get "/")
        ((resource :exists? [false {:a 1}]
                   :handle-not-found #(ring-response %))))
    => (contains {:a 1 :status 404})))

(facts "handler functions"
  (fact "handler is a function"
    (-> (request :get "/")
        ((resource :exists? false
                   :handle-not-found (fn [ctx] "not found"))))
    => (contains {:status 404 :body "not found"}))
  (fact "keyword as handler"
        (-> (request :get "/")
            ((resource :exists? {:some-key "foo"}
                       :handle-ok :some-key)))
        => (contains {:status 200 :body "foo"}))
  (fact "default handler uses message key"
        (-> (request :get "/")
            ((resource :exists? [false {:message "absent"}])))
        => (contains {:status 404 :body "absent"}))
  (fact "decisions can override status"
        (-> (request :get "/")
            ((resource :exists? [false {:status 444 :message "user defined status code"}])))
        => (contains {:status 444 :body "user defined status code"})))

(facts "context merge leaves nested objects intact (see #206)"
  (fact "using etag and if-match"
    (-> (request :put "/")
        (header "if-match" "\"1\"")
        ((resource :allowed-methods [:put]
                   :available-media-types ["application/edn"]
                   :malformed? [false {:my-entity {:deeply [:nested :object]}}]
                   :handle-created :my-entity
                   :etag "1")))
    => (contains {:status 201, :body "{:deeply [:nested :object]}"}))
  (fact "using if-unmodified-since"
    (-> (request :put "/")
        (header "if-unmodified-since" "Tue, 15 Nov 1994 12:45:26 GMT")
        ((resource :allowed-methods [:put]
                   :available-media-types ["application/edn"]
                   :malformed? [false {:my-entity {:deeply [:nested :object]}}]
                   :handle-created :my-entity
                   :last-modified (java.util.Date. 0))))
    => (contains {:status 201, :body "{:deeply [:nested :object]}"})))