From cb7ad5bc95ad505f92269b9ce816fa21c55ac411 Mon Sep 17 00:00:00 2001 From: Simon Belak <simon@metabase.com> Date: Sat, 29 Aug 2020 12:53:25 +0200 Subject: [PATCH] Field ordering: ignore non-active fields when validating (#13182) --- src/metabase/models/table.clj | 5 ++- test/metabase/models/table_test.clj | 56 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 test/metabase/models/table_test.clj diff --git a/src/metabase/models/table.clj b/src/metabase/models/table.clj index 01a8e8a7bc9..c03184de550 100644 --- a/src/metabase/models/table.clj +++ b/src/metabase/models/table.clj @@ -102,7 +102,10 @@ (defn- valid-field-order? "Field ordering is valid if all the fields from a given table are present and only from that table." [table field-ordering] - (= (db/select-ids Field :table_id (u/get-id table)) (set field-ordering))) + (= (db/select-ids Field + :table_id (u/get-id table) + :active true) + (set field-ordering))) (defn custom-order-fields! "Set field order to `field-order`." diff --git a/test/metabase/models/table_test.clj b/test/metabase/models/table_test.clj new file mode 100644 index 00000000000..a1f7b972308 --- /dev/null +++ b/test/metabase/models/table_test.clj @@ -0,0 +1,56 @@ +(ns metabase.models.table-test + (:require [clojure.java.jdbc :as jdbc] + [clojure.test :refer :all] + [metabase + [sync :as sync] + [test :as mt]] + [metabase.models.table :as table] + [metabase.test.data.one-off-dbs :as one-off-dbs])) + +(deftest valud-field-order?-test + (testing "A valid field ordering is a set IDs of all active fields in a given table" + (is (#'table/valid-field-order? (mt/id :venues) + [(mt/id :venues :name) + (mt/id :venues :category_id) + (mt/id :venues :latitude) + (mt/id :venues :longitude) + (mt/id :venues :price) + (mt/id :venues :id)]))) + (testing "Field ordering is invalid if some fields are missing" + (is (false? (#'table/valid-field-order? (mt/id :venues) + [(mt/id :venues :category_id) + (mt/id :venues :latitude) + (mt/id :venues :longitude) + (mt/id :venues :price) + (mt/id :venues :id)])))) + (testing "Field ordering is invalid if some fields are from a differnt table" + (is (false? (#'table/valid-field-order? (mt/id :venues) + [(mt/id :venues :name) + (mt/id :venues :category_id) + (mt/id :venues :latitude) + (mt/id :venues :longitude) + (mt/id :venues :price) + (mt/id :checkins :id)])))) + (testing "Only active fields should be considerd when checking field order" + (one-off-dbs/with-blank-db + (doseq [statement [ ;; H2 needs that 'guest' user for QP purposes. Set that up + "CREATE USER IF NOT EXISTS GUEST PASSWORD 'guest';" + ;; Keep DB open until we say otherwise :) + "SET DB_CLOSE_DELAY -1;" + ;; create table & load data + "DROP TABLE IF EXISTS \"BIRDS\";" + "CREATE TABLE \"BIRDS\" (\"SPECIES\" VARCHAR PRIMARY KEY, \"EXAMPLE_NAME\" VARCHAR);" + "GRANT ALL ON \"BIRDS\" TO GUEST;" + (str "INSERT INTO \"BIRDS\" (\"SPECIES\", \"EXAMPLE_NAME\") VALUES " + "('House Finch', 'Marshawn Finch'), " + "('California Gull', 'Steven Seagull'), " + "('Chicken', 'Colin Fowl');")]] + (jdbc/execute! one-off-dbs/*conn* [statement])) + (sync/sync-database! (mt/db)) + (is (#'table/valid-field-order? (mt/id :birds) + [(mt/id :birds :species) + (mt/id :birds :example_name)])) + (jdbc/execute! one-off-dbs/*conn* ["ALTER TABLE \"BIRDS\" DROP COLUMN \"EXAMPLE_NAME\";"]) + (sync/sync-database! (mt/db)) + (is (#'table/valid-field-order? (mt/id :birds) + [(mt/id :birds :species)]))))) -- GitLab