diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index 0af10d0f3f..3bdaed2b88 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -423,38 +423,41 @@ (fn [{:keys [kind max min ordered] :as props} children _] (let [kind (or (last children) kind) - pred + child-pred (cond (fn? kind) kind (nil? kind) any? :else (validator kind)) + type-pred + (if ordered + d/ordered-set? + set?) + pred (cond (and max min) (fn [value] - (let [size (count value)] - (and (set? value) - (<= min size max) - (every? pred value)))) + (and (type-pred value) + (every? child-pred value) + (<= min (count value) max))) min (fn [value] - (let [size (count value)] - (and (set? value) - (<= min size) - (every? pred value)))) + (and (type-pred value) + (every? child-pred value) + (<= min (count value)))) max (fn [value] - (let [size (count value)] - (and (set? value) - (<= size max) - (every? pred value)))) + (and (type-pred value) + (every? child-pred value) + (<= (count value) max))) :else (fn [value] - (every? pred value))) + (and (type-pred value) + (every? child-pred value)))) empty-set (if ordered diff --git a/common/test/common_tests/schema_test.cljc b/common/test/common_tests/schema_test.cljc index bbb97bbcdd..2b8b98db6a 100644 --- a/common/test/common_tests/schema_test.cljc +++ b/common/test/common_tests/schema_test.cljc @@ -6,6 +6,7 @@ (ns common-tests.schema-test (:require + [app.common.data :as d] [app.common.schema :as sm] [app.common.schema.generators :as sg] [clojure.test :as t])) @@ -35,6 +36,77 @@ (t/is (true? (sm/validate schema #{}))) (t/is (false? (sm/validate schema #{"a"}))))) + (t/testing "validate 2" + (let [candidate-1 ["a@b.com" "a@c.net"] + candidate-2 (into #{} candidate-1) + candidate-3 (into (d/ordered-set) candidate-1) + candidate-4 #{"a@b.com"} + candidate-5 (d/ordered-set "a@b.com") + schema-1 [::sm/set ::sm/email] + schema-2 [::sm/set {:ordered true} ::sm/email] + schema-3 [::sm/set {:ordered true :min 1} ::sm/email] + schema-4 [::sm/set {:min 1} ::sm/email] + schema-5 [::sm/set {:ordered true :max 1} ::sm/email] + schema-6 [::sm/set {:ordered true :min 1 :max 2} ::sm/email] + schema-7 [::sm/set {:min 1 :max 2} ::sm/email]] + + (t/is (false? (sm/validate schema-1 []))) + (t/is (false? (sm/validate schema-1 candidate-1))) + (t/is (true? (sm/validate schema-1 candidate-2))) + (t/is (true? (sm/validate schema-1 candidate-3))) + + (t/is (false? (sm/validate schema-2 []))) + (t/is (false? (sm/validate schema-2 candidate-1))) + (t/is (false? (sm/validate schema-2 candidate-2))) + (t/is (true? (sm/validate schema-2 candidate-3))) + + (t/is (false? (sm/validate schema-3 []))) + (t/is (false? (sm/validate schema-3 candidate-1))) + (t/is (false? (sm/validate schema-3 candidate-2))) + (t/is (true? (sm/validate schema-3 candidate-3))) + (t/is (false? (sm/validate schema-3 candidate-4))) + (t/is (true? (sm/validate schema-3 candidate-5))) + (t/is (false? (sm/validate schema-3 (d/ordered-set)))) + + (t/is (false? (sm/validate schema-4 []))) + (t/is (false? (sm/validate schema-4 candidate-1))) + (t/is (true? (sm/validate schema-4 candidate-2))) + (t/is (true? (sm/validate schema-4 candidate-3))) + (t/is (true? (sm/validate schema-4 candidate-4))) + (t/is (true? (sm/validate schema-4 candidate-5))) + (t/is (false? (sm/validate schema-4 (d/ordered-set)))) + (t/is (false? (sm/validate schema-4 #{}))) + + (t/is (false? (sm/validate schema-5 []))) + (t/is (false? (sm/validate schema-5 candidate-1))) + (t/is (false? (sm/validate schema-5 candidate-2))) + (t/is (false? (sm/validate schema-5 candidate-3))) + (t/is (false? (sm/validate schema-5 candidate-4))) + (t/is (true? (sm/validate schema-5 candidate-5))) + (t/is (true? (sm/validate schema-5 (d/ordered-set)))) + (t/is (false? (sm/validate schema-5 #{}))) + + (t/is (false? (sm/validate schema-6 []))) + (t/is (false? (sm/validate schema-6 candidate-1))) + (t/is (false? (sm/validate schema-6 candidate-2))) + (t/is (true? (sm/validate schema-6 candidate-3))) + (t/is (false? (sm/validate schema-6 candidate-4))) + (t/is (true? (sm/validate schema-6 candidate-5))) + (t/is (false? (sm/validate schema-6 (d/ordered-set)))) + (t/is (false? (sm/validate schema-6 #{}))) + (t/is (false? (sm/validate schema-6 (conj candidate-3 "r@r.com")))) + + (t/is (false? (sm/validate schema-7 []))) + (t/is (false? (sm/validate schema-7 candidate-1))) + (t/is (true? (sm/validate schema-7 candidate-2))) + (t/is (true? (sm/validate schema-7 candidate-3))) + (t/is (true? (sm/validate schema-7 candidate-4))) + (t/is (true? (sm/validate schema-7 candidate-5))) + (t/is (false? (sm/validate schema-7 (d/ordered-set)))) + (t/is (false? (sm/validate schema-7 #{}))) + (t/is (false? (sm/validate schema-7 (conj candidate-2 "r@r.com")))) + (t/is (false? (sm/validate schema-7 (conj candidate-3 "r@r.com")))))) + (t/testing "generate" (let [schema [::sm/set ::sm/email] value (sg/generate schema)]