You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
8.2 KiB
207 lines
8.2 KiB
(ns formulare.core-test
|
|
(:require [clojure.test :refer :all]
|
|
[formulare.core :refer :all]
|
|
[clojure.string :refer [starts-with?]]
|
|
[clojure.spec.alpha :as spec]))
|
|
|
|
|
|
(deftest test-form-data
|
|
(testing "no from-req is given"
|
|
(let [def {:fields {:name {:label ""
|
|
:required false
|
|
:spec :a}}}]
|
|
(is (= {:name "a"}
|
|
(form-data def {:params {:name "a"}})))
|
|
(is (= {:name nil}
|
|
(form-data def {:params {}})))))
|
|
(testing "from-req is called"
|
|
(let [def {:fields {:name {:label ""
|
|
:required false
|
|
:spec :a
|
|
:from-req #(str "foo" %)}}}]
|
|
(is (= {:name "foo"}
|
|
(form-data def {:params {}})))
|
|
(is (= {:name "fooa"}
|
|
(form-data def {:params {:name "a"}})))))
|
|
(testing "from-req is given in one field, not in another"
|
|
(let [def {:fields {:foo {:label ""
|
|
:spec number?
|
|
:from-req bigint}
|
|
:bar {:label ""
|
|
:spec string?}}}]
|
|
(is (= {:foo 5
|
|
:bar "a"}
|
|
(form-data def {:params {:foo "5"
|
|
:bar "a"}})))))
|
|
(testing "type conversion"
|
|
(let [def {:fields {:foo {:label ""
|
|
:required false
|
|
:spec :a
|
|
:from-req bigint}}}]
|
|
(is (= {:foo 5}
|
|
(form-data def {:params {:foo 5}}))))))
|
|
|
|
(deftest test-valid?
|
|
(testing "required-key does not change validity of the form"
|
|
(let [def {:fields {:name {:label ""
|
|
:spec nil?
|
|
:required true}}}]
|
|
(is (= true (valid? def {:params {:name nil}}))))
|
|
(let [def {:fields {:name {:label ""
|
|
:spec nil?
|
|
:required false}}}]
|
|
(is (= true (valid? def {:params {:name nil}})))))
|
|
(testing "converted values are passed to spec"
|
|
(let [def {:fields {:foo {:label ""
|
|
:spec number?
|
|
:from-req bigint}
|
|
:bar {:label ""
|
|
:spec string?}}}]
|
|
(is (= true (valid? def {:params {:foo "5"
|
|
:bar "a"}}))))))
|
|
|
|
(deftest test-render-widgets
|
|
(testing "form-hash is rendered"
|
|
(let [def {:fields {}}]
|
|
(is (= (list [:input {:type "hidden"
|
|
:name "__form-hash"
|
|
:id "__form-hash"
|
|
:value (form-hash def {})}])
|
|
(rest (render-widgets def {} {}))))))
|
|
(testing "anti-forgery-field is rendered"
|
|
(let [def {:fields {}}]
|
|
(is (starts-with? (first (render-widgets def {} {}))
|
|
(str "<input id=\"__anti-forgery-token\""
|
|
" name=\"__anti-forgery-token\""
|
|
" type=\"hidden\"")))))
|
|
(testing "input is rendered correctly"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:widget :input}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:input {:id "foo-id"
|
|
:name "foo-id"
|
|
:required false
|
|
:type "text"
|
|
:value nil}])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:required true
|
|
:widget :input}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:input {:id "foo-id"
|
|
:name "foo-id"
|
|
:required true
|
|
:type "text"
|
|
:value nil}])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))
|
|
(testing "input is default"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:required true}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:input {:id "foo-id"
|
|
:name "foo-id"
|
|
:required true
|
|
:type "text"
|
|
:value nil}])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))))
|
|
(testing "checkbox is rendered correctly"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:widget :checkbox}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:input {:id "foo-id"
|
|
:name "foo-id"
|
|
:checked false
|
|
:type "checkbox"
|
|
:value nil}])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:required true
|
|
:widget :checkbox}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:input {:id "foo-id"
|
|
:name "foo-id"
|
|
:checked false
|
|
:type "checkbox"
|
|
:value nil}])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2))))))
|
|
(testing "textarea is rendered correctly"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:widget :textarea}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:textarea {:id "foo-id"
|
|
:name "foo-id"
|
|
:required false}
|
|
""])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:required true
|
|
:widget :textarea}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:textarea {:id "foo-id"
|
|
:name "foo-id"
|
|
:required true}
|
|
""])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2))))))
|
|
(testing "select is rendered correctly"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:widget :select
|
|
:options [["value1" "key1"]
|
|
["value2" "key2"]]}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:select {:id "foo-id"
|
|
:name "foo-id"}
|
|
(list
|
|
[:option {:value "key1" :selected false} "value1"]
|
|
[:option {:value "key2" :selected false} "value2"])])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2))))))
|
|
(testing "mselect is rendered correctly"
|
|
(let [def {:fields {:foo-id {:label "foo-label"
|
|
:widget :mselect
|
|
:options [["value1" "key1"]
|
|
["value2" "key2"]]}}}]
|
|
(is (= (list nil
|
|
[:label {:for "foo-id"} "foo-label"]
|
|
[:select {:id "foo-id"
|
|
:name "foo-id"
|
|
:size 5
|
|
:multiple "multiple"}
|
|
(list
|
|
[:option {:value "key1" :selected false} "value1"]
|
|
[:option {:value "key2" :selected false} "value2"])])
|
|
(first
|
|
(nthrest
|
|
(render-widgets def {} {})
|
|
2)))))))
|