diff --git a/src/metabase/models/field_values.clj b/src/metabase/models/field_values.clj index 2cffb9b11342db9984d477b2951e83ee71260530..bca255ecb3e14577929741536e76731c56ab70c6 100644 --- a/src/metabase/models/field_values.clj +++ b/src/metabase/models/field_values.clj @@ -33,6 +33,7 @@ (contains? field :base_type) (contains? field :special_type)]} (and (not= (keyword field_type) :sensitive) + (not (contains? #{:DateField :DateTimeField :TimeField} (keyword base_type))) (or (contains? #{:category :city :state :country} (keyword special_type)) (= (keyword base_type) :BooleanField)))) diff --git a/test/metabase/models/field_test.clj b/test/metabase/models/field_test.clj index 05bb383ab55ad1cf11b88e23d78484e4f178e88c..84542e578c55d4f4b48b1c297438de4574503f58 100644 --- a/test/metabase/models/field_test.clj +++ b/test/metabase/models/field_test.clj @@ -5,6 +5,63 @@ [field-values :refer :all]) [metabase.test.data :refer :all])) + +;; field-should-have-field-values? + +;; sensitive fields should always be excluded +(expect false (field-should-have-field-values? {:base_type :BooleanField + :special_type :category + :field_type :sensitive})) +;; date/time based fields should always be excluded +(expect false (field-should-have-field-values? {:base_type :DateField + :special_type :category + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :DateTimeField + :special_type :category + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :TimeField + :special_type :category + :field_type :dimension})) +;; most special types should be excluded +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :image + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :id + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :fk + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :latitude + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :number + :field_type :dimension})) +(expect false (field-should-have-field-values? {:base_type :CharField + :special_type :timestamp_milliseconds + :field_type :dimension})) +;; boolean fields + category/city/state/country fields are g2g +(expect true (field-should-have-field-values? {:base_type :BooleanField + :special_type :number + :field_type :dimension})) +(expect true (field-should-have-field-values? {:base_type :CharField + :special_type :category + :field_type :dimension})) +(expect true (field-should-have-field-values? {:base_type :TextField + :special_type :city + :field_type :dimension})) +(expect true (field-should-have-field-values? {:base_type :TextField + :special_type :state + :field_type :dimension})) +(expect true (field-should-have-field-values? {:base_type :TextField + :special_type :country + :field_type :dimension})) + +;; NOT field_type = senstive +;; NOT base_type = date, datetime, time +;; (required) special_type = category, city, state, country OR base_type = boolean + ;; Check that setting a Field's special_type to :category will cause a corresponding FieldValues to be created asynchronously (expect [nil