File: complete_test.clj

package info (click to toggle)
prismatic-schema-clojure 1.2.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 460 kB
  • sloc: sh: 40; makefile: 17
file content (61 lines) | stat: -rw-r--r-- 2,103 bytes parent folder | download | duplicates (4)
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
(ns schema.experimental.complete-test
  (:use clojure.test)
  (:require
   [schema.coerce :as coerce]
   [schema.core :as s]
   [schema.experimental.abstract-map :as abstract-map]
   [schema.experimental.complete :as complete]))

(deftest complete-test
  (let [s [{:a s/Int :b s/Str :c [s/Str]}]
        [r1 r2 r3 :as rs] (complete/complete [{:a 1} {:b "bob"} {:c ["foo" "bar"]}] s)]
    (is (not (s/check s rs)))
    (is (= (:a r1) 1))
    (is (= (:b r2) "bob"))
    (is (= (:c r3) ["foo" "bar"])))
  (testing "complete through variant"
    (let [s (s/cond-pre s/Str {:foo s/Int})]
      (is (= "test" (complete/complete "test" s)))
      (is (integer? (:foo (complete/complete {} s)))))))

(s/defschema Animal
  (abstract-map/abstract-map-schema
   :type
   {:name s/Str}))

(abstract-map/extend-schema Cat Animal [:cat] {:claws? s/Bool})
(abstract-map/extend-schema Dog Animal [:dog] {:barks? s/Bool})

(s/defrecord User
    [id :- long
     cash :- double
     friends :- [User]
     pet :- (s/maybe Animal)])

(def complete-user
  (complete/completer
   User
   {User (fn [x] (if (number? x) {:id x} x))
    Animal (fn [x] (if (keyword? x) {:type x} x))}))

(defn pull-pattern-matcher [s]
  (when (and (instance? clojure.lang.APersistentMap s)
             (not (s/find-extra-keys-schema s)))
    (fn [x]
      (select-keys x (->> s keys (map s/explicit-schema-key))))))

(defn pull [s x]
  ((coerce/coercer s pull-pattern-matcher) x))

(deftest fancy-complete-test
  (is (s/validate User (complete-user {})))
  (is (= {:id 2}
         (pull {:id long} (complete-user 2))))
  (is (= {:id 2 :pet {:type :cat}}
         (pull {:id s/Any :pet {:type s/Keyword}} (complete-user {:id 2 :pet :cat}))))
  (is (= {:id 10 :friends [{:id 2} {:id 3}]}
         (pull {:id s/Any :friends [{:id long}]}
               (complete-user {:id 10 :friends [2 {:id 3}]}))))
  (is (= {:id 10 :friends [{:id 2 :pet nil} {:id 3 :pet {:type :dog}}]}
         (pull {:id s/Any :friends [{:id long :pet (s/maybe {:type s/Keyword})}]}
               (complete-user {:id 10 :friends [{:id 2 :pet nil} {:id 3 :pet :dog}]})))))