Files
df-research/malli/test/malli/dot_test.cljc
2026-02-08 11:20:43 -10:00

86 lines
3.7 KiB
Clojure
Vendored

(ns malli.dot-test
(:require [clojure.string :as str]
[clojure.test :refer [deftest is]]
[malli.dot :as md]))
(def Order
[:schema
{:registry {"Country" [:map
[:name [:enum :FI :PO]]
[:neighbors [:vector [:ref "Country"]]]]
"Burger" [:map
[:name string?]
[:description {:optional true} string?]
[:origin [:maybe "Country"]]
[:price pos-int?]]
"OrderLine" [:map
[:burger "Burger"]
[:amount int?]]
"Order" [:map
[:lines [:vector "OrderLine"]]
[:delivery [:map
[:delivered boolean?]
[:address [:map
[:street string?]
[:zip int?]
[:country "Country"]]]]]]}}
"Order"])
(defn trimmed= [s1 s2]
(letfn [(trim [x] (str/trim (str/replace x #"\s+" " ")))]
(= (trim s1) (trim s2))))
(deftest transform-test
(is (trimmed=
"digraph {
node [shape=\"record\", style=\"filled\", color=\"#000000\"]
edge [dir=\"back\", arrowtail=\"none\"]
\":malli.dot/schema\" [label=\"{:malli.dot/schema|[:enum \\{:title \\\"enum\\\"\\} \\\"S\\\" \\\"M\\\" \\\"L\\\"]\\l}\", fillcolor=\"#fff0cd\"]
}"
(md/transform
[:enum {:title "enum"} "S" "M" "L"])))
(is (trimmed=
"digraph {
node [shape=\"record\", style=\"filled\", color=\"#000000\"]
edge [dir=\"back\", arrowtail=\"none\"]
\":malli.dot/schema\" [label=\"{:malli.dot/schema|:x :string\\l}\", fillcolor=\"#fff0cd\"]
}"
(md/transform
[:map {:x 1}
[:x {:x 1} :string]])))
(is (trimmed=
"digraph {
node [shape=\"record\", style=\"filled\", color=\"#000000\"]
edge [dir=\"back\", arrowtail=\"none\"]
\"Burger\" [label=\"{Burger|:name string?\\l:description string?\\l:origin [:maybe \\\"Country\\\"]\\l:price pos-int?\\l}\", fillcolor=\"#fff0cd\"]
\"Country\" [label=\"{Country|:name [:enum :FI :PO]\\l:neighbors [:vector [:ref \\\"Country\\\"]]\\l}\", fillcolor=\"#fff0cd\"]
\"Order\" [label=\"{Order|:lines [:vector \\\"OrderLine\\\"]\\l:delivery Order$Delivery\\l}\", fillcolor=\"#fff0cd\"]
\"Order$Delivery\" [label=\"{Order$Delivery|:delivered boolean?\\l:address Order$Delivery$Address\\l}\", fillcolor=\"#e6caab\"]
\"Order$Delivery$Address\" [label=\"{Order$Delivery$Address|:street string?\\l:zip int?\\l:country Country\\l}\", fillcolor=\"#e6caab\"]
\"OrderLine\" [label=\"{OrderLine|:burger Burger\\l:amount int?\\l}\", fillcolor=\"#fff0cd\"]
\"Burger\" -> \"Country\" [arrowtail=\"odiamond\"]
\"Country\" -> \"Country\" [arrowtail=\"odiamond\"]
\"Order\" -> \"OrderLine\" [arrowtail=\"odiamond\"]
\"Order\" -> \"Order$Delivery\" [arrowtail=\"diamond\"]
\"Order$Delivery\" -> \"Order$Delivery$Address\" [arrowtail=\"diamond\"]
\"Order$Delivery$Address\" -> \"Country\" [arrowtail=\"odiamond\"]
\"OrderLine\" -> \"Burger\" [arrowtail=\"odiamond\"]
}"
(md/transform Order)))
(is (trimmed=
"digraph {
node [shape=\"record\", style=\"filled\", color=\"#000000\"]
edge [dir=\"back\", arrowtail=\"none\"]
\":malli.dot/schema\" [label=\"{:malli.dot/schema|[:and int? [:\\< 100]]\\l}\", fillcolor=\"#fff0cd\"]
}"
(md/transform [:and int? [:< 100]]))))