-
Notifications
You must be signed in to change notification settings - Fork 0
/
json_test.cljc
53 lines (48 loc) · 2.22 KB
/
json_test.cljc
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
(ns wing.malli.json-test
(:require [wing.malli.json :as sut]
#?(:clj [clojure.test :as t :refer [deftest testing is]]
:cljs [cljs.test :as t :refer [deftest testing is] :include-macros true])
[malli.core :as m]
[malli.generator :as mg]
[cuerdas.core :as str]
[wing.malli :as wm]))
(def person-schema
[:map
[:person/name string?]
[:person/age pos-int?]
[:person/eye-color (wm/enum-keyword #{:color/blue :color/green :color/blue-green})]
[:person/nickname {:json/key "alias"} string?]
[:person.personality/charisma pos-int?]
[:pet/name string?]])
(deftest encoder+decoder-test
(let [person->json (m/encoder person-schema (sut/transformer))
json->person (m/decoder person-schema (sut/transformer))
data (mg/generate person-schema)]
(testing "round-trip"
(is (= data
(-> data person->json json->person))))
(testing "decoding maps"
(is (= {:person/name "Bob"
:person/age 35
:person/nickname "Robert"
:person/eye-color :color/blue-green
:person.personality/charisma 50
:pet/name "Rupert"}
(json->person {"name" "Bob"
"alias" "Robert"
"age" 35
"personality_charisma" 50
"eye_color" "blue_green"
"pet_name" "Rupert"}))))
(testing "custom string functions"
(let [opts {:json/encode-map-key str/camel
:json/encode-enum str/camel}
transformer (sut/transformer)
person->json (m/encoder person-schema opts transformer)
json->person (m/decoder person-schema opts transformer)
data (assoc data :person/eye-color :color/blue-green)
encoded (person->json data)
decoded (json->person encoded)]
(is (= data decoded))
(is (contains? encoded "petName"))
(is (= "blueGreen" (get encoded "eyeColor")))))))