Skip to content
Snippets Groups Projects
Unverified Commit 863b2ad4 authored by Case Nelson's avatar Case Nelson Committed by GitHub
Browse files

[MLv2] Macro for testing against a number of similar shaped but differently...

[MLv2] Macro for testing against a number of similar shaped but differently built queries at once (#33766)

* [MLv2] Macro for testing against a number of similar shaped but differently built queries at once

* Address review comments, add missing kondo hook

* Fix macros in cljs
parent 72769e07
No related branches found
No related tags found
No related merge requests found
......@@ -590,6 +590,7 @@
metabase.driver.bigquery-cloud-sdk-test/calculate-bird-scarcity hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
metabase.lib.test-util.macros/$ids hooks.metabase.test.data/$ids
metabase.lib.test-util.macros/mbql-query hooks.metabase.test.data/mbql-query
metabase.lib.test-util.macros/with-testing-against-standard-queries hooks.metabase.lib.test-util.macros/with-testing-against-standard-queries
metabase.mbql.schema.macros/defclause hooks.metabase.mbql.schemas.macros/defclause
metabase.models.collection-test/with-collection-hierarchy hooks.common/let-one-with-optional-value
metabase.models.collection-test/with-personal-and-impersonal-collections hooks.common/with-two-bindings
......
(ns hooks.metabase.lib.test-util.macros
(:require [clj-kondo.hooks-api :as hooks]))
(defn with-testing-against-standard-queries [{{[_ & args] :children} :node}]
(let [[query-sym & body] args
node* (hooks/list-node
(list*
(hooks/token-node 'let)
(hooks/vector-node
[query-sym (hooks/token-node 'nil)])
body))]
{:node node*}))
......@@ -6,7 +6,8 @@
[metabase.lib.core :as lib]
[metabase.lib.options :as lib.options]
[metabase.lib.test-metadata :as meta]
[metabase.lib.test-util :as lib.tu]))
[metabase.lib.test-util :as lib.tu]
[metabase.lib.test-util.macros :as lib.tu.macros]))
#?(:cljs (comment metabase.test-runner.assert-exprs.approximately-equal/keep-me))
......@@ -26,19 +27,20 @@
(lib/order-bys))))))
(deftest ^:parallel remove-clause-filters-test
(let [query (-> lib.tu/venues-query
(lib/filter (lib/= (meta/field-metadata :venues :price) 4))
(lib/filter (lib/= (meta/field-metadata :venues :name) "x")))
filters (lib/filters query)]
(is (= 2 (count filters)))
(is (= 1 (-> query
(lib/remove-clause (first filters))
(lib/filters)
count)))
(is (nil? (-> query
(lib/remove-clause (first filters))
(lib/remove-clause (second filters))
(lib/filters))))))
(lib.tu.macros/with-testing-against-standard-queries query
(let [query (-> query
(lib/filter (lib/= (meta/field-metadata :venues :price) 4))
(lib/filter (lib/= (meta/field-metadata :venues :name) "x")))
filters (lib/filters query)]
(is (= 2 (count filters)))
(is (= 1 (-> query
(lib/remove-clause (first filters))
(lib/filters)
count)))
(is (nil? (-> query
(lib/remove-clause (first filters))
(lib/remove-clause (second filters))
(lib/filters)))))))
(deftest ^:parallel remove-clause-join-conditions-test
(let [query (-> lib.tu/venues-query
......
(ns metabase.lib.test-util.macros
(:require
[clojure.test :refer [testing]]
[metabase.lib.test-util.macros.impl :as lib.tu.macros.impl]
[metabase.test.data.mbql-query-impl :as mbql-query-impl]))
......@@ -33,3 +34,47 @@
(mbql-query-impl/parse-tokens table-name <>)
(mbql-query-impl/maybe-add-source-table <> table-name)
(mbql-query-impl/wrap-inner-query <>)))))
(defmacro with-testing-against-standard-queries
"Tests against a number of named expressions that all produce the same columns through different methods."
[sym & body]
`(let [queries# [:query-with-implicit-joins
(-> (lib/query meta/metadata-provider (meta/table-metadata :orders))
(lib/append-stage))
:query-with-explicit-table-joins
(-> (lib/query meta/metadata-provider (meta/table-metadata :orders))
(lib/join (meta/table-metadata :people))
(lib/join (meta/table-metadata :products))
(lib/append-stage))
:query-with-explicit-sub-query-joins
(-> (lib/query meta/metadata-provider (meta/table-metadata :orders))
(lib/join (lib/join-clause (lib/query meta/metadata-provider (meta/table-metadata :people))))
(lib/join (lib/join-clause (lib/query meta/metadata-provider (meta/table-metadata :products))))
(lib/append-stage))
:query-with-table-joins-from-cards
(-> (lib/query meta/metadata-provider (meta/table-metadata :orders))
(lib/join (lib/join-clause (lib.tu/query-with-stage-metadata-from-card
meta/metadata-provider
(lib.tu/mock-cards :people))
[(lib/= (meta/field-metadata :orders :user-id)
(meta/field-metadata :people :id))]))
(lib/join (lib/join-clause (lib.tu/query-with-stage-metadata-from-card
meta/metadata-provider
(lib.tu/mock-cards :products))
[(lib/= (meta/field-metadata :orders :product-id)
(meta/field-metadata :products :id))]))
(lib/append-stage))
:query-with-source-card-joins
(-> (lib/query lib.tu/metadata-provider-with-mock-cards (meta/table-metadata :orders))
(lib/join (lib/join-clause (lib.tu/mock-cards :people)
[(lib/= (meta/field-metadata :orders :user-id)
(meta/field-metadata :people :id))]))
(lib/join (lib/join-clause (lib.tu/mock-cards :products)
[(lib/= (meta/field-metadata :orders :product-id)
(meta/field-metadata :products :id))]))
(lib/append-stage))]]
(testing "Against set of standard queries."
(doseq [[idx# [query-name# q#]] (map-indexed vector (partition-all 2 queries#))
:let [~(symbol sym) q#]]
(testing (str query-name# " (" idx# ")")
~@body)))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment