diff --git a/docs/administration-guide/01-managing-databases.md b/docs/administration-guide/01-managing-databases.md index ffd6f38d51ee0bbf6d7f97aa32b4f94f325ba77f..803987a49bcf867806d015e7343422dbbde4c4bf 100644 --- a/docs/administration-guide/01-managing-databases.md +++ b/docs/administration-guide/01-managing-databases.md @@ -88,6 +88,70 @@ You can also delete a database from the database list: hover over the row with t **Caution: Deleting a database is irreversible! All saved questions and dashboard cards based on the database will be deleted as well!** +### SSH Tunneling In Metabase +--- +Metabase has the ability to connect to some databases by first establishing a connection to a server in between Metabase and a data warehouse, then connect to the data warehouse using that connection as a bridge. This makes connecting to some data warehouses possible in situations that would otherwise prevent the use of Metabase. + + +#### When To Use This Feature +There are two basic cases for using an SSH tunnel rather than connecting directly: + +* A direct connection is impossible +* A direct connection is forbidden due to a security policy + +Sometimes when a data warehouse is inside an enterprise environment, direct connections are blocked by security devices such as firewalls and intrusion prevention systems. To work around this many enterprises offer a VPN, a bastion host, or both. VPNs are the more convenient and reliable option though bastion hosts are used frequently, especially with cloud providers such as Amazon Web Services where VPC (Virtual Private Clouds) don't allow direct connections. Bastion hosts offer the option to first connect to a computer on the edge of the protected network, then from that computer establish a second connection to the data warehouse on the internal network and essentially patch these two connestions together. Using the SSH tunneling feature, Metabase is able to automate this process in many cases. If a VPN is available that should be used in preference to SSH tunneling. + +#### How To Use This Feature + +When connecting though a bastion host: + +* Answer yes to the "Use an SSH-tunnel for database connections" parameter +* Enter the hostname for the data warehouse as it is seen from inside the network in the `Host` parameter. +* Enter the data warehouse port as seen from inside the network into the `Port` parameter. +* Enter the extenal name of the bastion host as seen from the outside of the network (or wherever you are) into the `SSH tunnel host` parameter. +* Enter the ssh port as seen from outside the network into the `SSH tunnel port` parameter. This is usually 22, regardless of which data warehouse you are connecting to. +* Enter the username and password you use to login to the bastion host into the `SSH tunnel username` and `SSH tunnel password` parameters. + +If you are unable to connect test your ssh credentials by connecting to the SSH server/Bastion Host using ssh directly: + + ssh <SSH tunnel username>@<SSH tunnel host> -p <SSH tunnel port> + + +Another common case where direct connections are not possible is when connecting to a data warehouse that is only accessible locally and does not allow remote connections. In this case you will be opening an SSH connection to the data warehouse, then from there connecting back to the same computer. + +* Answer yes to the "Use an SSH-tunnel for database connections" parameter +* Enter `localhost` in the `Host` parameter. This is the name the server +* Enter the same value in the `Port` parameter that you would use if you where sitting directly at the data warehouse host system. +* Enter the extenal name of the data warehouse, as seen from the outside of the network (or wherever you are) into the `SSH tunnel host` parameter. +* Enter the ssh port as seen from outside the network into the `SSH tunnel port` parameter. This is usually 22, regardless of which data warehouse you are connecting to. +* Enter the username and password you use to login to the bastion host into the `SSH tunnel username` and `SSH tunnel password` parameters. + +If you have problems connecting verify the ssh host port and password by connecing manually using ssh or PuTTY on older windows systems. + +#### Disadvantages to Indirect Connections + +While using an ssh tunnel makes it possible to use a data warehouse that is otherwise not accessible it is almost always preferable to use a direct connection when possible: + +There are several inherent limitations to connecting through a tunnel: + +* If the enclosing SSH connection is closed because you put your computer to sleep or change networks, all established connections will be closed as well. This can cause delays resuming connections after suspending your laptop +* It's almost always slower. The connection has to go through an additional computer. +* Opening new connections takes longer. SSH connections are slower to establish then direct connections. +* Multiple operations over the same SSH tunnel can block each other. This can increase latency in some cases. +* The number of connections through a bastion host is often limited by organizational policy. +* Some organizations have IT security policies forbidding using SSH tunnels to bypass security perimeters. + +#### What if The Built in SSH Tunnels Don't Fit My Needs? + +This feature exists as a convenient wrapper around SSH and automates the common cases of connecting through a tunnel. It also makes connecting possible from systems that don't have or allow shell access. Metabase uses a built in SSH client that does not depend on the installed system's ssh client. This allows connecting from systems where it's not possible to run SSH manually, it also means that Metabase cannot take advantage of authentication services provided by the system such as Windows Domain Authentication or Kerberos Authentication. + +If you need to connect using a method not enabled by Metabase, you can often accomplish this by running ssh directly: + + ssh -Nf -L input-port:internal-server-name:port-on-server username@bastion-host.domain.com + +This allows you to use the full array of features included in ssh. If you find yourself doing this often, please let us know so we can see about making your process more convenient through Metabase. + + --- ## Next: enabling features that send email diff --git a/docs/administration-guide/02-setting-up-email.md b/docs/administration-guide/03-setting-up-email.md similarity index 100% rename from docs/administration-guide/02-setting-up-email.md rename to docs/administration-guide/03-setting-up-email.md diff --git a/frontend/src/metabase/components/DatabaseDetailsForm.jsx b/frontend/src/metabase/components/DatabaseDetailsForm.jsx index 65bf744eafab904554bfd95945ef94c3b32ba8ee..38e331696a3dac5d8d135d834aba465c9661e204 100644 --- a/frontend/src/metabase/components/DatabaseDetailsForm.jsx +++ b/frontend/src/metabase/components/DatabaseDetailsForm.jsx @@ -23,6 +23,8 @@ const CREDENTIALS_URL_PREFIXES = { googleanalytics: 'https://console.developers.google.com/apis/credentials/oauthclient?project=', }; +const isTunnelField = (field) => /^tunnel-/.test(field.name); + /** * This is a form for capturing database details for a given `engine` supplied via props. * The intention is to encapsulate the entire <form> with standard MB form styling and allow a callback @@ -61,7 +63,10 @@ export default class DatabaseDetailsForm extends Component { // go over individual fields for (let field of engines[engine]['details-fields']) { - if (field.required && isEmpty(details[field.name])) { + // tunnel fields aren't required if tunnel isn't enabled + if (!details["tunnel-enabled"] && isTunnelField(field)) { + continue; + } else if (field.required && isEmpty(details[field.name])) { valid = false; break; } @@ -146,7 +151,29 @@ export default class DatabaseDetailsForm extends Component { let { engine } = this.props; window.ENGINE = engine; - if (field.name === "is_full_sync") { + if (field.name === "tunnel-enabled") { + let on = (this.state.details["tunnel-enabled"] == undefined) ? false : this.state.details["tunnel-enabled"]; + return ( + <FormField key={field.name} fieldName={field.name}> + <div className="flex align-center Form-offset"> + <div className="Grid-cell--top"> + <Toggle value={on} onChange={(val) => this.onChange("tunnel-enabled", val)}/> + </div> + <div className="px2"> + <h3>Use an SSH-tunnel for database connections</h3> + <div style={{maxWidth: "40rem"}} className="pt1"> + Some database installations can only be accessed by connecting through an SSH bastion host. + This option also provides an extra layer of security when a VPN is not available. + Enabling this is usually slower than a dirrect connection. + </div> + </div> + </div> + </FormField> + ) + } else if (isTunnelField(field) && !this.state.details["tunnel-enabled"]) { + // don't show tunnel fields if tunnel isn't enabled + return null; + } else if (field.name === "is_full_sync") { let on = (this.state.details.is_full_sync == undefined) ? true : this.state.details.is_full_sync; return ( <FormField key={field.name} fieldName={field.name}> diff --git a/project.clj b/project.clj index f972daf60dc0175ebe9ae6ca40f91f24c996eab1..c3106d3e23277486688f276506f7fad11b1cba50 100644 --- a/project.clj +++ b/project.clj @@ -46,6 +46,7 @@ "v3-rev139-1.22.0"] [com.google.apis/google-api-services-bigquery ; Google BigQuery Java Client Library "v2-rev342-1.22.0"] + [com.jcraft/jsch "0.1.54"] ; SSH client for tunnels [com.h2database/h2 "1.4.194"] ; embedded SQL database [com.mattbertolini/liquibase-slf4j "2.0.0"] ; Java Migrations lib [com.mchange/c3p0 "0.9.5.2"] ; connection pooling library diff --git a/reset_password/metabase/reset_password/core.clj b/reset_password/metabase/reset_password/core.clj index 510adf2a331102750cd1a5a8ccc3f54782d3249a..3940a7dbc27693edbc87249b7289c3f334c692dd 100644 --- a/reset_password/metabase/reset_password/core.clj +++ b/reset_password/metabase/reset_password/core.clj @@ -1,8 +1,8 @@ (ns metabase.reset-password.core (:gen-class) - (:require [toucan.db :as db] - [metabase.db :as mdb] - [metabase.models.user :as user])) + (:require [metabase.db :as mdb] + [metabase.models.user :as user] + [toucan.db :as db])) (defn- set-reset-token! "Set and return a new `reset_token` for the user with EMAIL-ADDRESS." diff --git a/sample_dataset/metabase/sample_dataset/generate.clj b/sample_dataset/metabase/sample_dataset/generate.clj index 50bd431ce21ea4db945264236063c992fae29c91..d7cfe9cbe996de64d622ff15a3bbce814999c292 100644 --- a/sample_dataset/metabase/sample_dataset/generate.clj +++ b/sample_dataset/metabase/sample_dataset/generate.clj @@ -1,15 +1,17 @@ (ns metabase.sample-dataset.generate "Logic for generating the sample dataset. Run this with `lein generate-sample-dataset`." - (:require (clojure.java [io :as io] - [jdbc :as jdbc]) + (:require [clojure.java + [io :as io] + [jdbc :as jdbc]] [clojure.math.numeric-tower :as math] [clojure.string :as s] - (faker [address :as address] - [company :as company] - [lorem :as lorem] - [internet :as internet] - [name :as name]) + [faker + [address :as address] + [company :as company] + [internet :as internet] + [lorem :as lorem] + [name :as name]] [incanter.distributions :as dist] [metabase.db.spec :as dbspec] [metabase.util :as u]) diff --git a/src/metabase/driver.clj b/src/metabase/driver.clj index cb9ac18032bdc9cc1662e9987afc9eea63d3323d..80a4ff3bc61e8d445519c40c5af83f2af8784799 100644 --- a/src/metabase/driver.clj +++ b/src/metabase/driver.clj @@ -32,7 +32,9 @@ (def ^:const connection-error-messages "Generic error messages that drivers should return in their implementation of `humanize-connection-error-message`." - {:cannot-connect-check-host-and-port "Hmm, we couldn't connect to the database. Make sure your host and port settings are correct." + {:cannot-connect-check-host-and-port "Hmm, we couldn't connect to the database. Make sure your host and port settings are correct" + :ssh-tunnel-auth-fail "We couldn't connect to the ssh tunnel host. Check the username, password" + :ssh-tunnel-connection-fail "We couldn't connect to the ssh tunnel host. Check the hostname and port" :database-name-incorrect "Looks like the database name is incorrect." :invalid-hostname "It looks like your host is invalid. Please double-check it and try again." :password-incorrect "Looks like your password is incorrect." diff --git a/src/metabase/driver/druid.clj b/src/metabase/driver/druid.clj index 1ab5281208d07a006b326cee262abc06fb085c90..bae048ff55b4e2b89bf0dbd2ee739f8f094aa59f 100644 --- a/src/metabase/driver/druid.clj +++ b/src/metabase/driver/druid.clj @@ -10,7 +10,8 @@ [metabase.models [field :as field] [table :as table]] - [metabase.sync-database.analyze :as analyze])) + [metabase.sync-database.analyze :as analyze] + [metabase.util.ssh :as ssh])) ;;; ### Request helper fns @@ -30,8 +31,8 @@ (do-request http/get \"http://my-json-api.net\")" [request-fn url & {:as options}] {:pre [(fn? request-fn) (string? url)]} - (let [options (cond-> (merge {:content-type "application/json"} options) - (:body options) (update :body json/generate-string)) + (let [options (cond-> (merge {:content-type "application/json"} options) + (:body options) (update :body json/generate-string)) {:keys [status body]} (request-fn url options)] (when (not= status 200) (throw (Exception. (format "Error [%d]: %s" status body)))) @@ -53,16 +54,17 @@ (defn- do-query [details query] {:pre [(map? query)]} - (try (vec (POST (details->url details "/druid/v2"), :body query)) - (catch Throwable e - ;; try to extract the error - (let [message (or (u/ignore-exceptions - (:error (json/parse-string (:body (:object (ex-data e))) keyword))) - (.getMessage e))] + (ssh/with-ssh-tunnel [details-with-tunnel details] + (try (vec (POST (details->url details-with-tunnel "/druid/v2"), :body query)) + (catch Throwable e + ;; try to extract the error + (let [message (or (u/ignore-exceptions + (:error (json/parse-string (:body (:object (ex-data e))) keyword))) + (.getMessage e))] - (log/error (u/format-color 'red "Error running query:\n%s" message)) - ;; Re-throw a new exception with `message` set to the extracted message - (throw (Exception. message e)))))) + (log/error (u/format-color 'red "Error running query:\n%s" message)) + ;; Re-throw a new exception with `message` set to the extracted message + (throw (Exception. message e))))))) ;;; ### Sync @@ -76,24 +78,24 @@ :type/Text)}) (defn- describe-table [database table] - (let [details (:details database) - {:keys [dimensions metrics]} (GET (details->url details "/druid/v2/datasources/" (:name table) "?interval=1900-01-01/2100-01-01"))] - {:schema nil - :name (:name table) - :fields (set (concat - ;; every Druid table is an event stream w/ a timestamp field - [{:name "timestamp" - :base-type :type/DateTime - :pk? true}] - (map (partial describe-table-field :dimension) dimensions) - (map (partial describe-table-field :metric) metrics)))})) + (ssh/with-ssh-tunnel [details-with-tunnel (:details database)] + (let [{:keys [dimensions metrics]} (GET (details->url details-with-tunnel "/druid/v2/datasources/" (:name table) "?interval=1900-01-01/2100-01-01"))] + {:schema nil + :name (:name table) + :fields (set (concat + ;; every Druid table is an event stream w/ a timestamp field + [{:name "timestamp" + :base-type :type/DateTime + :pk? true}] + (map (partial describe-table-field :dimension) dimensions) + (map (partial describe-table-field :metric) metrics)))}))) (defn- describe-database [database] {:pre [(map? (:details database))]} - (let [details (:details database) - druid-datasources (GET (details->url details "/druid/v2/datasources"))] - {:tables (set (for [table-name druid-datasources] - {:schema nil, :name table-name}))})) + (ssh/with-ssh-tunnel [details-with-tunnel (:details database)] + (let [druid-datasources (GET (details->url details-with-tunnel "/druid/v2/datasources"))] + {:tables (set (for [table-name druid-datasources] + {:schema nil, :name table-name}))}))) ;;; ### field-values-lazy-seq @@ -163,13 +165,14 @@ :analyze-table analyze-table :describe-database (u/drop-first-arg describe-database) :describe-table (u/drop-first-arg describe-table) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "http://localhost"} - {:name "port" - :display-name "Broker node port" - :type :integer - :default 8082}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "http://localhost"} + {:name "port" + :display-name "Broker node port" + :type :integer + :default 8082}])) :execute-query (fn [_ query] (qp/execute-query do-query query)) :features (constantly #{:basic-aggregations :set-timezone :expression-aggregations}) :field-values-lazy-seq (u/drop-first-arg field-values-lazy-seq) diff --git a/src/metabase/driver/generic_sql.clj b/src/metabase/driver/generic_sql.clj index 2eedae05f22be37cd57e374a6bc307d262ddc7c3..d209d86e38a08dcf605b2beede3744e67327e3dd 100644 --- a/src/metabase/driver/generic_sql.clj +++ b/src/metabase/driver/generic_sql.clj @@ -16,7 +16,9 @@ [field :as field] [table :as table]] [metabase.sync-database.analyze :as analyze] - [metabase.util.honeysql-extensions :as hx]) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]]) (:import [clojure.lang Keyword PersistentVector] com.mchange.v2.c3p0.ComboPooledDataSource [java.sql DatabaseMetaData ResultSet] @@ -141,13 +143,15 @@ "Create a new C3P0 `ComboPooledDataSource` for connecting to the given DATABASE." [{:keys [id engine details]}] (log/debug (u/format-color 'magenta "Creating new connection pool for database %d ..." id)) - (let [spec (connection-details->spec (driver/engine->driver engine) details)] - (db/connection-pool (assoc spec - :minimum-pool-size 1 - ;; prevent broken connections closed by dbs by testing them every 3 mins - :idle-connection-test-period (* 3 60) - ;; prevent overly large pools by condensing them when connections are idle for 15m+ - :excess-timeout (* 15 60))))) + (let [details-with-tunnel (ssh/include-ssh-tunnel details) ;; If the tunnel is disabled this returned unchanged + spec (connection-details->spec (driver/engine->driver engine) details-with-tunnel)] + (assoc (db/connection-pool (assoc spec + :minimum-pool-size 1 + ;; prevent broken connections closed by dbs by testing them every 3 mins + :idle-connection-test-period (* 3 60) + ;; prevent overly large pools by condensing them when connections are idle for 15m+ + :excess-timeout (* 15 60))) + :ssh-tunnel (:tunnel-connection details-with-tunnel)))) (defn- notify-database-updated "We are being informed that a DATABASE has been updated, so lets shut down the connection pool (if it exists) under @@ -158,7 +162,9 @@ ;; remove the cached reference to the pool so we don't try to use it anymore (swap! database-id->connection-pool dissoc id) ;; now actively shut down the pool so that any open connections are closed - (.close ^ComboPooledDataSource (:datasource pool)))) + (.close ^ComboPooledDataSource (:datasource pool)) + (when-let [ssh-tunnel (:ssh-tunnel pool)] + (.disconnect ^com.jcraft.jsch.Session ssh-tunnel)))) (defn db->pooled-connection-spec "Return a JDBC connection spec that includes a cp30 `ComboPooledDataSource`. diff --git a/src/metabase/driver/mongo.clj b/src/metabase/driver/mongo.clj index dbe90592acd56f9bf9932c5dfb2d1b4f38bf7f35..7fbea0fbd22854d42d2e681288015620780b1d4c 100644 --- a/src/metabase/driver/mongo.clj +++ b/src/metabase/driver/mongo.clj @@ -14,6 +14,7 @@ [field :as field] [table :as table]] [metabase.sync-database.analyze :as analyze] + [metabase.util.ssh :as ssh] [monger [collection :as mc] [command :as cmd] @@ -43,6 +44,12 @@ #"^Password can not be null when the authentication mechanism is unspecified$" (driver/connection-error-messages :password-required) + #"^com.jcraft.jsch.JSchException: Auth fail$" + (driver/connection-error-messages :ssh-tunnel-auth-fail) + + #"j^ava.net.ConnectException: Connection refused (Connection refused)$" + (driver/connection-error-messages :ssh-tunnel-connection-fail) + #".*" ; default message)) @@ -174,31 +181,32 @@ :can-connect? (u/drop-first-arg can-connect?) :describe-database (u/drop-first-arg describe-database) :describe-table (u/drop-first-arg describe-table) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 27017} - {:name "dbname" - :display-name "Database name" - :placeholder "carrierPigeonDeliveries" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?"} - {:name "pass" - :display-name "Database password" - :type :password - :placeholder "******"} - {:name "authdb" - :display-name "Authentication Database" - :placeholder "Optional database to use when authenticating"} - {:name "ssl" - :display-name "Use a secure connection (SSL)?" - :type :boolean - :default false}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 27017} + {:name "dbname" + :display-name "Database name" + :placeholder "carrierPigeonDeliveries" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?"} + {:name "pass" + :display-name "Database password" + :type :password + :placeholder "******"} + {:name "authdb" + :display-name "Authentication Database" + :placeholder "Optional database to use when authenticating"} + {:name "ssl" + :display-name "Use a secure connection (SSL)?" + :type :boolean + :default false}])) :execute-query (u/drop-first-arg qp/execute-query) :features (constantly #{:basic-aggregations :dynamic-schema :nested-fields}) :field-values-lazy-seq (u/drop-first-arg field-values-lazy-seq) diff --git a/src/metabase/driver/mongo/util.clj b/src/metabase/driver/mongo/util.clj index e790e1be493d5eccf26b41dad9be7600f4dc5e57..1a51002b680fd592d68eeeb95e40872bf350fe40 100644 --- a/src/metabase/driver/mongo/util.clj +++ b/src/metabase/driver/mongo/util.clj @@ -4,6 +4,7 @@ [metabase [driver :as driver] [util :as u]] + [metabase.util.ssh :as ssh] [monger [core :as mg] [credentials :as mcred]])) @@ -45,33 +46,35 @@ "Run F with a new connection (bound to `*mongo-connection*`) to DATABASE. Don't use this directly; use `with-mongo-connection`." [f database] - (let [{:keys [dbname host port user pass ssl authdb] - :or {port 27017, pass "", ssl false}} (cond - (string? database) {:dbname database} - (:dbname (:details database)) (:details database) ; entire Database obj - (:dbname database) database ; connection details map only - :else (throw (Exception. (str "with-mongo-connection failed: bad connection details:" (:details database))))) - user (when (seq user) ; ignore empty :user and :pass strings - user) - pass (when (seq pass) - pass) - authdb (if (seq authdb) - authdb - dbname) - server-address (mg/server-address host port) - credentials (when user - (mcred/create user authdb pass)) - connect (partial mg/connect server-address (build-connection-options :ssl? ssl)) - conn (if credentials - (connect credentials) - (connect)) - mongo-connection (mg/get-db conn dbname)] - (log/debug (u/format-color 'cyan "<< OPENED NEW MONGODB CONNECTION >>")) - (try - (binding [*mongo-connection* mongo-connection] - (f *mongo-connection*)) - (finally - (mg/disconnect conn))))) + (let [details (cond + (string? database) {:dbname database} + (:dbname (:details database)) (:details database) ; entire Database obj + (:dbname database) database ; connection details map only + :else (throw (Exception. (str "with-mongo-connection failed: bad connection details:" (:details database)))))] + (ssh/with-ssh-tunnel [details-with-tunnel details] + (let [{:keys [dbname host port user pass ssl authdb tunnel-host tunnel-user tunnel-pass] + :or {port 27017, pass "", ssl false}} details-with-tunnel + user (when (seq user) ; ignore empty :user and :pass strings + user) + pass (when (seq pass) + pass) + authdb (if (seq authdb) + authdb + dbname) + server-address (mg/server-address host port) + credentials (when user + (mcred/create user authdb pass)) + connect (partial mg/connect server-address (build-connection-options :ssl? ssl)) + conn (if credentials + (connect credentials) + (connect)) + mongo-connection (mg/get-db conn dbname)] + (log/debug (u/format-color 'cyan "<< OPENED NEW MONGODB CONNECTION >>")) + (try + (binding [*mongo-connection* mongo-connection] + (f *mongo-connection*)) + (finally (mg/disconnect conn) + (log/debug (u/format-color 'cyan "<< CLOSED MONGODB CONNECTION >>")))))))) (defmacro with-mongo-connection "Open a new MongoDB connection to DATABASE-OR-CONNECTION-STRING, bind connection to BINDING, execute BODY, and close the connection. diff --git a/src/metabase/driver/mysql.clj b/src/metabase/driver/mysql.clj index 9df960b14a26be5442da304ae77735582d916a7c..0c4c4a02b20da857011a5b95d24e5926f45a0e4e 100644 --- a/src/metabase/driver/mysql.clj +++ b/src/metabase/driver/mysql.clj @@ -8,7 +8,10 @@ [util :as u]] [metabase.db.spec :as dbspec] [metabase.driver.generic-sql :as sql] - [metabase.util.honeysql-extensions :as hx])) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]])) + ;;; # IMPLEMENTATION @@ -154,28 +157,29 @@ driver/IDriver (merge (sql/IDriverSQLDefaultsMixin) {:date-interval (u/drop-first-arg date-interval) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 3306} - {:name "dbname" - :display-name "Database name" - :placeholder "birds_of_the_word" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?" - :required true} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"} - {:name "additional-options" - :display-name "Additional JDBC connection string options" - :placeholder "tinyInt1isBit=false"}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 3306} + {:name "dbname" + :display-name "Database name" + :placeholder "birds_of_the_word" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?" + :required true} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"} + {:name "additional-options" + :display-name "Additional JDBC connection string options" + :placeholder "tinyInt1isBit=false"}])) :humanize-connection-error-message (u/drop-first-arg humanize-connection-error-message)}) sql/ISQLDriver diff --git a/src/metabase/driver/oracle.clj b/src/metabase/driver/oracle.clj index c78447398ed9b28734cdbb2bb6b1a3af434446a7..b88feb928320d34a03dd468fdf1bc25fb6f0835e 100644 --- a/src/metabase/driver/oracle.clj +++ b/src/metabase/driver/oracle.clj @@ -8,7 +8,9 @@ [util :as u]] [metabase.driver.generic-sql :as sql] [metabase.driver.generic-sql.query-processor :as sqlqp] - [metabase.util.honeysql-extensions :as hx])) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]])) (def ^:private ^:const pattern->type [;; Any types -- see http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#i107578 @@ -193,24 +195,25 @@ (merge (sql/IDriverSQLDefaultsMixin) {:can-connect? (u/drop-first-arg can-connect?) :date-interval (u/drop-first-arg date-interval) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 1521} - {:name "sid" - :display-name "Oracle System ID" - :default "ORCL"} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?" - :required true} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 1521} + {:name "sid" + :display-name "Oracle System ID" + :default "ORCL"} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?" + :required true} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"}])) :execute-query (comp remove-rownum-column sqlqp/execute-query)}) sql/ISQLDriver diff --git a/src/metabase/driver/postgres.clj b/src/metabase/driver/postgres.clj index 765f8690846d3e08b166a2c68ae074ef71a3e15b..3e0351d501b704ec3fa486935530b0348b3cb046 100644 --- a/src/metabase/driver/postgres.clj +++ b/src/metabase/driver/postgres.clj @@ -8,7 +8,9 @@ [util :as u]] [metabase.db.spec :as dbspec] [metabase.driver.generic-sql :as sql] - [metabase.util.honeysql-extensions :as hx]) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]]) (:import java.util.UUID)) (def ^:private ^:const column->base-type @@ -200,32 +202,33 @@ driver/IDriver (merge (sql/IDriverSQLDefaultsMixin) {:date-interval (u/drop-first-arg date-interval) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 5432} - {:name "dbname" - :display-name "Database name" - :placeholder "birds_of_the_word" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?" - :required true} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"} - {:name "ssl" - :display-name "Use a secure connection (SSL)?" - :type :boolean - :default false} - {:name "additional-options" - :display-name "Additional JDBC connection string options" - :placeholder "prepareThreshold=0"}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 5432} + {:name "dbname" + :display-name "Database name" + :placeholder "birds_of_the_word" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?" + :required true} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"} + {:name "ssl" + :display-name "Use a secure connection (SSL)?" + :type :boolean + :default false} + {:name "additional-options" + :display-name "Additional JDBC connection string options" + :placeholder "prepareThreshold=0"}])) :humanize-connection-error-message (u/drop-first-arg humanize-connection-error-message)}) sql/ISQLDriver PostgresISQLDriverMixin) diff --git a/src/metabase/driver/presto.clj b/src/metabase/driver/presto.clj index 07a69fdec585df886841fd910853b32074f0917b..87efc4f5c99948683d29205e302d23ab193e1192 100644 --- a/src/metabase/driver/presto.clj +++ b/src/metabase/driver/presto.clj @@ -17,7 +17,9 @@ [table :as table]] [metabase.query-processor.util :as qputil] [metabase.sync-database.analyze :as analyze] - [metabase.util.honeysql-extensions :as hx]) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]]) (:import java.util.Date [metabase.query_processor.interface DateTimeValue Value])) @@ -64,28 +66,30 @@ (parser value)))))) (defn- fetch-presto-results! [details {prev-columns :columns, prev-rows :rows} uri] - (let [{{:keys [columns data nextUri error]} :body} (http/get uri (assoc (details->request details) :as :json))] - (when error - (throw (ex-info (or (:message error) "Error running query.") error))) - (let [rows (parse-presto-results columns data) - results {:columns (or columns prev-columns) - :rows (vec (concat prev-rows rows))}] - (if (nil? nextUri) - results - (do (Thread/sleep 100) ; Might not be the best way, but the pattern is that we poll Presto at intervals - (fetch-presto-results! details results nextUri)))))) + (ssh/with-ssh-tunnel [details-with-tunnel details] + (let [{{:keys [columns data nextUri error]} :body} (http/get uri (assoc (details->request details-with-tunnel) :as :json))] + (when error + (throw (ex-info (or (:message error) "Error running query.") error))) + (let [rows (parse-presto-results columns data) + results {:columns (or columns prev-columns) + :rows (vec (concat prev-rows rows))}] + (if (nil? nextUri) + results + (do (Thread/sleep 100) ; Might not be the best way, but the pattern is that we poll Presto at intervals + (fetch-presto-results! details-with-tunnel results nextUri))))))) (defn- execute-presto-query! [details query] - (let [{{:keys [columns data nextUri error]} :body} (http/post (details->uri details "/v1/statement") - (assoc (details->request details) :body query, :as :json))] - (when error - (throw (ex-info (or (:message error) "Error preparing query.") error))) - (let [rows (parse-presto-results (or columns []) (or data [])) - results {:columns (or columns []) - :rows rows}] - (if (nil? nextUri) - results - (fetch-presto-results! details results nextUri))))) + (ssh/with-ssh-tunnel [details-with-tunnel details] + (let [{{:keys [columns data nextUri error]} :body} (http/post (details->uri details-with-tunnel "/v1/statement") + (assoc (details->request details-with-tunnel) :body query, :as :json))] + (when error + (throw (ex-info (or (:message error) "Error preparing query.") error))) + (let [rows (parse-presto-results (or columns []) (or data [])) + results {:columns (or columns []) + :rows rows}] + (if (nil? nextUri) + results + (fetch-presto-results! details-with-tunnel results nextUri)))))) ;;; Generic helpers @@ -291,29 +295,30 @@ :describe-database (u/drop-first-arg describe-database) :describe-table (u/drop-first-arg describe-table) :describe-table-fks (constantly nil) ; no FKs in Presto - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 8080} - {:name "catalog" - :display-name "Database name" - :placeholder "hive" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database" - :default "metabase"} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"} - {:name "ssl" - :display-name "Use a secure connection (SSL)?" - :type :boolean - :default false}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 8080} + {:name "catalog" + :display-name "Database name" + :placeholder "hive" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database" + :default "metabase"} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"} + {:name "ssl" + :display-name "Use a secure connection (SSL)?" + :type :boolean + :default false}])) :execute-query (u/drop-first-arg execute-query) :features (constantly (set/union #{:set-timezone :basic-aggregations diff --git a/src/metabase/driver/redshift.clj b/src/metabase/driver/redshift.clj index a9c833029c6c0c041bf8294c102d2b24d52858a3..b477443110670cbcb6f5d2150d33b2ccc0abaf2e 100644 --- a/src/metabase/driver/redshift.clj +++ b/src/metabase/driver/redshift.clj @@ -11,7 +11,9 @@ [metabase.driver [generic-sql :as sql] [postgres :as postgres]] - [metabase.util.honeysql-extensions :as hx])) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]])) (defn- connection-details->spec [details] (dbspec/postgres (merge details postgres/ssl-params))) ; always connect to redshift over SSL @@ -64,27 +66,28 @@ (merge (sql/IDriverSQLDefaultsMixin) {:date-interval (u/drop-first-arg date-interval) :describe-table-fks (u/drop-first-arg describe-table-fks) - :details-fields (constantly [{:name "host" - :display-name "Host" - :placeholder "my-cluster-name.abcd1234.us-east-1.redshift.amazonaws.com" - :required true} - {:name "port" - :display-name "Port" - :type :integer - :default 5439} - {:name "db" - :display-name "Database name" - :placeholder "toucan_sightings" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "cam" - :required true} - {:name "password" - :display-name "Database user password" - :type :password - :placeholder "*******" - :required true}]) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :placeholder "my-cluster-name.abcd1234.us-east-1.redshift.amazonaws.com" + :required true} + {:name "port" + :display-name "Port" + :type :integer + :default 5439} + {:name "db" + :display-name "Database name" + :placeholder "toucan_sightings" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "cam" + :required true} + {:name "password" + :display-name "Database user password" + :type :password + :placeholder "*******" + :required true}])) :format-custom-field-name (u/drop-first-arg str/lower-case)}) sql/ISQLDriver diff --git a/src/metabase/driver/sqlserver.clj b/src/metabase/driver/sqlserver.clj index ec75ae4630c152ebd28a64e8be130cb874d0c42d..1176251abf18bd1196c7463345eabaf42444906d 100644 --- a/src/metabase/driver/sqlserver.clj +++ b/src/metabase/driver/sqlserver.clj @@ -4,9 +4,8 @@ [driver :as driver] [util :as u]] [metabase.driver.generic-sql :as sql] - [metabase.util.honeysql-extensions :as hx])) - - ; need to import this in order to load JDBC driver + [metabase.util.honeysql-extensions :as hx] + [metabase.util.ssh :as ssh])) (defn- column->base-type "See [this page](https://msdn.microsoft.com/en-us/library/ms187752.aspx) for details." @@ -147,35 +146,36 @@ driver/IDriver (merge (sql/IDriverSQLDefaultsMixin) {:date-interval (u/drop-first-arg date-interval) - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 1433} - {:name "db" - :display-name "Database name" - :placeholder "BirdsOfTheWorld" - :required true} - {:name "instance" - :display-name "Database instance name" - :placeholder "N/A"} - {:name "domain" - :display-name "Windows domain" - :placeholder "N/A"} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?" - :required true} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"} - {:name "ssl" - :display-name "Use a secure connection (SSL)?" - :type :boolean - :default false}])}) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 1433} + {:name "db" + :display-name "Database name" + :placeholder "BirdsOfTheWorld" + :required true} + {:name "instance" + :display-name "Database instance name" + :placeholder "N/A"} + {:name "domain" + :display-name "Windows domain" + :placeholder "N/A"} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?" + :required true} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"} + {:name "ssl" + :display-name "Use a secure connection (SSL)?" + :type :boolean + :default false}]))}) sql/ISQLDriver (merge (sql/ISQLDriverDefaultsMixin) diff --git a/src/metabase/driver/vertica.clj b/src/metabase/driver/vertica.clj index 5e20ed3c4d514926fa965866302ef94b0c1441f1..855710c32efc68f2eef4423b81e42fe80f3430e6 100644 --- a/src/metabase/driver/vertica.clj +++ b/src/metabase/driver/vertica.clj @@ -7,7 +7,9 @@ [driver :as driver] [util :as u]] [metabase.driver.generic-sql :as sql] - [metabase.util.honeysql-extensions :as hx])) + [metabase.util + [honeysql-extensions :as hx] + [ssh :as ssh]])) (def ^:private ^:const column->base-type "Map of Vertica column types -> Field base types. @@ -103,25 +105,26 @@ (merge (sql/IDriverSQLDefaultsMixin) {:date-interval (u/drop-first-arg date-interval) :describe-database describe-database - :details-fields (constantly [{:name "host" - :display-name "Host" - :default "localhost"} - {:name "port" - :display-name "Port" - :type :integer - :default 5433} - {:name "dbname" - :display-name "Database name" - :placeholder "birds_of_the_word" - :required true} - {:name "user" - :display-name "Database username" - :placeholder "What username do you use to login to the database?" - :required true} - {:name "password" - :display-name "Database password" - :type :password - :placeholder "*******"}])}) + :details-fields (constantly (ssh/with-tunnel-config + [{:name "host" + :display-name "Host" + :default "localhost"} + {:name "port" + :display-name "Port" + :type :integer + :default 5433} + {:name "dbname" + :display-name "Database name" + :placeholder "birds_of_the_word" + :required true} + {:name "user" + :display-name "Database username" + :placeholder "What username do you use to login to the database?" + :required true} + {:name "password" + :display-name "Database password" + :type :password + :placeholder "*******"}]))}) sql/ISQLDriver (merge (sql/ISQLDriverDefaultsMixin) {:column->base-type (u/drop-first-arg column->base-type) diff --git a/src/metabase/util/ssh.clj b/src/metabase/util/ssh.clj new file mode 100644 index 0000000000000000000000000000000000000000..fdbb683472558da482138cb9c935005dcb754f60 --- /dev/null +++ b/src/metabase/util/ssh.clj @@ -0,0 +1,114 @@ +(ns metabase.util.ssh + (:require [clojure.tools.logging :as log] + [clojure.string :as string] + [metabase.util :as u]) + (:import com.jcraft.jsch.JSch)) + +(def ^:private default-ssh-timeout 30000) + +(defn start-ssh-tunnel + "Opens a new ssh tunnel and returns the connection along with the dynamically + assigned tunnel entrance port. It's the callers responsibility to call .disconnect + on the returned connection object." + [{:keys [tunnel-host tunnel-port tunnel-user tunnel-pass host port]}] + (let [connection (doto ^com.jcraft.jsch.Session (.getSession (new com.jcraft.jsch.JSch) + ^String tunnel-user + ^String tunnel-host + tunnel-port) + (.setPassword ^String tunnel-pass) + (.setConfig "StrictHostKeyChecking" "no") + (.connect default-ssh-timeout) + (.setPortForwardingL 0 host port)) + input-port (some-> (.getPortForwardingL connection) + first + (string/split #":") + first + (Integer/parseInt))] + (assert (number? input-port)) + (log/info (u/format-color 'cyan "creating ssh tunnel %s@%s:%s -L %s:%s:%s" tunnel-user tunnel-host tunnel-port input-port host port)) + [connection input-port])) + +(def ssh-tunnel-preferences + "Configuration parameters to include in the add driver page on drivers that + support ssh tunnels" + [{:name "tunnel-enabled" + :display-name "Use SSH tunnel" + :placeholder "Enable this ssh tunnel?" + :type :boolean + :default false} + {:name "tunnel-host" + :display-name "SSH tunnel host" + :placeholder "What hostname do you use to connect to the SSH tunnel?" + :required true} + {:name "tunnel-port" + :display-name "SSH tunnel port" + :type :integer + :default 22 + :required false} + {:name "tunnel-user" + :display-name "SSH tunnel username" + :placeholder "What username do you use to login to the SSH tunnel?" + :required true} + {:name "tunnel-pass" + :display-name "SSH tunnel password" + :type :password + :placeholder "******" + :required true} + #_{:name "tunnel-private-key" + :display-name "SSH private key to connect to the tunnel" + :type :string + :placeholder "Paste the contents of an ssh private key here"} + #_{:name "tunnel-private-key-file-name" + :display-name "Path on the Metabase server to a SSH private key file to connect to the tunnel" + :type :string + :placeholder "/home/YOUR-USERNAME/.ssh/id_rsa"}]) + +(defn with-tunnel-config + "Add preferences for ssh tunnels to a drivers :details-fields" + [driver-options] + (concat driver-options ssh-tunnel-preferences)) + +(defn use-ssh-tunnel? + "Is the SSH tunnel currently turned on for these connection details" + [details] + (:tunnel-enabled details)) + +(defn include-ssh-tunnel + "Updates connection details for a data warehouse to use the ssh tunnel host and port + For drivers that enter hosts including the protocol (https://host), copy the protocol over as well" + [details] + (if (use-ssh-tunnel? details) + (let [[_ proto host] (re-find #"(.*://)?(.*)" (:host details)) + [connection tunnel-entrance-port] (start-ssh-tunnel (assoc details :host host)) ;; don't include L7 protocol in ssh tunnel + details-with-tunnel (assoc details + :port tunnel-entrance-port ;; This parameter is set dynamically when the connection is established + :host (str proto (:tunnel-host details)) + :tunnel-entrance-port tunnel-entrance-port ;; the input port is not known until the connection is opened + :tunnel-connection connection)] + details-with-tunnel) + details)) + +(defn with-ssh-tunnel* + "Starts an SSH tunnel, runs the supplied function with the tunnel open, then closes it" + [{:keys [host port tunnel-host tunnel-user tunnel-pass] :as details} f] + (if (use-ssh-tunnel? details) + (let [details-with-tunnel (include-ssh-tunnel details)] + (log/errorf "\nbefore:\n%s\n" (with-out-str (clojure.pprint/pprint details))) + (log/errorf "\nafter:\n%s\n" (with-out-str (clojure.pprint/pprint details-with-tunnel))) + (try + (log/info (u/format-color 'cyan "<< OPENED SSH TUNNEL >>")) + (f details-with-tunnel) + (catch Exception e + (throw e)) + (finally + (.disconnect ^com.jcraft.jsch.Session (:tunnel-connection details-with-tunnel)) + (log/info (u/format-color 'cyan "<< CLOSED SSH TUNNEL >>"))))) + (f details))) + +(defmacro with-ssh-tunnel + "Starts an ssh tunnel, and binds the supplied name to a database + details map with it's values adjusted to use the tunnel" + [[name details] & body] + `(with-ssh-tunnel* ~details + (fn [~name] + ~@body))) diff --git a/test/metabase/api/activity_test.clj b/test/metabase/api/activity_test.clj index 519e7e1f94c813fe3611acecd9b8aa70460362fb..22efcfe5b8417d8f2d95da39942a917871d51cbd 100644 --- a/test/metabase/api/activity_test.clj +++ b/test/metabase/api/activity_test.clj @@ -1,16 +1,16 @@ (ns metabase.api.activity-test "Tests for /api/activity endpoints." (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [activity :refer [Activity]] - [card :refer [Card]] - [dashboard :refer [Dashboard]] - [view-log :refer [ViewLog]]) - [metabase.test.data :refer :all] + [metabase.models + [activity :refer [Activity]] + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [view-log :refer [ViewLog]]] [metabase.test.data.users :refer :all] - [metabase.test.util :refer [match-$ resolve-private-vars], :as tu] - [metabase.util :as u])) + [metabase.test.util :as tu :refer [match-$ resolve-private-vars]] + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) ;; GET / diff --git a/test/metabase/api/card_test.clj b/test/metabase/api/card_test.clj index a60512e787d8f6453ea796d7761810b47c0123d6..2cd0de6108b333bdaca9b620a36b5d578f5f0ba6 100644 --- a/test/metabase/api/card_test.clj +++ b/test/metabase/api/card_test.clj @@ -3,24 +3,27 @@ (:require [cheshire.core :as json] [expectations :refer :all] [medley.core :as m] - [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.http-client :refer :all, :as http] - [metabase.middleware :as middleware] - (metabase.models [card :refer [Card]] - [card-favorite :refer [CardFavorite]] - [card-label :refer [CardLabel]] - [collection :refer [Collection]] - [database :refer [Database]] - [label :refer [Label]] - [permissions :refer [Permissions], :as perms] - [permissions-group :as perms-group] - [table :refer [Table]] - [view-log :refer [ViewLog]]) - [metabase.test.data :refer :all] + [metabase + [http-client :as http :refer :all] + [middleware :as middleware] + [util :as u]] + [metabase.models + [card :refer [Card]] + [card-favorite :refer [CardFavorite]] + [card-label :refer [CardLabel]] + [collection :refer [Collection]] + [database :refer [Database]] + [label :refer [Label]] + [permissions :as perms] + [permissions-group :as perms-group] + [table :refer [Table]] + [view-log :refer [ViewLog]]] + [metabase.test + [data :refer :all] + [util :as tu :refer [match-$ random-name]]] [metabase.test.data.users :refer :all] - [metabase.test.util :refer [match-$ random-name obj->json->obj], :as tu] - [metabase.util :as u]) + [toucan.db :as db] + [toucan.util.test :as tt]) (:import java.util.UUID)) ;;; CARD LIFECYCLE diff --git a/test/metabase/api/collection_test.clj b/test/metabase/api/collection_test.clj index f83b9d5805361020661c285a09ef8b171d98be66..ab0e165b7ef06d1808e41d2f1a076e62f9ee9f90 100644 --- a/test/metabase/api/collection_test.clj +++ b/test/metabase/api/collection_test.clj @@ -1,15 +1,16 @@ (ns metabase.api.collection-test "Tests for /api/collection endpoints." (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [collection :refer [Collection]] - [permissions :as perms] - [permissions-group :as group]) + [metabase.models + [card :refer [Card]] + [collection :refer [Collection]] + [permissions :as perms] + [permissions-group :as group]] [metabase.test.data.users :refer [user->client]] [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) ;; check that we can get a basic list of collections (tt/expect-with-temp [Collection [collection]] diff --git a/test/metabase/api/common/internal_test.clj b/test/metabase/api/common/internal_test.clj index 6812ca485c7d5f52cbb3581c93f652e92e1aa533..d7baa6c1c8d4f740e026907c505d414f6dab0172 100644 --- a/test/metabase/api/common/internal_test.clj +++ b/test/metabase/api/common/internal_test.clj @@ -1,7 +1,7 @@ (ns metabase.api.common.internal-test (:require [expectations :refer :all] [medley.core :as m] - (metabase.api.common [internal :refer :all]) + [metabase.api.common.internal :refer :all] [metabase.util :as u])) ;;; TESTS FOR ROUTE-FN-NAME diff --git a/test/metabase/api/common_test.clj b/test/metabase/api/common_test.clj index 4d82919f9522a68ac5249ef2e9562dfb9572bdbc..b7b41661fa45c4e94549bffd809b22f71dc0b5b0 100644 --- a/test/metabase/api/common_test.clj +++ b/test/metabase/api/common_test.clj @@ -3,10 +3,8 @@ [metabase.api.common :refer :all] [metabase.api.common.internal :refer :all] [metabase.test.data :refer :all] - [metabase.test.util :refer :all] [metabase.util.schema :as su])) - ;;; TESTS FOR CHECK (ETC) (def ^:private four-oh-four diff --git a/test/metabase/api/dashboard_test.clj b/test/metabase/api/dashboard_test.clj index 74b15e60bf611174e203e7917f24a9ee2aee88cc..f44aed82fd93edff0a5f33f0050de72f0bf9c96b 100644 --- a/test/metabase/api/dashboard_test.clj +++ b/test/metabase/api/dashboard_test.clj @@ -2,25 +2,23 @@ "Tests for /api/dashboard endpoints." (:require [expectations :refer :all] [medley.core :as m] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] + [metabase + [http-client :as http] + [middleware :as middleware] + [util :as u]] [metabase.api.card-test :as card-api-test] - (metabase [http-client :as http] - [middleware :as middleware]) - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard retrieve-dashboard-card]] - [dashboard-card-series :refer [DashboardCardSeries]] - [revision :refer [Revision]] - [user :refer [User]]) - [metabase.test.data :refer :all] + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard retrieve-dashboard-card]] + [dashboard-card-series :refer [DashboardCardSeries]] + [revision :refer [Revision]]] [metabase.test.data.users :refer :all] [metabase.test.util :as tu] - [metabase.util :as u]) + [toucan.db :as db] + [toucan.util.test :as tt]) (:import java.util.UUID)) - ;; ## Helper Fns (defn remove-ids-and-boolean-timestamps [m] diff --git a/test/metabase/api/database_test.clj b/test/metabase/api/database_test.clj index c8b6b66d89721de2cef216dd85011739697de378..ab97f890d3d03a710783a167cd4d9ea54d2a3353 100644 --- a/test/metabase/api/database_test.clj +++ b/test/metabase/api/database_test.clj @@ -1,17 +1,21 @@ (ns metabase.api.database-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :as hydrate]) - [toucan.util.test :as tt] - [metabase.driver :as driver] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [table :refer [Table]]) - [metabase.test.data :refer :all] - (metabase.test.data [datasets :as datasets] - [users :refer :all]) - [metabase.test.util :refer [match-$ random-name], :as tu] - [metabase.util :as u])) + [metabase + [driver :as driver] + [util :as u]] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu :refer [match-$]]] + [metabase.test.data + [datasets :as datasets] + [users :refer :all]] + [toucan + [db :as db] + [hydrate :as hydrate]])) ;; HELPER FNS diff --git a/test/metabase/api/dataset_test.clj b/test/metabase/api/dataset_test.clj index 637acfad10827deecd13941e0ba37f3ff514f5b3..1355b9394aa9a781cdfac6a53f39c14492fb5d11 100644 --- a/test/metabase/api/dataset_test.clj +++ b/test/metabase/api/dataset_test.clj @@ -1,16 +1,14 @@ (ns metabase.api.dataset-test "Unit tests for /api/dataset endpoints." - (:require [clojure.string :as s] - [expectations :refer :all] - [toucan.db :as db] + (:require [expectations :refer :all] [metabase.api.dataset :refer [default-query-constraints]] - (metabase.models [card :refer [Card]] - [query-execution :refer [QueryExecution]]) + [metabase.models.query-execution :refer [QueryExecution]] [metabase.query-processor.expand :as ql] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.data :refer :all] - [metabase.test.util :as tu])) - + [toucan.db :as db])) (defn user-details [user] (tu/match-$ user diff --git a/test/metabase/api/email_test.clj b/test/metabase/api/email_test.clj index 169cdc74cf2ba97250b55e426fb267b56c599703..adb7f6fe1f0d83a0d50b084be5daeb3314287594 100644 --- a/test/metabase/api/email_test.clj +++ b/test/metabase/api/email_test.clj @@ -1,9 +1,7 @@ (ns metabase.api.email-test (:require [expectations :refer :all] - [metabase.email-test :refer [with-fake-inbox inbox]] [metabase.models.setting :as setting] - [metabase.test.data.users :refer :all])) - + [metabase.test.data.users :refer [user->client]])) (defn- email-settings [] diff --git a/test/metabase/api/embed_test.clj b/test/metabase/api/embed_test.clj index 6c94ef15616e66e8bf7ccae8e07aee3d348d3cd7..5e317b1db281dde8262c3a4b082362da89992d7e 100644 --- a/test/metabase/api/embed_test.clj +++ b/test/metabase/api/embed_test.clj @@ -2,16 +2,18 @@ (:require [buddy.sign.jwt :as jwt] [crypto.random :as crypto-random] [expectations :refer :all] - [toucan.util.test :as tt] - [metabase.http-client :as http] + [metabase + [http-client :as http] + [util :as u]] [metabase.api.public-test :as public-test] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]]) - (metabase.test [data :as data] - [util :as tu]) - [metabase.util :as u] - [metabase.util.embed :as eu])) + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]]] + [metabase.test + [data :as data] + [util :as tu]] + [toucan.util.test :as tt])) (defn random-embedding-secret-key [] (crypto-random/hex 32)) diff --git a/test/metabase/api/field_test.clj b/test/metabase/api/field_test.clj index 1b1917d59afb5913123d740c9b49a5714ae9cdce..951da88272f3dc508022447b02444254f7960994 100644 --- a/test/metabase/api/field_test.clj +++ b/test/metabase/api/field_test.clj @@ -1,15 +1,16 @@ (ns metabase.api.field-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] [metabase.driver :as driver] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [field-values :refer [FieldValues]] - [table :refer [Table]]) - [metabase.test.data :refer :all] + [metabase.models + [field :refer [Field]] + [field-values :refer [FieldValues]] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu])) + [toucan.db :as db] + [toucan.util.test :as tt])) ;; Helper Fns diff --git a/test/metabase/api/geojson_test.clj b/test/metabase/api/geojson_test.clj index 649d92de87674d2946416ce9ce1df7daee97e20b..72a6d767b7f61681b2b1886fb11f117be0972440 100644 --- a/test/metabase/api/geojson_test.clj +++ b/test/metabase/api/geojson_test.clj @@ -1,10 +1,10 @@ (ns metabase.api.geojson-test (:require [expectations :refer :all] - [schema.core :as s] [metabase.api.geojson :refer [custom-geojson]] [metabase.test.data.users :refer [user->client]] [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [schema.core :as s])) (tu/resolve-private-vars metabase.api.geojson valid-json-url? diff --git a/test/metabase/api/label_test.clj b/test/metabase/api/label_test.clj index 4f44f9e087e34aff39bb04ecb7608efb9c648797..b15fc75a6229b5db37d3258082eedb1e53a87d0c 100644 --- a/test/metabase/api/label_test.clj +++ b/test/metabase/api/label_test.clj @@ -1,11 +1,11 @@ (ns metabase.api.label-test "Tests for `/api/label` endpoints." (:require [expectations :refer [expect]] - [toucan.db :as db] - [toucan.util.test :as tt] [metabase.models.label :refer [Label]] [metabase.test.data.users :refer [user->client]] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) ;;; GET /api/label -- list all labels (tt/expect-with-temp [Label [{label-1-id :id} {:name "Toucan-Approved"}] diff --git a/test/metabase/api/metric_test.clj b/test/metabase/api/metric_test.clj index 3cb39bbee62e3fe5b7d6af4dc5d7d7e62544d5f6..073645d4fb766002be5506223c401eb45dfd9407 100644 --- a/test/metabase/api/metric_test.clj +++ b/test/metabase/api/metric_test.clj @@ -1,17 +1,20 @@ (ns metabase.api.metric-test "Tests for /api/metric endpoints." (:require [expectations :refer :all] - [toucan.hydrate :refer [hydrate]] - [toucan.util.test :as tt] - (metabase [http-client :as http] - [middleware :as middleware]) - (metabase.models [database :refer [Database]] - [metric :refer [Metric], :as metric] - [revision :refer [Revision]] - [table :refer [Table]]) - [metabase.test.data :refer :all, :as data] + [metabase + [http-client :as http] + [middleware :as middleware]] + [metabase.models + [database :refer [Database]] + [metric :as metric :refer [Metric]] + [revision :refer [Revision]] + [table :refer [Table]]] + [metabase.test + [data :as data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu])) + [toucan.hydrate :refer [hydrate]] + [toucan.util.test :as tt])) ;; ## Helper Fns diff --git a/test/metabase/api/permissions_test.clj b/test/metabase/api/permissions_test.clj index e254bea4342a41343e7e9daa113ab4a3a64a13c9..c8fb9bf02fcc7bff15f73af5ec8380cc49857b67 100644 --- a/test/metabase/api/permissions_test.clj +++ b/test/metabase/api/permissions_test.clj @@ -1,11 +1,10 @@ (ns metabase.api.permissions-test "Tests for `/api/permissions` endpoints." (:require [expectations :refer :all] - [toucan.util.test :as tt] - [metabase.models.permissions-group :refer [PermissionsGroup], :as group] + [metabase.models.permissions-group :as group :refer [PermissionsGroup]] [metabase.test.data.users :as test-users] - [metabase.util :as u])) - + [metabase.util :as u] + [toucan.util.test :as tt])) ;; GET /permissions/group ;; Should *not* include inactive users in the counts. diff --git a/test/metabase/api/preview_embed_test.clj b/test/metabase/api/preview_embed_test.clj index 4a1a67f2cf15381071e565c9307353ee966b321e..79469f00a8f91dee51defb940b3ac5f04ec82b79 100644 --- a/test/metabase/api/preview_embed_test.clj +++ b/test/metabase/api/preview_embed_test.clj @@ -1,13 +1,11 @@ (ns metabase.api.preview-embed-test (:require [expectations :refer :all] - [toucan.util.test :as tt] [metabase.api.embed-test :as embed-test] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]]) + [metabase.models.dashboard :refer [Dashboard]] [metabase.test.data.users :as test-users] [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.util.test :as tt])) ;;; ------------------------------------------------------------ GET /api/preview_embed/card/:token ------------------------------------------------------------ diff --git a/test/metabase/api/public_test.clj b/test/metabase/api/public_test.clj index 1d4b70c5827165bb831fa52e4bb68beb36442243..58c82be77b02595ee77438077c6099e8cad12f0a 100644 --- a/test/metabase/api/public_test.clj +++ b/test/metabase/api/public_test.clj @@ -2,23 +2,24 @@ "Tests for `api/public/` (public links) endpoints." (:require [cheshire.core :as json] [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.http-client :as http] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [dashboard-card-series :refer [DashboardCardSeries]] - [field-values :refer [FieldValues]]) - metabase.public-settings ; for `enable-public-sharing - [metabase.query-processor-test :as qp-test] - [metabase.test.data :as data] + [metabase + [http-client :as http] + [query-processor-test :as qp-test] + [util :as u]] + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [dashboard-card-series :refer [DashboardCardSeries]] + [field-values :refer [FieldValues]]] + [metabase.test + [data :as data] + [util :as tu]] [metabase.test.data.users :as test-users] - [metabase.test.util :as tu] - [metabase.util :as u]) + [toucan.db :as db] + [toucan.util.test :as tt]) (:import java.util.UUID)) - ;;; ------------------------------------------------------------ Helper Fns ------------------------------------------------------------ (defn count-of-venues-card [] diff --git a/test/metabase/api/pulse_test.clj b/test/metabase/api/pulse_test.clj index 08083bbb6651d03eed26fdd9a6d94da0ba7daec3..ab1feee536aa6b5583e6019f3a95c7b1d93e9042 100644 --- a/test/metabase/api/pulse_test.clj +++ b/test/metabase/api/pulse_test.clj @@ -1,17 +1,16 @@ (ns metabase.api.pulse-test "Tests for /api/pulse endpoints." (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase [http-client :as http] - [middleware :as middleware]) - (metabase.models [card :refer [Card]] - [database :refer [Database]] - [pulse :refer [Pulse], :as pulse]) - [metabase.test.data :refer :all] + [metabase + [http-client :as http] + [middleware :as middleware]] + [metabase.models + [card :refer [Card]] + [pulse :as pulse :refer [Pulse]]] [metabase.test.data.users :refer :all] [metabase.test.util :as tu] - [metabase.util :as u])) + [toucan.db :as db] + [toucan.util.test :as tt])) ;; ## Helper Fns diff --git a/test/metabase/api/revision_test.clj b/test/metabase/api/revision_test.clj index 9dabdf9d5d048a00d674f7901f43a3a5d4cb0d5a..4bdc73534d8cc4875d4f3f9f2bb1ce3e4ffe6368 100644 --- a/test/metabase/api/revision_test.clj +++ b/test/metabase/api/revision_test.clj @@ -1,14 +1,14 @@ (ns metabase.api.revision-test (:require [expectations :refer :all] - [metabase.api.revision :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer [Card serialize-instance]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [revision :refer [Revision push-revision! revert! revisions]]) + [metabase.models + [card :refer [Card serialize-instance]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [revision :refer [push-revision! Revision revisions]]] [metabase.test.data :refer :all] - [metabase.test.data.users :refer :all])) + [metabase.test.data.users :refer :all] + [toucan.db :as db] + [toucan.util.test :as tt])) (def ^:private rasta-revision-info (delay {:id (user->id :rasta), :common_name "Rasta Toucan", :first_name "Rasta", :last_name "Toucan"})) diff --git a/test/metabase/api/segment_test.clj b/test/metabase/api/segment_test.clj index 1576b27bafa2f746350b3c907f35d36656d0d610..59d61adfbab62d377505ef56a83b3cbda14436be 100644 --- a/test/metabase/api/segment_test.clj +++ b/test/metabase/api/segment_test.clj @@ -1,18 +1,21 @@ (ns metabase.api.segment-test "Tests for /api/segment endpoints." (:require [expectations :refer :all] - [toucan.hydrate :refer [hydrate]] - [toucan.util.test :as tt] - (metabase [http-client :as http] - [middleware :as middleware]) - (metabase.models [database :refer [Database]] - [revision :refer [Revision]] - [segment :refer [Segment], :as segment] - [table :refer [Table]]) + [metabase + [http-client :as http] + [middleware :as middleware] + [util :as u]] + [metabase.models + [database :refer [Database]] + [revision :refer [Revision]] + [segment :as segment :refer [Segment]] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.data :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [toucan.hydrate :refer [hydrate]] + [toucan.util.test :as tt])) ;; ## Helper Fns diff --git a/test/metabase/api/session_test.clj b/test/metabase/api/session_test.clj index c6d2461c28af82b5416fa7ab09cd531ba7388e71..4b8d97e722071bac826bed21aaa8dbfc9a480a51 100644 --- a/test/metabase/api/session_test.clj +++ b/test/metabase/api/session_test.clj @@ -1,18 +1,20 @@ (ns metabase.api.session-test "Tests for /api/session" - (:require [cemerick.friend.credentials :as creds] - [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] + (:require [expectations :refer :all] + [metabase + [http-client :refer :all] + [public-settings :as public-settings] + [util :as u]] [metabase.api.session :refer :all] - [metabase.http-client :refer :all] - (metabase.models [session :refer [Session]] - [user :refer [User]]) - [metabase.public-settings :as public-settings] - [metabase.test.data :refer :all] + [metabase.models + [session :refer [Session]] + [user :refer [User]]] + [metabase.test + [data :refer :all] + [util :as tu :refer [resolve-private-vars]]] [metabase.test.data.users :refer :all] - [metabase.util :as u] - [metabase.test.util :refer [random-name resolve-private-vars with-temporary-setting-values], :as tu])) + [toucan.db :as db] + [toucan.util.test :as tt])) ;; ## POST /api/session ;; Test that we can login diff --git a/test/metabase/api/setting_test.clj b/test/metabase/api/setting_test.clj index e68405e4a8ae9e4bef9baf1a3567142fddfa6db1..ad56acf33647c2b3ba161f27be16bc706d3da665 100644 --- a/test/metabase/api/setting_test.clj +++ b/test/metabase/api/setting_test.clj @@ -1,11 +1,6 @@ (ns metabase.api.setting-test (:require [expectations :refer :all] - (metabase.models [setting :as setting] - [setting-test :refer [set-settings! - setting-exists-in-db? - test-setting-1 - test-setting-2]]) - [metabase.test.data :refer :all] + [metabase.models.setting-test :refer [set-settings! test-setting-1 test-setting-2]] [metabase.test.data.users :refer :all])) ;; ## Helper Fns diff --git a/test/metabase/api/setup_test.clj b/test/metabase/api/setup_test.clj index c2b3e6bffb0fc472b430960c70c9877b1324df3a..1849cf1bf6973b54d7a890df08f951d14730c1ed 100644 --- a/test/metabase/api/setup_test.clj +++ b/test/metabase/api/setup_test.clj @@ -1,17 +1,11 @@ (ns metabase.api.setup-test "Tests for /api/setup endpoints." (:require [expectations :refer :all] - [toucan.db :as db] - [metabase.http-client :as http] - (metabase.models [session :refer [Session]] - [setting :as setting] - [user :refer [User]]) - (metabase [public-settings :as public-settings] - [setup :as setup]) - (metabase.test [data :refer :all] - [util :refer [match-$], :as tu]) - [metabase.util :as u])) - + [metabase + [http-client :as http] + [public-settings :as public-settings] + [setup :as setup]] + [metabase.test.util :as tu])) ;; ## POST /api/setup/user ;; Check that we can create a new superuser via setup-token diff --git a/test/metabase/api/table_test.clj b/test/metabase/api/table_test.clj index bf57737f34de365cfa1bcddaf361c8339e6ad60f..a1c576b298597662a4cf52400ef6255cbccd1666 100644 --- a/test/metabase/api/table_test.clj +++ b/test/metabase/api/table_test.clj @@ -1,23 +1,25 @@ (ns metabase.api.table-test "Tests for /api/table endpoints." (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :as hydrate]) - [toucan.util.test :as tt] - (metabase [driver :as driver] - [http-client :as http] - [middleware :as middleware]) - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [table :refer [Table]] - [permissions :as perms] - [permissions-group :as perms-group]) - [metabase.test.data :refer :all] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets] - [users :refer :all]) - [metabase.test.util :refer [match-$ resolve-private-vars], :as tu] - [metabase.util :as u])) + [metabase + [driver :as driver] + [http-client :as http] + [middleware :as middleware] + [util :as u]] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [permissions :as perms] + [permissions-group :as perms-group] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu :refer [match-$ resolve-private-vars]]] + [metabase.test.data + [dataset-definitions :as defs] + [users :refer :all]] + [toucan.hydrate :as hydrate] + [toucan.util.test :as tt])) (resolve-private-vars metabase.models.table pk-field-id) diff --git a/test/metabase/api/user_test.clj b/test/metabase/api/user_test.clj index 0cd8b13bf4fccbc33bffb055559fda29d39dc5c5..015c5d0884d08d08c8464f7e197fbd9f0c41601d 100644 --- a/test/metabase/api/user_test.clj +++ b/test/metabase/api/user_test.clj @@ -1,16 +1,17 @@ (ns metabase.api.user-test "Tests for /api/user endpoints." (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase [http-client :as http] - [middleware :as middleware]) - (metabase.models [session :refer [Session]] - [user :refer [User]]) - [metabase.test.data :refer :all] + [metabase + [http-client :as http] + [middleware :as middleware] + [util :as u]] + [metabase.models.user :refer [User]] + [metabase.test + [data :refer :all] + [util :as tu :refer [match-$ random-name]]] [metabase.test.data.users :refer :all] - [metabase.test.util :refer [match-$ random-name], :as tu] - [metabase.util :as u])) + [toucan.db :as db] + [toucan.util.test :as tt])) ;; ## /api/user/* AUTHENTICATION Tests ;; We assume that all endpoints for a given context are enforced by the same middleware, so we don't run the same diff --git a/test/metabase/cmd/load_from_h2_test.clj b/test/metabase/cmd/load_from_h2_test.clj index 3d3942f4773bce5f0f0b16c0e2fcd3145abd288e..230d90e2c44a31f9597fba82a33b9be9aff2588b 100644 --- a/test/metabase/cmd/load_from_h2_test.clj +++ b/test/metabase/cmd/load_from_h2_test.clj @@ -2,8 +2,8 @@ (:require [clojure.java.classpath :as classpath] [clojure.tools.namespace.find :as ns-find] [expectations :refer :all] - [toucan.models :as models] - metabase.cmd.load-from-h2)) + metabase.cmd.load-from-h2 + [toucan.models :as models])) ;; Check to make sure we're migrating all of our entities. ;; This fetches the `metabase.cmd.load-from-h2/entities` and compares it all existing entities diff --git a/test/metabase/db/metadata_queries_test.clj b/test/metabase/db/metadata_queries_test.clj index 612c4564d8fdf20aecea3719ce27362b792e401a..c557476186f8db909e31d4df860dcfbadc3fafe9 100644 --- a/test/metabase/db/metadata_queries_test.clj +++ b/test/metabase/db/metadata_queries_test.clj @@ -1,14 +1,12 @@ (ns metabase.db.metadata-queries-test - (:require [expectations :refer :all] - [toucan.db :as db] - [metabase.db.metadata-queries :refer :all] - (metabase.models [field :refer [Field]] - [table :refer [Table]]) + (:require [metabase.db.metadata-queries :refer :all] + [metabase.models + [field :refer [Field]] + [table :refer [Table]]] [metabase.query-processor-test :as qp-test] [metabase.test.data :refer :all] [metabase.test.data.datasets :as datasets])) - ;; Redshift & Crate tests are randomly failing -- see https://github.com/metabase/metabase/issues/2767 (def ^:private ^:const metadata-queries-test-engines (disj qp-test/non-timeseries-engines :redshift :crate)) diff --git a/test/metabase/db_test.clj b/test/metabase/db_test.clj index d1eefb25394df7926b814d243776022198a87cd8..d2cdc56839cf1e45f3c47fa89cc5c78d809f539b 100644 --- a/test/metabase/db_test.clj +++ b/test/metabase/db_test.clj @@ -1,6 +1,5 @@ (ns metabase.db-test (:require [expectations :refer :all] - metabase.db [metabase.test.util :as tu])) (tu/resolve-private-vars metabase.db parse-connection-string) diff --git a/test/metabase/driver/bigquery_test.clj b/test/metabase/driver/bigquery_test.clj index 976bf1d3410d88076d6b5c1b41f58b063ec2f709..2105db2bae7ed78a1c33deeb1ee1d1c712202b60 100644 --- a/test/metabase/driver/bigquery_test.clj +++ b/test/metabase/driver/bigquery_test.clj @@ -1,15 +1,13 @@ (ns metabase.driver.bigquery-test (:require [expectations :refer :all] - metabase.driver.bigquery - [metabase.models.database :as database] - [metabase.query-processor :as qp] + [metabase + [query-processor :as qp] + [query-processor-test :as qptest]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :as qptest] - [metabase.test.data :as data] - (metabase.test.data [datasets :refer [expect-with-engine]] - [interface :refer [def-database-definition]]) - [metabase.test.util :as tu])) - + [metabase.test + [data :as data] + [util :as tu]] + [metabase.test.data.datasets :refer [expect-with-engine]])) ;; Test native queries (expect-with-engine :bigquery diff --git a/test/metabase/driver/druid_test.clj b/test/metabase/driver/druid_test.clj index ff350e656dd44cfd1c85c7d85fdb0dc2ca13d598..46295750ab60f3d5b051066329a82d1a3b483928 100644 --- a/test/metabase/driver/druid_test.clj +++ b/test/metabase/driver/druid_test.clj @@ -1,15 +1,15 @@ (ns metabase.driver.druid-test (:require [cheshire.core :as json] - [expectations :refer :all] - [toucan.util.test :as tt] + [metabase + [query-processor :as qp] + [query-processor-test :refer [rows rows+column-names]] + [timeseries-query-processor-test :as timeseries-qp-test] + [util :as u]] [metabase.models.metric :refer [Metric]] - [metabase.query-processor :as qp] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer [rows rows+column-names]] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets, :refer [expect-with-engine]] - [metabase.timeseries-query-processor-test :as timeseries-qp-test] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets :refer [expect-with-engine]] + [toucan.util.test :as tt])) (def ^:const ^:private ^String native-query-1 (json/generate-string diff --git a/test/metabase/driver/generic_sql/native_test.clj b/test/metabase/driver/generic_sql/native_test.clj index 66f875f574eddbe8072265072aedeef24e6b6772..f30255b8377f3780264eb1bfe3629ef17502103b 100644 --- a/test/metabase/driver/generic_sql/native_test.clj +++ b/test/metabase/driver/generic_sql/native_test.clj @@ -1,9 +1,9 @@ (ns metabase.driver.generic-sql.native-test (:require [expectations :refer :all] - [toucan.db :as db] [metabase.models.database :refer [Database]] [metabase.query-processor :as qp] - [metabase.test.data :refer :all])) + [metabase.test.data :refer :all] + [toucan.db :as db])) ;; Just check that a basic query works (expect {:status :completed diff --git a/test/metabase/driver/generic_sql_test.clj b/test/metabase/driver/generic_sql_test.clj index 4c51952cf9e49066ce8c3f5276433e1511db5218..43beff8b14b5b6190fdc42bdc71ef255e3e120cb 100644 --- a/test/metabase/driver/generic_sql_test.clj +++ b/test/metabase/driver/generic_sql_test.clj @@ -1,15 +1,15 @@ (ns metabase.driver.generic-sql-test (:require [expectations :refer :all] - [toucan.db :as db] [metabase.driver :as driver] - (metabase.driver [generic-sql :refer :all] - h2) - (metabase.models [field :refer [Field]] - [table :refer [Table], :as table]) - [metabase.test.data :refer :all] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets]) - [metabase.test.util :refer [resolve-private-vars]]) + [metabase.driver.generic-sql :refer :all] + [metabase.models + [field :refer [Field]] + [table :as table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :refer [resolve-private-vars]]] + [metabase.test.data.datasets :as datasets] + [toucan.db :as db]) (:import metabase.driver.h2.H2Driver)) (def ^:private users-table (delay (Table :name "USERS"))) diff --git a/test/metabase/driver/google_analytics_test.clj b/test/metabase/driver/google_analytics_test.clj index 813c1cde242c5fb17b98d0c15391f562da10d1f7..881f9cf30653f9e3839a6e36ff08d18ffc521465 100644 --- a/test/metabase/driver/google_analytics_test.clj +++ b/test/metabase/driver/google_analytics_test.clj @@ -1,13 +1,8 @@ (ns metabase.driver.google-analytics-test "Tests for the Google Analytics driver and query processor." (:require [expectations :refer :all] - [toucan.db :as db] - [metabase.driver.googleanalytics :as ga] [metabase.driver.googleanalytics.query-processor :as qp] - [metabase.models.database :refer [Database]] - (metabase.query-processor [expand :as ql] - [interface :as qpi]) - [metabase.test.util :as tu] + [metabase.query-processor.interface :as qpi] [metabase.util :as u])) ;;; +------------------------------------------------------------------------------------------------------------------------+ diff --git a/test/metabase/driver/h2_test.clj b/test/metabase/driver/h2_test.clj index 7eb6dcc168aab3f3dce56ae3001b1eb80d33744d..eef8cf35b63f47cfcca88405c2fd9aa2b37be33c 100644 --- a/test/metabase/driver/h2_test.clj +++ b/test/metabase/driver/h2_test.clj @@ -1,7 +1,8 @@ (ns metabase.driver.h2-test (:require [expectations :refer :all] - [metabase.db :as mdb] - [metabase.driver :as driver] + [metabase + [db :as mdb] + [driver :as driver]] [metabase.driver.h2 :refer :all] [metabase.test.util :refer [resolve-private-vars]]) (:import metabase.driver.h2.H2Driver)) diff --git a/test/metabase/driver/mongo_test.clj b/test/metabase/driver/mongo_test.clj index 1387e674bc6939b26d293749344eb763b1c821f4..5a741a4d5093de05768b6e7dc83a6b6ed2abccea 100644 --- a/test/metabase/driver/mongo_test.clj +++ b/test/metabase/driver/mongo_test.clj @@ -1,23 +1,25 @@ (ns metabase.driver.mongo-test "Tests for Mongo driver." - (:require [clojure.walk :as walk] - [expectations :refer :all] - [toucan.db :as db] - [metabase.driver :as driver] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [field-values :refer [FieldValues]] - [table :refer [Table] :as table]) - [metabase.query-processor :as qp] + (:require [expectations :refer :all] + [metabase + [driver :as driver] + [query-processor :as qp] + [query-processor-test :refer [rows]]] + [metabase.models + [field :refer [Field]] + [field-values :refer [FieldValues]] + [table :as table :refer [Table]]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer [rows]] - [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.test.data.interface :as i] - [metabase.test.util :as tu]) - (:import org.bson.types.ObjectId - org.joda.time.DateTime - metabase.driver.mongo.MongoDriver)) + [metabase.test + [data :as data] + [util :as tu]] + [metabase.test.data + [datasets :as datasets] + [interface :as i]] + [toucan.db :as db]) + (:import metabase.driver.mongo.MongoDriver + org.bson.types.ObjectId + org.joda.time.DateTime)) ;; ## Constants + Helper Fns/Macros ;; TODO - move these to metabase.test-data ? diff --git a/test/metabase/driver/mysql_test.clj b/test/metabase/driver/mysql_test.clj index 797f3c96aa873b344defbd3fe4c4f679082a3fe9..8758296e5643a400e00546f22fc8e5ce15c4e7bc 100644 --- a/test/metabase/driver/mysql_test.clj +++ b/test/metabase/driver/mysql_test.clj @@ -1,16 +1,16 @@ (ns metabase.driver.mysql-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.driver [generic-sql :as sql] - mysql) + [metabase + [sync-database :as sync-db] + [util :as u]] + [metabase.driver.generic-sql :as sql] [metabase.models.database :refer [Database]] - [metabase.sync-database :as sync-db] [metabase.test.data :as data] - (metabase.test.data [datasets :refer [expect-with-engine]] - [interface :refer [def-database-definition]]) - [metabase.test.util :as tu] - [metabase.util :as u]) + [metabase.test.data + [datasets :refer [expect-with-engine]] + [interface :refer [def-database-definition]]] + [toucan.db :as db] + [toucan.util.test :as tt]) (:import metabase.driver.mysql.MySQLDriver)) ;; MySQL allows 0000-00-00 dates, but JDBC does not; make sure that MySQL is converting them to NULL when returning them like we asked diff --git a/test/metabase/driver/postgres_test.clj b/test/metabase/driver/postgres_test.clj index 165cf449c6da52a997da44388850e7ca9ec6ec22..c4aed69babef578293e99c109100fe89481e337a 100644 --- a/test/metabase/driver/postgres_test.clj +++ b/test/metabase/driver/postgres_test.clj @@ -2,21 +2,25 @@ (:require [clojure.java.jdbc :as jdbc] [expectations :refer :all] [honeysql.core :as hsql] - [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.driver :as driver] + [metabase + [driver :as driver] + [query-processor-test :refer [rows]] + [sync-database :as sync-db] + [util :as u]] [metabase.driver.generic-sql :as sql] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [table :refer [Table]]) - [metabase.query-processor-test :refer [rows]] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [table :refer [Table]]] [metabase.query-processor.expand :as ql] - [metabase.sync-database :as sync-db] - [metabase.test.data :as data] - (metabase.test.data [datasets :refer [expect-with-engine]] - [interface :as i]) - [metabase.test.util :as tu] - [metabase.util :as u]) + [metabase.test + [data :as data] + [util :as tu]] + [metabase.test.data + [datasets :refer [expect-with-engine]] + [interface :as i]] + [toucan.db :as db] + [toucan.util.test :as tt]) (:import metabase.driver.postgres.PostgresDriver)) (def ^:private ^PostgresDriver pg-driver (PostgresDriver.)) diff --git a/test/metabase/driver/presto_test.clj b/test/metabase/driver/presto_test.clj index 86502b962ef26390c1e6f3ae9c777b69409dc94d..190b56836899f57810ab99da0b235ff44a49be8b 100644 --- a/test/metabase/driver/presto_test.clj +++ b/test/metabase/driver/presto_test.clj @@ -1,13 +1,14 @@ (ns metabase.driver.presto-test (:require [expectations :refer :all] - [toucan.db :as db] [metabase.driver :as driver] [metabase.driver.generic-sql :as sql] [metabase.models.table :as table] - [metabase.test.data :as data] + [metabase.test + [data :as data] + [util :refer [resolve-private-vars]]] [metabase.test.data.datasets :as datasets] - [metabase.test.util :refer [resolve-private-vars]]) - (:import (metabase.driver.presto PrestoDriver))) + [toucan.db :as db]) + (:import metabase.driver.presto.PrestoDriver)) (resolve-private-vars metabase.driver.presto details->uri details->request parse-presto-results quote-name quote+combine-names apply-page) diff --git a/test/metabase/driver/sqlserver_test.clj b/test/metabase/driver/sqlserver_test.clj index 8837b20f14ab7640d2a850867314af7472b75979..fd492d874c20124279bd0a6505efd4b2735b531d 100644 --- a/test/metabase/driver/sqlserver_test.clj +++ b/test/metabase/driver/sqlserver_test.clj @@ -1,10 +1,10 @@ (ns metabase.driver.sqlserver-test - (:require [cheshire.core :as json] - [expectations :refer :all] - [metabase.test.data :as data] - (metabase.test.data [datasets :refer [expect-with-engine]] - [interface :refer [def-database-definition]]) - [metabase.test.util :refer [obj->json->obj]])) + (:require [metabase.test + [data :as data] + [util :refer [obj->json->obj]]] + [metabase.test.data + [datasets :refer [expect-with-engine]] + [interface :refer [def-database-definition]]])) ;;; ------------------------------------------------------------ VARCHAR(MAX) ------------------------------------------------------------ ;; VARCHAR(MAX) comes back from jTDS as a "ClobImpl" so make sure it gets encoded like a normal string by Cheshire diff --git a/test/metabase/email/messages_test.clj b/test/metabase/email/messages_test.clj index 8742571723a5dfb5c6b809c8f9916656dc55dbb8..451b783af8ebd8a1cb6d89b38d3c6a10ebc8491f 100644 --- a/test/metabase/email/messages_test.clj +++ b/test/metabase/email/messages_test.clj @@ -1,7 +1,7 @@ (ns metabase.email.messages-test (:require [expectations :refer :all] - [metabase.email-test :refer [with-fake-inbox inbox]] - [metabase.email.messages :refer :all])) + [metabase.email-test :refer [inbox with-fake-inbox]] + [metabase.email.messages :refer [send-new-user-email! send-password-reset-email!]])) ;; new user email ;; NOTE: we are not validating the content of the email body namely because it's got randomized elements and thus diff --git a/test/metabase/events/activity_feed_test.clj b/test/metabase/events/activity_feed_test.clj index ce07cf935733a088782042a1989a14ee209e0a6b..e7e41c27d6e713f3c8b5cccf4f00bc119cfa76ad 100644 --- a/test/metabase/events/activity_feed_test.clj +++ b/test/metabase/events/activity_feed_test.clj @@ -1,23 +1,18 @@ (ns metabase.events.activity-feed-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] [metabase.events.activity-feed :refer :all] - (metabase.models [activity :refer [Activity]] - [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [database :refer [Database]] - [metric :refer [Metric]] - [pulse :refer [Pulse]] - [segment :refer [Segment]] - [session :refer [Session]] - [table :refer [Table]] - [user :refer [User]]) + [metabase.models + [activity :refer [Activity]] + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [metric :refer [Metric]] + [pulse :refer [Pulse]] + [segment :refer [Segment]]] [metabase.test.data :refer :all] [metabase.test.data.users :refer [user->id]] - [metabase.test.util :as tu] - [metabase.test-setup :refer :all])) + [toucan.db :as db] + [toucan.util.test :as tt])) (defn- do-with-temp-activities [f] (db/delete! Activity) ; Not 100% sure this is neccessary anymore diff --git a/test/metabase/events/dependencies_test.clj b/test/metabase/events/dependencies_test.clj index 3b392e9c26063ce2030d74d7166dde4b76855232..dd1215d4ad04711556b9cdd0751da2c31b150b3b 100644 --- a/test/metabase/events/dependencies_test.clj +++ b/test/metabase/events/dependencies_test.clj @@ -1,19 +1,15 @@ (ns metabase.events.dependencies-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] [metabase.events.dependencies :refer :all] - (metabase.models [card :refer [Card]] - [database :refer [Database]] - [dependency :refer [Dependency]] - [metric :refer [Metric]] - [segment :refer [Segment]] - [table :refer [Table]]) + [metabase.models + [card :refer [Card]] + [database :refer [Database]] + [dependency :refer [Dependency]] + [metric :refer [Metric]] + [table :refer [Table]]] [metabase.test.data :refer :all] - [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.test-setup :refer :all])) - + [toucan.db :as db] + [toucan.util.test :as tt])) ;; `:card-create` event (expect diff --git a/test/metabase/events/last_login_test.clj b/test/metabase/events/last_login_test.clj index 407025235b29c27943cf4a53af3596ef82ee3516..8c565e77da88dbd003028397cd376326d1fa3774 100644 --- a/test/metabase/events/last_login_test.clj +++ b/test/metabase/events/last_login_test.clj @@ -1,10 +1,8 @@ (ns metabase.events.last-login-test (:require [expectations :refer :all] - [toucan.util.test :as tt] [metabase.events.last-login :refer [process-last-login-event]] [metabase.models.user :refer [User]] - [metabase.test.util :as tu])) - + [toucan.util.test :as tt])) ;; `:user-login` event (expect diff --git a/test/metabase/events/revision_test.clj b/test/metabase/events/revision_test.clj index ef56ae4507f773109b1879a3d40dd5d45ef6f5bc..7fbb6e7633d589194f9b39d5282a291b1fb304a2 100644 --- a/test/metabase/events/revision_test.clj +++ b/test/metabase/events/revision_test.clj @@ -1,20 +1,20 @@ (ns metabase.events.revision-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] [metabase.events.revision :refer [process-revision-event!]] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [database :refer [Database]] - [metric :refer [Metric]] - [revision :refer [Revision revisions]] - [segment :refer [Segment]] - [table :refer [Table]]) + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [database :refer [Database]] + [metric :refer [Metric]] + [revision :refer [Revision]] + [segment :refer [Segment]] + [table :refer [Table]]] [metabase.test.data :refer :all] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) (defn- card-properties "Some default properties for `Cards` for use in tests in this namespace." diff --git a/test/metabase/events/view_log_test.clj b/test/metabase/events/view_log_test.clj index 06d6ece2fcae634a5660a52b2da8c5132921517a..3e1fe5caf573553a60233a34c8538ec5cb6382fc 100644 --- a/test/metabase/events/view_log_test.clj +++ b/test/metabase/events/view_log_test.clj @@ -1,16 +1,12 @@ (ns metabase.events.view-log-test - (:require [expectations :refer :all] + (:require [metabase.events.view-log :refer :all] + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [user :refer [User]] + [view-log :refer [ViewLog]]] [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.events.view-log :refer :all] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [user :refer [User]] - [view-log :refer [ViewLog]]) - [metabase.test.data :refer :all] - [metabase.test.util :as tu] - [metabase.test-setup :refer :all])) - + [toucan.util.test :as tt])) ;; `:card-create` event (tt/expect-with-temp [User [user] diff --git a/test/metabase/http_client.clj b/test/metabase/http_client.clj index 595e351721f0372b9a6f0b80a69edfba26494855..9d3a572524bd986ceb614cb5d531d001d9894bbe 100644 --- a/test/metabase/http_client.clj +++ b/test/metabase/http_client.clj @@ -1,12 +1,12 @@ (ns metabase.http-client "HTTP client for making API calls against the Metabase API. For test/REPL purposes." - (:require [clojure.string :as s] - [clojure.tools.logging :as log] - [cheshire.core :as json] + (:require [cheshire.core :as json] [clj-http.client :as client] - [metabase.config :as config] - [metabase.util :as u])) - + [clojure.string :as s] + [clojure.tools.logging :as log] + [metabase + [config :as config] + [util :as u]])) ;;; build-url diff --git a/test/metabase/middleware_test.clj b/test/metabase/middleware_test.clj index 4fc7865afaee8c880268f1901aff3699c0bada09..e67b97392181bfdeaf83a484eb69696b59158206 100644 --- a/test/metabase/middleware_test.clj +++ b/test/metabase/middleware_test.clj @@ -1,15 +1,14 @@ (ns metabase.middleware-test (:require [cheshire.core :as json] [expectations :refer :all] - [ring.mock.request :as mock] - [toucan.db :as db] - [metabase.api.common :refer [*current-user-id* *current-user*]] - [metabase.middleware :refer :all] + [metabase + [middleware :refer :all] + [util :as u]] + [metabase.api.common :refer [*current-user* *current-user-id*]] [metabase.models.session :refer [Session]] - [metabase.test.data :refer :all] [metabase.test.data.users :refer :all] - [metabase.util :as u])) - + [ring.mock.request :as mock] + [toucan.db :as db])) ;; =========================== TEST wrap-session-id middleware =========================== diff --git a/test/metabase/models/card_test.clj b/test/metabase/models/card_test.clj index 901762df4cf7b56ce15b5e8ac6c744eb7373ad81..3f6cb57eddcb316acca67407fbcd5ade8f251864 100644 --- a/test/metabase/models/card_test.clj +++ b/test/metabase/models/card_test.clj @@ -1,19 +1,20 @@ (ns metabase.models.card-test (:require [expectations :refer :all] - [metabase.api.common :refer [*current-user-permissions-set* *is-superuser?*]] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer :all] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [interface :as mi] - [permissions :as perms]) + [metabase.api.common :refer [*current-user-permissions-set*]] + [metabase.models + [card :refer :all] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [interface :as mi] + [permissions :as perms]] [metabase.query-processor.expand :as ql] - [metabase.test.data :refer [id]] + [metabase.test + [data :refer [id]] + [util :as tu :refer [random-name]]] [metabase.test.data.users :refer :all] - [metabase.test.util :refer [random-name], :as tu] - [metabase.util :as u])) - + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) (defn- create-dash! [dash-name] ((user->client :rasta) :post 200 "dashboard" {:name dash-name})) diff --git a/test/metabase/models/collection_test.clj b/test/metabase/models/collection_test.clj index be6c7678c74c1d7e6c263ffd8641287364ecd29e..e04145d3d57864f534ecb69b5ae040835d741798 100644 --- a/test/metabase/models/collection_test.clj +++ b/test/metabase/models/collection_test.clj @@ -1,11 +1,11 @@ (ns metabase.models.collection-test (:require [expectations :refer :all] + [metabase.models + [card :refer [Card]] + [collection :refer [Collection]]] + [metabase.util :as u] [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [collection :refer [Collection]]) - [metabase.test.util :as tu] - [metabase.util :as u])) + [toucan.util.test :as tt])) ;; test that we can create a new Collection with valid inputs (expect diff --git a/test/metabase/models/dashboard_card_test.clj b/test/metabase/models/dashboard_card_test.clj index 055dae8f634fe031b5757623696d28ac8857f1e7..1baa795b693702627770a3938bc27be02c1d7dd3 100644 --- a/test/metabase/models/dashboard_card_test.clj +++ b/test/metabase/models/dashboard_card_test.clj @@ -1,15 +1,13 @@ (ns metabase.models.dashboard-card-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.models.card :refer [Card]] - [metabase.models.dashboard :refer [Dashboard]] - [metabase.models.dashboard-card :refer :all] - [metabase.models.dashboard-card-series :refer [DashboardCardSeries]] - [metabase.test.data :refer :all] + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer :all] + [dashboard-card-series :refer [DashboardCardSeries]]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu])) - + [toucan.db :as db] + [toucan.util.test :as tt])) (defn remove-ids-and-timestamps [m] (let [f (fn [v] diff --git a/test/metabase/models/dashboard_test.clj b/test/metabase/models/dashboard_test.clj index 429b9dd417fef60faf41b5b801fc30e7b8a0a47f..1c7afaf2e4d3b71502908ee60ef57d3acad7d9d2 100644 --- a/test/metabase/models/dashboard_test.clj +++ b/test/metabase/models/dashboard_test.clj @@ -1,15 +1,16 @@ (ns metabase.models.dashboard-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [dashboard :refer :all] - [dashboard-card :refer [DashboardCard], :as dashboard-card] - [dashboard-card-series :refer [DashboardCardSeries]]) - [metabase.test.data :refer :all] + [metabase.models + [card :refer [Card]] + [dashboard :refer :all] + [dashboard-card :as dashboard-card :refer [DashboardCard]] + [dashboard-card-series :refer [DashboardCardSeries]]] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu])) + [toucan.db :as db] + [toucan.util.test :as tt])) ;; ## Dashboard Revisions diff --git a/test/metabase/models/dependency_test.clj b/test/metabase/models/dependency_test.clj index 2fab46a0714a400e15c0b1bdf0b7ddcd21eb9d82..07eb81cb70c3685c3569eaec68ad373058d065e0 100644 --- a/test/metabase/models/dependency_test.clj +++ b/test/metabase/models/dependency_test.clj @@ -1,14 +1,12 @@ (ns metabase.models.dependency-test (:require [expectations :refer :all] - (toucan [db :as db] - [models :as models]) - [toucan.util.test :as tt] - (metabase.models [dependency :refer :all] - [interface :as i]) + [metabase.models.dependency :refer :all] [metabase.test.data :refer :all] - [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan + [db :as db] + [models :as models]] + [toucan.util.test :as tt])) (models/defmodel Mock :mock) diff --git a/test/metabase/models/field_test.clj b/test/metabase/models/field_test.clj index 600cb76494f3bb6a0fad8e18d0094dc972e5ce9e..0288dc81ddc14b5b209deb85fe7e1cc827e0d82c 100644 --- a/test/metabase/models/field_test.clj +++ b/test/metabase/models/field_test.clj @@ -1,11 +1,10 @@ (ns metabase.models.field-test (:require [expectations :refer :all] - (metabase.models [field :refer :all] - [field-values :refer :all]) - [metabase.test.data :refer :all] + [metabase.models + [field :refer :all] + [field-values :refer :all]] [metabase.test.util :as tu])) - ;; field-should-have-field-values? ;; retired/sensitive/hidden/details-only fields should always be excluded diff --git a/test/metabase/models/field_values_test.clj b/test/metabase/models/field_values_test.clj index 60e66bf2bb1b8ed4761fb6083adebe798a8e4d66..917b1c016445ce31237b32263bb373e03a4a7bdb 100644 --- a/test/metabase/models/field_values_test.clj +++ b/test/metabase/models/field_values_test.clj @@ -1,12 +1,12 @@ (ns metabase.models.field-values-test (:require [expectations :refer :all] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [field-values :refer :all] + [table :refer [Table]]] [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [field-values :refer :all] - [table :refer [Table]]) - [metabase.test.util :as tu])) + [toucan.util.test :as tt])) ;; ## TESTS FOR FIELD-SHOULD-HAVE-FIELD-VALUES? diff --git a/test/metabase/models/humanization_test.clj b/test/metabase/models/humanization_test.clj index 45917abf929bdee330410d829f192d1552166bed..5a6097de2ae9a8ba9ac711595ac94f13d6f1a85d 100644 --- a/test/metabase/models/humanization_test.clj +++ b/test/metabase/models/humanization_test.clj @@ -1,11 +1,12 @@ (ns metabase.models.humanization-test (:require [expectations :refer :all] + [metabase.models + [field :refer [Field]] + [humanization :refer :all] + [table :refer [Table]]] + [metabase.test.util :as tu] [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [field :refer [Field]] - [humanization :refer :all] - [table :refer [Table]]) - [metabase.test.util :as tu])) + [toucan.util.test :as tt])) (tu/resolve-private-vars metabase.models.humanization name->human-readable-name:simple name->human-readable-name:advanced) diff --git a/test/metabase/models/label_test.clj b/test/metabase/models/label_test.clj index 5cc0bf8ab6c06306d76443b02ddc57d6a935301a..5b3ccf8dc93ca3f21c2e46f3d74cfed805e76980 100644 --- a/test/metabase/models/label_test.clj +++ b/test/metabase/models/label_test.clj @@ -1,8 +1,8 @@ (ns metabase.models.label-test (:require [expectations :refer :all] + [metabase.models.label :refer [Label]] [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.models.label :refer [Label]])) + [toucan.util.test :as tt])) ;; Check that we can create a label with the name "Cam" (slug "cam") ;; and update the name to something that will produce the same slug ("cam") without getting a "name already taken" exception diff --git a/test/metabase/models/metric_test.clj b/test/metabase/models/metric_test.clj index 4ac4e9a7e4b793dd630d8b7f827bf5dc140d4541..40e8130aabcfd085480118a9ff70c9c3eea53f06 100644 --- a/test/metabase/models/metric_test.clj +++ b/test/metabase/models/metric_test.clj @@ -1,14 +1,15 @@ (ns metabase.models.metric-test (:require [expectations :refer :all] - [toucan.hydrate :refer [hydrate]] - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [metric :refer :all, :as metric] - [table :refer [Table]]) - [metabase.test.data :refer :all] + [metabase.models + [database :refer [Database]] + [metric :as metric :refer :all] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.util.test :as tt])) (def ^:private ^:const metric-defaults {:description nil diff --git a/test/metabase/models/permissions_group_test.clj b/test/metabase/models/permissions_group_test.clj index 6d38a17d0091aac0556be42ed2dbdaf42272f713..ac110f483ff351ec860b85b3b29fad39cd5d19b8 100644 --- a/test/metabase/models/permissions_group_test.clj +++ b/test/metabase/models/permissions_group_test.clj @@ -1,16 +1,15 @@ (ns metabase.models.permissions-group-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [permissions :refer [Permissions], :as perms] - [permissions-group :refer [PermissionsGroup], :as perm-group] - [permissions-group-membership :refer [PermissionsGroupMembership]] - [table :refer [Table]] - [user :refer [User]]) + [metabase.models + [database :refer [Database]] + [permissions :as perms :refer [Permissions]] + [permissions-group :as perm-group :refer [PermissionsGroup]] + [permissions-group-membership :refer [PermissionsGroupMembership]] + [user :refer [User]]] [metabase.test.data.users :as test-users] - [metabase.test.util :as tu] - [metabase.util.honeysql-extensions :as hx]) + [metabase.util.honeysql-extensions :as hx] + [toucan.db :as db] + [toucan.util.test :as tt]) (:import metabase.models.permissions_group.PermissionsGroupInstance)) ;;; ---------------------------------------- Check that the root entry for Admin was created ---------------------------------------- diff --git a/test/metabase/models/permissions_test.clj b/test/metabase/models/permissions_test.clj index 350a3081da6c0da17517b3ef61236efaf8c4fc96..53fcec186ca29ad0c00c19b192b86d709826f0e7 100644 --- a/test/metabase/models/permissions_test.clj +++ b/test/metabase/models/permissions_test.clj @@ -1,16 +1,13 @@ (ns metabase.models.permissions-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [permissions :as perms] - [permissions-group :refer [PermissionsGroup]] - [permissions-group-membership :refer [PermissionsGroupMembership]] - [table :refer [Table]]) + [metabase.models + [database :refer [Database]] + [permissions :as perms] + [permissions-group :refer [PermissionsGroup]] + [table :refer [Table]]] [metabase.test.data :as data] - [metabase.test.util :as tu] - [metabase.util :as u])) - + [metabase.util :as u] + [toucan.util.test :as tt])) ;;; ------------------------------------------------------------ valid-object-path? ------------------------------------------------------------ diff --git a/test/metabase/models/pulse_channel_test.clj b/test/metabase/models/pulse_channel_test.clj index 0eb2eb0017ca583a14e1eb6e26378c24960a2c2d..5e7079f8033abea8cc485a0b1a2f42e18fee9616 100644 --- a/test/metabase/models/pulse_channel_test.clj +++ b/test/metabase/models/pulse_channel_test.clj @@ -1,16 +1,16 @@ (ns metabase.models.pulse-channel-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [pulse :refer :all] - [pulse-channel :refer :all] - [pulse-channel-recipient :refer :all]) + [medley.core :as m] + [metabase.models + [pulse :refer :all] + [pulse-channel :refer :all] + [pulse-channel-recipient :refer :all]] [metabase.test.data :refer :all] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [medley.core :as m])) - + [toucan + [db :as db] + [hydrate :refer [hydrate]]] + [toucan.util.test :as tt])) ;; Test out our predicate functions diff --git a/test/metabase/models/pulse_test.clj b/test/metabase/models/pulse_test.clj index 1273f76fdf9ee15e90b83c403a3bbb60bb45b371..6771d417dfe97548101ba54f3373d2230c034e13 100644 --- a/test/metabase/models/pulse_test.clj +++ b/test/metabase/models/pulse_test.clj @@ -1,18 +1,19 @@ (ns metabase.models.pulse-test (:require [expectations :refer :all] [medley.core :as m] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [pulse :refer :all] - [pulse-card :refer :all] - [pulse-channel :refer :all] - [pulse-channel-recipient :refer :all]) + [metabase.models + [card :refer [Card]] + [pulse :refer :all] + [pulse-card :refer :all] + [pulse-channel :refer :all] + [pulse-channel-recipient :refer :all]] [metabase.test.data :refer :all] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan + [db :as db] + [hydrate :refer [hydrate]]] + [toucan.util.test :as tt])) (defn- user-details [username] diff --git a/test/metabase/models/revision/diff_test.clj b/test/metabase/models/revision/diff_test.clj index c4793e50f20cab454c96c65b8184de99ad51179e..949f95bbd39771497eeeda43061ddf3caa63f1a9 100644 --- a/test/metabase/models/revision/diff_test.clj +++ b/test/metabase/models/revision/diff_test.clj @@ -1,8 +1,7 @@ (ns metabase.models.revision.diff-test (:require [clojure.data :as data] - [metabase.models.revision.diff :refer :all] - [expectations :refer :all])) - + [expectations :refer :all] + [metabase.models.revision.diff :refer :all])) ;; Check that pattern matching allows specialization and that string only reflects the keys that have changed (expect "renamed this card from \"Tips by State\" to \"Spots by State\"." diff --git a/test/metabase/models/revision_test.clj b/test/metabase/models/revision_test.clj index e9ef875fe32edc7e7e61f727be63c835310ed139..7f89cba34e7a6f6957389fc1611d952d7931965a 100644 --- a/test/metabase/models/revision_test.clj +++ b/test/metabase/models/revision_test.clj @@ -1,13 +1,12 @@ (ns metabase.models.revision-test (:require [expectations :refer :all] - [medley.core :as m] - (toucan [db :as db] - [models :as models]) - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [revision :refer :all]) + [metabase.models + [card :refer [Card]] + [revision :refer :all]] [metabase.test.data.users :refer :all] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.models :as models] + [toucan.util.test :as tt])) (def ^:private reverted-to (atom nil)) diff --git a/test/metabase/models/segment_test.clj b/test/metabase/models/segment_test.clj index 7269dc7cb18f2206939ddcc7de209b5c2074ee07..3ab0668837460fbd8e3601477133f812560207f0 100644 --- a/test/metabase/models/segment_test.clj +++ b/test/metabase/models/segment_test.clj @@ -1,14 +1,15 @@ (ns metabase.models.segment-test (:require [expectations :refer :all] - [toucan.hydrate :refer [hydrate]] - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [segment :refer :all, :as segment] - [table :refer [Table]]) - [metabase.test.data :refer :all] + [metabase.models + [database :refer [Database]] + [segment :as segment :refer :all] + [table :refer [Table]]] + [metabase.test + [data :refer :all] + [util :as tu]] [metabase.test.data.users :refer :all] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.util.test :as tt])) (defn- user-details [username] diff --git a/test/metabase/models/session_test.clj b/test/metabase/models/session_test.clj index a6cbdb0dab72e89316d495e3312b0845ad0e0759..116d37556314866fadcd8b5928e9dc3543472866 100644 --- a/test/metabase/models/session_test.clj +++ b/test/metabase/models/session_test.clj @@ -1,12 +1,13 @@ (ns metabase.models.session-test (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [session :refer :all] - [user :refer [User]]) - [metabase.test.data.users :refer :all] + [metabase.models + [session :refer :all] + [user :refer [User]]] [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) + ;; first-session-for-user (expect "the-greatest-day-ever" diff --git a/test/metabase/models/setting_test.clj b/test/metabase/models/setting_test.clj index 89210b0fb8f358348952d00cd84b912fa3a1b28a..87461daa2ef65e30ac8fc1a8a2252745bfd41c0d 100644 --- a/test/metabase/models/setting_test.clj +++ b/test/metabase/models/setting_test.clj @@ -1,10 +1,8 @@ (ns metabase.models.setting-test (:require [expectations :refer :all] - [medley.core :as m] - [toucan.db :as db] - [metabase.models.setting :refer [defsetting Setting], :as setting] - (metabase.test [data :refer :all] - [util :refer :all]))) + [metabase.models.setting :as setting :refer [defsetting Setting]] + [metabase.test.util :refer :all] + [toucan.db :as db])) ;; ## TEST SETTINGS DEFINITIONS ;; TODO! These don't get loaded by `lein ring server` unless this file is touched diff --git a/test/metabase/models/user_test.clj b/test/metabase/models/user_test.clj index 23846543694240fbd81dee1861f31ff8d1de224f..2dc575a809e82b67dbf190aa8e8acaf3d13daf5d 100644 --- a/test/metabase/models/user_test.clj +++ b/test/metabase/models/user_test.clj @@ -1,18 +1,18 @@ (ns metabase.models.user-test (:require [clojure.string :as str] [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - [metabase.email-test :as email-test] - [metabase.http-client :as http] - (metabase.models [permissions :as perms] - [permissions-group :refer [PermissionsGroup]] - [permissions-group-membership :refer [PermissionsGroupMembership]] - [user :refer [User], :as user]) - [metabase.test.data.users :as test-users, :refer [user->id]] + [metabase + [email-test :as email-test] + [http-client :as http]] + [metabase.models + [permissions :as perms] + [permissions-group :refer [PermissionsGroup]] + [permissions-group-membership :refer [PermissionsGroupMembership]] + [user :as user :refer [User]]] + [metabase.test.data.users :as test-users :refer [user->id]] [metabase.test.util :as tu] - [metabase.util :as u])) - + [toucan.db :as db] + [toucan.util.test :as tt])) ;;; Tests for permissions-set diff --git a/test/metabase/permissions_collection_test.clj b/test/metabase/permissions_collection_test.clj index 7e5c19c7abd71024bba8cf5b3ca5d58e918c5a7d..2c5b2aeaa50e0bdf44bc97e5a29a51154dcc1220 100644 --- a/test/metabase/permissions_collection_test.clj +++ b/test/metabase/permissions_collection_test.clj @@ -1,17 +1,18 @@ (ns metabase.permissions-collection-test "A test suite for permissions `Collections`. Reüses functions from `metabase.permissions-test`." - (:require [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer [Card], :as card] - [collection :refer [Collection]] - [permissions :as permissions] - [permissions-group :as group] - [revision :refer [Revision]]) - [metabase.permissions-test :as perms-test, :refer [*card:db2-count-of-venues* *db2*]] - [metabase.test.data.users :as test-users] - [metabase.test.util :as tu] - [metabase.util :as u])) + (:require [expectations :refer :all] + [metabase + [permissions-test :as perms-test :refer [*card:db2-count-of-venues* *db2*]] + [util :as u]] + [metabase.models + [card :as card :refer [Card]] + [collection :refer [Collection]] + [permissions :as permissions] + [permissions-group :as group] + [revision :refer [Revision]]] + [metabase.test.data.users :as test-users] + [toucan.db :as db] + [toucan.util.test :as tt])) ;; the Card used in the tests below is one Crowberto (an admin) should be allowed to read/write based on data permissions, ;; but not Rasta (all-users) diff --git a/test/metabase/permissions_test.clj b/test/metabase/permissions_test.clj index 620503f26abac541a37ce6b4c4d81f3c35aa777d..43262069da6ce9d416f0daa4a6bfb8b31ab421aa 100644 --- a/test/metabase/permissions_test.clj +++ b/test/metabase/permissions_test.clj @@ -2,29 +2,28 @@ "A test suite around permissions. Nice!" (:require [clojure.string :as s] [expectations :refer :all] - [toucan.db :as db] - [toucan.util.test :as tt] - (metabase.models [card :refer [Card]] - [dashboard :refer [Dashboard]] - [dashboard-card :refer [DashboardCard]] - [database :refer [Database]] - [field :refer [Field]] - [metric :refer [Metric]] - [permissions :refer [Permissions], :as perms] - [permissions-group :refer [PermissionsGroup], :as group] - [permissions-group-membership :refer [PermissionsGroupMembership]] - [pulse :refer [Pulse]] - [pulse-card :refer [PulseCard]] - [pulse-channel :refer [PulseChannel]] - [pulse-channel-recipient :refer [PulseChannelRecipient]] - [segment :refer [Segment]] - [table :refer [Table]]) + [metabase.models + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [database :refer [Database]] + [field :refer [Field]] + [metric :refer [Metric]] + [permissions :as perms] + [permissions-group :as group :refer [PermissionsGroup]] + [permissions-group-membership :refer [PermissionsGroupMembership]] + [pulse :refer [Pulse]] + [pulse-card :refer [PulseCard]] + [pulse-channel :refer [PulseChannel]] + [pulse-channel-recipient :refer [PulseChannelRecipient]] + [segment :refer [Segment]] + [table :refer [Table]]] [metabase.query-processor.expand :as ql] - [metabase.sync-database :as sync] [metabase.test.data :as data] [metabase.test.data.users :as test-users] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.db :as db] + [toucan.util.test :as tt])) ;; 3 users: ;; crowberto, member of Admin, All Users diff --git a/test/metabase/query_processor/macros_test.clj b/test/metabase/query_processor/macros_test.clj index 8b526e8841a178112e48aac8b1a9cea18db80723..dcfa8e281b4fb92765d59ab93a704984ed2cb500 100644 --- a/test/metabase/query_processor/macros_test.clj +++ b/test/metabase/query_processor/macros_test.clj @@ -1,19 +1,20 @@ (ns metabase.query-processor.macros-test (:require [expectations :refer :all] - [toucan.util.test :as tt] - [metabase.models.database :refer [Database]] - [metabase.models.metric :refer [Metric]] - [metabase.models.segment :refer [Segment]] - [metabase.models.table :refer [Table]] - [metabase.query-processor :as qp] - (metabase.query-processor [expand :as ql] - [macros :refer :all]) - [metabase.query-processor-test :refer :all] + [metabase + [query-processor :as qp] + [query-processor-test :refer :all] + [util :as u]] + [metabase.models + [database :refer [Database]] + [metric :refer [Metric]] + [segment :refer [Segment]] + [table :refer [Table]]] + [metabase.query-processor + [expand :as ql] + [macros :refer :all]] [metabase.test.data :as data] - (metabase.test.data [datasets :as datasets] - [users :refer :all]) - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets] + [toucan.util.test :as tt])) ;; expand-macros diff --git a/test/metabase/query_processor/middleware/annotate_and_sort_test.clj b/test/metabase/query_processor/middleware/annotate_and_sort_test.clj index 4f9d5328bba1bb69d7991eeba20e28ce79baa051..a770dd0a0d106b2fbb83b0fbe6c3275c10073534 100644 --- a/test/metabase/query_processor/middleware/annotate_and_sort_test.clj +++ b/test/metabase/query_processor/middleware/annotate_and_sort_test.clj @@ -1,6 +1,5 @@ (ns metabase.query-processor.middleware.annotate-and-sort-test (:require [expectations :refer :all] - metabase.query-processor.middleware.annotate-and-sort [metabase.test.util :as tu])) (tu/resolve-private-vars metabase.query-processor.middleware.annotate-and-sort diff --git a/test/metabase/query_processor/middleware/cache_test.clj b/test/metabase/query_processor/middleware/cache_test.clj index 9a2f3afe91e5fcb54beedccd69ec417579ac5ef2..8631dbeda5404840d3b47365301fc1dd9e2a7d86 100644 --- a/test/metabase/query_processor/middleware/cache_test.clj +++ b/test/metabase/query_processor/middleware/cache_test.clj @@ -1,10 +1,10 @@ (ns metabase.query-processor.middleware.cache-test "Tests for the Query Processor cache." (:require [expectations :refer :all] - [toucan.db :as db] [metabase.models.query-cache :refer [QueryCache]] [metabase.query-processor.middleware.cache :as cache] - [metabase.test.util :as tu])) + [metabase.test.util :as tu] + [toucan.db :as db])) (tu/resolve-private-vars metabase.query-processor.middleware.cache is-cacheable? diff --git a/test/metabase/query_processor/parameters_test.clj b/test/metabase/query_processor/parameters_test.clj index c4d1ca106c86e7dac4d462e798bcc24ad6f06b49..225cd56fc4ff6ef6728561330afaecc1ae454763 100644 --- a/test/metabase/query_processor/parameters_test.clj +++ b/test/metabase/query_processor/parameters_test.clj @@ -1,21 +1,15 @@ (ns metabase.query-processor.parameters-test "Tests for *MBQL* parameter substitution." - (:require (clj-time [core :as t] - [format :as tf]) + (:require [clj-time.core :as t] [expectations :refer :all] - [metabase.driver :as driver] - (metabase.models [database :refer [Database]] - [metric :refer [Metric]] - [segment :refer [Segment]] - [table :refer [Table]]) - [metabase.query-processor :as qp] - (metabase.query-processor [expand :as ql] - [parameters :refer :all]) - [metabase.query-processor-test :refer [non-timeseries-engines first-row format-rows-by]] + [metabase + [query-processor :as qp] + [query-processor-test :refer [first-row format-rows-by non-timeseries-engines]]] + [metabase.query-processor + [expand :as ql] + [parameters :refer :all]] [metabase.test.data :as data] - (metabase.test.data [datasets :as datasets] - [users :refer :all]) - [metabase.test.util :as tu])) + [metabase.test.data.datasets :as datasets])) ;; we hard code "now" to a specific point in time so that we can control the test output (defn- test-date->range [value] diff --git a/test/metabase/query_processor/qp_middleware_test.clj b/test/metabase/query_processor/qp_middleware_test.clj index 5327ae2b3a0906ef9c4c0a54a8c26e5b542a59e7..b87fde9a750449add2ff4f599b0c337df97f8fa7 100644 --- a/test/metabase/query_processor/qp_middleware_test.clj +++ b/test/metabase/query_processor/qp_middleware_test.clj @@ -1,13 +1,13 @@ (ns metabase.query_processor.qp-middleware-test - (:require [expectations :refer :all] - [clj-time.coerce :as tc] + (:require [clj-time.coerce :as tc] + [expectations :refer :all] [metabase.driver :as driver] [metabase.models.setting :as setting] - (metabase.query-processor.middleware [add-row-count-and-status :as add-row-count-and-status] - [add-settings :as add-settings] - [catch-exceptions :as catch-exceptions] - [format-rows :as format-rows]))) - + [metabase.query-processor.middleware + [add-row-count-and-status :as add-row-count-and-status] + [add-settings :as add-settings] + [catch-exceptions :as catch-exceptions] + [format-rows :as format-rows]])) (defrecord TestDriver [] clojure.lang.Named diff --git a/test/metabase/query_processor/sql_parameters_test.clj b/test/metabase/query_processor/sql_parameters_test.clj index dda33ecf8b2442c1e0c354b4914fd7f1595774aa..2bd5f7aca3ab3621052df95cc2e4957f087614b8 100644 --- a/test/metabase/query_processor/sql_parameters_test.clj +++ b/test/metabase/query_processor/sql_parameters_test.clj @@ -1,19 +1,18 @@ (ns metabase.query-processor.sql-parameters-test (:require [clj-time.core :as t] [expectations :refer :all] - [toucan.db :as db] - [metabase.driver :as driver] - [metabase.models.table :as table] - [metabase.query-processor :as qp] + [metabase + [driver :as driver] + [query-processor :as qp] + [query-processor-test :refer [engines-that-support first-row format-rows-by]]] [metabase.query-processor.sql-parameters :refer :all] - [metabase.query-processor-test :refer [engines-that-support first-row format-rows-by]] - [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.test.data.generic-sql :as generic-sql] - [metabase.test.util :as tu] - [metabase.test.data.generic-sql :as generic] - [metabase.util :as u])) - + [metabase.test + [data :as data] + [util :as tu]] + [metabase.test.data + [datasets :as datasets] + [generic-sql :as generic-sql]] + [toucan.db :as db])) ;;; ------------------------------------------------------------ simple substitution -- {{x}} ------------------------------------------------------------ diff --git a/test/metabase/query_processor_test.clj b/test/metabase/query_processor_test.clj index 3e0fb4f0391f77122d15acba55ae9645e5121b12..dec254d8d3b617779831b2896b3678aaa0f2ec6a 100644 --- a/test/metabase/query_processor_test.clj +++ b/test/metabase/query_processor_test.clj @@ -4,12 +4,11 @@ Event-based DBs such as Druid are tested in `metabase.driver.event-query-processor-test`." (:require [clojure.set :as set] [clojure.tools.logging :as log] - [expectations :refer :all] - [metabase.driver :as driver] + [metabase + [driver :as driver] + [util :as u]] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - metabase.test.data.interface - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets])) ;; make sure all the driver test extension namespaces are loaded <3 ;; if this isn't done some things will get loaded at the wrong time which can end up causing test databases to be created more than once, which fails diff --git a/test/metabase/query_processor_test/aggregation_test.clj b/test/metabase/query_processor_test/aggregation_test.clj index d6b8267866176ce7e2bc01ae7810ebcb0366b60f..eb49a041dab4a1b6fd4e946c569261b42ff79569 100644 --- a/test/metabase/query_processor_test/aggregation_test.clj +++ b/test/metabase/query_processor_test/aggregation_test.clj @@ -1,11 +1,11 @@ (ns metabase.query-processor-test.aggregation-test "Tests for MBQL aggregations." - (:require [expectations :refer :all] + (:require [metabase + [query-processor-test :refer :all] + [util :as u]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets])) ;;; ------------------------------------------------------------ "COUNT" AGGREGATION ------------------------------------------------------------ diff --git a/test/metabase/query_processor_test/breakout_test.clj b/test/metabase/query_processor_test/breakout_test.clj index 0fa6a17bb207521b49de412bacfb75ae87736220..2d8ecbf89ceebf6be02d1828c73ce7fb828c7ec1 100644 --- a/test/metabase/query_processor_test/breakout_test.clj +++ b/test/metabase/query_processor_test/breakout_test.clj @@ -1,10 +1,8 @@ (ns metabase.query-processor-test.breakout-test "Tests for the `:breakout` clause." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] - [metabase.test.data :as data] - [metabase.util :as u])) + [metabase.test.data :as data])) ;;; single column (qp-expect-with-all-engines diff --git a/test/metabase/query_processor_test/date_bucketing_test.clj b/test/metabase/query_processor_test/date_bucketing_test.clj index 603e8d93057fb3fdafc4cd9473181f0a7b6fbef5..540aafc99ca38ae5c29f333b827e26207585cced 100644 --- a/test/metabase/query_processor_test/date_bucketing_test.clj +++ b/test/metabase/query_processor_test/date_bucketing_test.clj @@ -1,14 +1,15 @@ (ns metabase.query-processor-test.date-bucketing-test "Tests for date bucketing." - (:require [expectations :refer :all] - [metabase.driver :as driver] + (:require [metabase + [driver :as driver] + [query-processor-test :refer :all] + [util :as u]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets, :refer [*driver* *engine*]] - [interface :as i]) - [metabase.util :as u])) + [metabase.test.data + [dataset-definitions :as defs] + [datasets :as datasets :refer [*driver* *engine*]] + [interface :as i]])) (defn- ->long-if-number [x] (if (number? x) diff --git a/test/metabase/query_processor_test/expression_aggregations_test.clj b/test/metabase/query_processor_test/expression_aggregations_test.clj index 747632298f20e8afb7c0bad3d1f04a086e3abcfd..82fdb86b0915e16c5af646d0ae3b05488810a393 100644 --- a/test/metabase/query_processor_test/expression_aggregations_test.clj +++ b/test/metabase/query_processor_test/expression_aggregations_test.clj @@ -1,16 +1,15 @@ (ns metabase.query-processor-test.expression-aggregations-test "Tests for expression aggregations and for named aggregations." - (:require [expectations :refer :all] - [toucan.util.test :as tt] - [metabase.driver :as driver] + (:require [metabase + [driver :as driver] + [query-processor :as qp] + [query-processor-test :refer :all] + [util :as u]] [metabase.models.metric :refer [Metric]] - [metabase.query-processor :as qp] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets, :refer [*engine* *driver*]] - [metabase.test.util :as tu] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets :refer [*driver* *engine*]] + [toucan.util.test :as tt])) ;; sum, * (datasets/expect-with-engines (engines-that-support :expression-aggregations) diff --git a/test/metabase/query_processor_test/expressions_test.clj b/test/metabase/query_processor_test/expressions_test.clj index 1943853148b4538d2026a40d5b7fbd8b23d51a6e..4f9c6cc7acba696b2dd23089bbdbd81889410123 100644 --- a/test/metabase/query_processor_test/expressions_test.clj +++ b/test/metabase/query_processor_test/expressions_test.clj @@ -1,12 +1,14 @@ (ns metabase.query-processor-test.expressions-test "Tests for expressions (calculated columns)." (:require [expectations :refer :all] - (metabase.query-processor [expand :as ql] - [interface :as qpi]) - [metabase.query-processor-test :refer :all] + [metabase + [query-processor-test :refer :all] + [util :as u]] + [metabase.query-processor + [expand :as ql] + [interface :as qpi]] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets])) ;; Test the expansion of the expressions clause (expect diff --git a/test/metabase/query_processor_test/field_visibility_test.clj b/test/metabase/query_processor_test/field_visibility_test.clj index 32b202a750faa107ca8cccb462f63a8a7b4014fb..e012dd68df107392c47f632fb664a15da4881d9e 100644 --- a/test/metabase/query_processor_test/field_visibility_test.clj +++ b/test/metabase/query_processor_test/field_visibility_test.clj @@ -1,12 +1,10 @@ (ns metabase.query-processor-test.field-visibility-test "Tests for behavior of fields with different visibility settings." - (:require [expectations :refer :all] - [toucan.db :as db] - [metabase.models.field :refer [Field]] - [metabase.query-processor.expand :as ql] + (:require [metabase.models.field :refer [Field]] [metabase.query-processor-test :refer :all] + [metabase.query-processor.expand :as ql] [metabase.test.data :as data] - [metabase.util :as u])) + [toucan.db :as db])) ;;; ------------------------------------------------------------ :details-only fields ------------------------------------------------------------ ;; make sure that rows where visibility_type = details-only are included and properly marked up diff --git a/test/metabase/query_processor_test/fields_test.clj b/test/metabase/query_processor_test/fields_test.clj index 6cbc157b271c3f39a6564b6eb90218439967dfed..0994dac31e96d6e355b452f468a3da16387026c4 100644 --- a/test/metabase/query_processor_test/fields_test.clj +++ b/test/metabase/query_processor_test/fields_test.clj @@ -1,10 +1,8 @@ (ns metabase.query-processor-test.fields-test "Tests for the `:fields` clause." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] - [metabase.test.data :as data] - [metabase.util :as u])) + [metabase.test.data :as data])) ;; Test that we can restrict the Fields that get returned to the ones specified, and that results come back in the order of the IDs in the `fields` clause (qp-expect-with-all-engines diff --git a/test/metabase/query_processor_test/filter_test.clj b/test/metabase/query_processor_test/filter_test.clj index acb559dfefca2a6d512a384d539230c9c76b30cc..1061d553afb9f392d99fb7b6458051c5f892fd51 100644 --- a/test/metabase/query_processor_test/filter_test.clj +++ b/test/metabase/query_processor_test/filter_test.clj @@ -1,12 +1,8 @@ (ns metabase.query-processor-test.filter-test "Tests for the `:filter` clause." - (:require [expectations :refer :all] - (metabase.query-processor [expand :as ql] - [interface :as qpi]) - [metabase.query-processor-test :refer :all] - [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + (:require [metabase.query-processor-test :refer :all] + [metabase.query-processor.expand :as ql] + [metabase.test.data :as data])) ;;; ------------------------------------------------------------ "FILTER" CLAUSE ------------------------------------------------------------ diff --git a/test/metabase/query_processor_test/joins_test.clj b/test/metabase/query_processor_test/joins_test.clj index 239660d7783fb1b637b3fb2891d2e758939dd492..f79c151f05a0e27a62bb6520c00ebdb372c29f6d 100644 --- a/test/metabase/query_processor_test/joins_test.clj +++ b/test/metabase/query_processor_test/joins_test.clj @@ -1,11 +1,9 @@ (ns metabase.query-processor-test.joins-test "Test for JOIN behavior." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets])) ;; The top 10 cities by number of Tupac sightings ;; Test that we can breakout on an FK field (Note how the FK Field is returned in the results) diff --git a/test/metabase/query_processor_test/middleware/limit_test.clj b/test/metabase/query_processor_test/middleware/limit_test.clj index 815697c715454e7127518fc49e70ab33304d6734..dcfe3586e1a1e40c7bf3f634484d15d61d85ed85 100644 --- a/test/metabase/query_processor_test/middleware/limit_test.clj +++ b/test/metabase/query_processor_test/middleware/limit_test.clj @@ -1,11 +1,8 @@ (ns metabase.query-processor-test.middleware.limit-test "Tests for the `:limit` clause and `:max-results` constraints." (:require [expectations :refer :all] - (metabase.query-processor [expand :as ql] - [interface :as i]) - [metabase.query-processor.middleware.limit :as limit] - [metabase.query-processor-test :refer :all] - [metabase.util :as u])) + [metabase.query-processor.interface :as i] + [metabase.query-processor.middleware.limit :as limit])) ;;; ------------------------------------------------------------ LIMIT-MAX-RESULT-ROWS ------------------------------------------------------------ ;; Apply limit-max-result-rows to an infinite sequence and make sure it gets capped at `i/absolute-max-results` diff --git a/test/metabase/query_processor_test/nested_field_test.clj b/test/metabase/query_processor_test/nested_field_test.clj index b1847ec5aa33470cf40aac18c1d54e11f2d74264..d6ba58e109631639aea0b3996fde4d1dc735106e 100644 --- a/test/metabase/query_processor_test/nested_field_test.clj +++ b/test/metabase/query_processor_test/nested_field_test.clj @@ -1,11 +1,9 @@ (ns metabase.query-processor-test.nested-field-test "Tests for nested field access." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets])) ;;; Nested Field in FILTER ;; Get the first 10 tips where tip.venue.name == "Kyle's Low-Carb Grill" diff --git a/test/metabase/query_processor_test/order_by_test.clj b/test/metabase/query_processor_test/order_by_test.clj index 5865ea14172a6a461e68cb55e3a51bdb6f2ad7bf..b73d08497a5f6e2058159b09cc8f374469522749 100644 --- a/test/metabase/query_processor_test/order_by_test.clj +++ b/test/metabase/query_processor_test/order_by_test.clj @@ -1,12 +1,10 @@ (ns metabase.query-processor-test.order-by-test "Tests for the `:order-by` clause." (:require [clojure.math.numeric-tower :as math] - [expectations :refer :all] - [metabase.query-processor.expand :as ql] [metabase.query-processor-test :refer :all] + [metabase.query-processor.expand :as ql] [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets, :refer [*engine*]] - [metabase.util :as u])) + [metabase.test.data.datasets :as datasets :refer [*engine*]])) (expect-with-non-timeseries-dbs [[1 12 375] diff --git a/test/metabase/query_processor_test/page_test.clj b/test/metabase/query_processor_test/page_test.clj index c08cec6b66fe55b537c39c01d9f25bcee335f9e1..4a6e3c44ee6eaf40a39e3a2a83c959b8aa5afe2e 100644 --- a/test/metabase/query_processor_test/page_test.clj +++ b/test/metabase/query_processor_test/page_test.clj @@ -1,10 +1,8 @@ (ns metabase.query-processor-test.page-test "Tests for the `:page` clause." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] - [metabase.test.data :as data] - [metabase.util :as u])) + [metabase.test.data :as data])) ;; Test that we can get "pages" of results. diff --git a/test/metabase/query_processor_test/parameters_test.clj b/test/metabase/query_processor_test/parameters_test.clj index 367d0e7468225d18ba94488eb58a2a86da4b7fca..d4ac9682b63eb4e7a96fc0f275b97eeac9ed6950 100644 --- a/test/metabase/query_processor_test/parameters_test.clj +++ b/test/metabase/query_processor_test/parameters_test.clj @@ -1,11 +1,10 @@ (ns metabase.query-processor-test.parameters_test "Tests for query parameters." - (:require [expectations :refer :all] - [metabase.query-processor :as qp] + (:require [metabase + [query-processor :as qp] + [query-processor-test :refer :all]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] - [metabase.test.data :as data] - [metabase.util :as u])) + [metabase.test.data :as data])) (expect-with-non-timeseries-dbs [[9 "Nils Gotam"]] diff --git a/test/metabase/query_processor_test/unix_timestamp_test.clj b/test/metabase/query_processor_test/unix_timestamp_test.clj index 252486e26e0973506d6d0249933f790d4eb3016a..fab6284521ee61a44ee24b72c41d37071f0526f4 100644 --- a/test/metabase/query_processor_test/unix_timestamp_test.clj +++ b/test/metabase/query_processor_test/unix_timestamp_test.clj @@ -1,12 +1,11 @@ (ns metabase.query-processor-test.unix-timestamp-test "Tests for UNIX timestamp support." - (:require [expectations :refer :all] + (:require [metabase.query-processor-test :refer :all] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer :all] [metabase.test.data :as data] - (metabase.test.data [datasets :as datasets, :refer [*engine* *driver*]] - [interface :as i]) - [metabase.util :as u])) + [metabase.test.data + [datasets :as datasets :refer [*driver* *engine*]] + [interface :as i]])) ;; There were 9 "sad toucan incidents" on 2015-06-02 (expect-with-non-timeseries-dbs diff --git a/test/metabase/sync_database/introspect_test.clj b/test/metabase/sync_database/introspect_test.clj index 46e1258630a647e27edbfb4da54cd899d49c3a78..826c63d5e67e8589365999e699689fb8a7398042 100644 --- a/test/metabase/sync_database/introspect_test.clj +++ b/test/metabase/sync_database/introspect_test.clj @@ -1,15 +1,16 @@ (ns metabase.sync-database.introspect-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [raw-column :refer [RawColumn]] - [raw-table :refer [RawTable]]) + [metabase.models + [database :refer [Database]] + [raw-column :refer [RawColumn]] + [raw-table :refer [RawTable]]] [metabase.sync-database.introspect :as introspect] [metabase.test.mock.moviedb :as moviedb] [metabase.test.util :as tu] - [metabase.util :as u])) + [toucan + [db :as db] + [hydrate :refer [hydrate]]] + [toucan.util.test :as tt])) (tu/resolve-private-vars metabase.sync-database.introspect save-all-table-columns! save-all-table-fks! create-raw-table! update-raw-table! disable-raw-tables!) diff --git a/test/metabase/sync_database/sync_dynamic_test.clj b/test/metabase/sync_database/sync_dynamic_test.clj index 568af064bb8739d0f87ba22df628fd83fd428156..8876096b732e6b1be70e08a65117ed808bc2d6b7 100644 --- a/test/metabase/sync_database/sync_dynamic_test.clj +++ b/test/metabase/sync_database/sync_dynamic_test.clj @@ -1,16 +1,19 @@ (ns metabase.sync-database.sync-dynamic-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [raw-table :refer [RawTable]] - [table :refer [Table]]) - (metabase.sync-database [introspect :as introspect] - [sync-dynamic :refer :all]) + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [raw-table :refer [RawTable]] + [table :refer [Table]]] + [metabase.sync-database + [introspect :as introspect] + [sync-dynamic :refer :all]] [metabase.test.mock.toucanery :as toucanery] - [metabase.test.util :as tu])) + [metabase.test.util :as tu] + [toucan + [db :as db] + [hydrate :refer [hydrate]]] + [toucan.util.test :as tt])) (tu/resolve-private-vars metabase.sync-database.sync-dynamic save-table-fields!) diff --git a/test/metabase/sync_database/sync_test.clj b/test/metabase/sync_database/sync_test.clj index 02fd816db0a93210d724f6991b5f9730c68f34c5..f41579d6f4b2ae5c86646478aecf14e706201f36 100644 --- a/test/metabase/sync_database/sync_test.clj +++ b/test/metabase/sync_database/sync_test.clj @@ -1,20 +1,25 @@ (ns metabase.sync-database.sync-test (:require [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [raw-column :refer [RawColumn]] - [raw-table :refer [RawTable]] - [table :refer [Table]]) - (metabase.sync-database [introspect :as introspect] - [sync :refer :all]) - [metabase.test.data :as data] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [raw-column :refer [RawColumn]] + [raw-table :refer [RawTable]] + [table :refer [Table]]] + [metabase.sync-database + [introspect :as introspect] + [sync :refer :all]] + [metabase.test + [data :as data] + [util :as tu]] [metabase.test.data.interface :as i] - (metabase.test.mock [moviedb :as moviedb] - [schema-per-customer :as schema-per-customer]) - [metabase.test.util :as tu])) + [metabase.test.mock + [moviedb :as moviedb] + [schema-per-customer :as schema-per-customer]] + [toucan + [db :as db] + [hydrate :refer [hydrate]]] + [toucan.util.test :as tt])) (tu/resolve-private-vars metabase.sync-database.sync save-fks! save-table-fields!) diff --git a/test/metabase/sync_database_test.clj b/test/metabase/sync_database_test.clj index d44d2967019187c16c3f7692855d908b6abc442e..7a8c4628e520fe7f13675fcdfb1d6b25e77e2fa1 100644 --- a/test/metabase/sync_database_test.clj +++ b/test/metabase/sync_database_test.clj @@ -2,23 +2,24 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as str] [expectations :refer :all] - (toucan [db :as db] - [hydrate :refer [hydrate]]) - [toucan.util.test :as tt] - (metabase [db :as mdb] - [driver :as driver]) + [metabase + [db :as mdb] + [driver :as driver] + [sync-database :refer :all] + [util :as u]] [metabase.driver.generic-sql :as sql] - (metabase.models [database :refer [Database]] - [field :refer [Field]] - [field-values :refer [FieldValues]] - [raw-table :refer [RawTable]] - [table :refer [Table]]) - [metabase.sync-database :refer :all] + [metabase.models + [database :refer [Database]] + [field :refer [Field]] + [field-values :refer [FieldValues]] + [raw-table :refer [RawTable]] + [table :refer [Table]]] metabase.sync-database.analyze - [metabase.test.data :refer :all] - [metabase.test.data.interface :as i] - [metabase.test.util :refer [resolve-private-vars] :as tu] - [metabase.util :as u])) + [metabase.test + [data :refer :all] + [util :as tu]] + [toucan.db :as db] + [toucan.util.test :as tt])) (def ^:private ^:const sync-test-tables {"movie" {:name "movie" diff --git a/test/metabase/task/follow_up_emails_test.clj b/test/metabase/task/follow_up_emails_test.clj index 67b71ca57084bc86a44434b8a01aceaca74fbdb1..af71d329d54fcb349b798f57ace6ceee6b998b17 100644 --- a/test/metabase/task/follow_up_emails_test.clj +++ b/test/metabase/task/follow_up_emails_test.clj @@ -1,7 +1,6 @@ (ns metabase.task.follow-up-emails-test (:require [expectations :refer :all] - [metabase.email-test :refer [with-fake-inbox inbox]] - metabase.task.follow-up-emails + [metabase.email-test :refer [inbox with-fake-inbox]] [metabase.test.data.users :as test-users] [metabase.test.util :as tu])) diff --git a/test/metabase/test/data.clj b/test/metabase/test/data.clj index e9c03c565ceb04a22adb430048311fd044429dfc..09a49d748858a05f77da2fb9f6ead44c2676e365 100644 --- a/test/metabase/test/data.clj +++ b/test/metabase/test/data.clj @@ -1,27 +1,28 @@ (ns metabase.test.data "Code related to creating and deleting test databases + datasets." - (:require (clojure [string :as str] - [walk :as walk]) + (:require [clojure + [string :as str] + [walk :as walk]] [clojure.tools.logging :as log] + [metabase + [driver :as driver] + [query-processor :as qp] + [sync-database :as sync-database] + [util :as u]] + [metabase.models + [database :refer [Database]] + [field :as field :refer [Field]] + [table :refer [Table]]] + [metabase.query-processor + [expand :as ql] + [interface :as qi]] + [metabase.test.data + [dataset-definitions :as defs] + [datasets :refer [*driver*]] + [interface :as i]] [schema.core :as s] - [toucan.db :as db] - [metabase.driver :as driver] - (metabase.models [database :refer [Database]] - [field :refer [Field] :as field] - [table :refer [Table]]) - [metabase.query-processor :as qp] - [metabase.query-processor.expand :as ql] - [metabase.query-processor.interface :as qi] - [metabase.sync-database :as sync-database] - (metabase.test.data [datasets :refer [*driver*]] - [dataset-definitions :as defs] - [h2 :as h2] - [interface :as i]) - [metabase.util :as u]) - (:import clojure.lang.Keyword - (metabase.test.data.interface DatabaseDefinition - FieldDefinition - TableDefinition))) + [toucan.db :as db]) + (:import [metabase.test.data.interface DatabaseDefinition TableDefinition])) (declare get-or-create-database!) diff --git a/test/metabase/test/data/bigquery.clj b/test/metabase/test/data/bigquery.clj index eacaf81f00d0d2d6d355368101f22d0746cc01b5..29085d4a232307c0d72bd386e2a46e4f9dc969de 100644 --- a/test/metabase/test/data/bigquery.clj +++ b/test/metabase/test/data/bigquery.clj @@ -2,17 +2,17 @@ (:require [clojure.string :as s] [environ.core :refer [env]] [medley.core :as m] - [metabase.driver.google :as google] - [metabase.driver.bigquery :as bigquery] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets] - [interface :as i]) + [metabase.driver + [bigquery :as bigquery] + [google :as google]] + [metabase.test.data + [datasets :as datasets] + [interface :as i]] [metabase.test.util :refer [resolve-private-vars]] [metabase.util :as u]) - (:import java.util.Arrays - com.google.api.client.util.DateTime + (:import com.google.api.client.util.DateTime com.google.api.services.bigquery.Bigquery - (com.google.api.services.bigquery.model Dataset DatasetReference QueryRequest Table TableDataInsertAllRequest TableDataInsertAllRequest$Rows TableFieldSchema TableReference TableRow TableSchema) + [com.google.api.services.bigquery.model Dataset DatasetReference QueryRequest Table TableDataInsertAllRequest TableDataInsertAllRequest$Rows TableFieldSchema TableReference TableRow TableSchema] metabase.driver.bigquery.BigQueryDriver)) (resolve-private-vars metabase.driver.bigquery post-process-native) diff --git a/test/metabase/test/data/druid.clj b/test/metabase/test/data/druid.clj index 0f24351c182126adabbbb5461eb799b8bf687d45..d25cb24d1b1cfa587010a5f6b206b612599daca1 100644 --- a/test/metabase/test/data/druid.clj +++ b/test/metabase/test/data/druid.clj @@ -1,11 +1,10 @@ (ns metabase.test.data.druid - (:require [clojure.java.io :as io] - [cheshire.core :as json] + (:require [cheshire.core :as json] + [clojure.java.io :as io] [environ.core :refer [env]] - [metabase.driver.druid :as druid] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets] - [interface :as i]) + [metabase.test.data + [dataset-definitions :as defs] + [interface :as i]] [metabase.test.util :refer [resolve-private-vars]] [metabase.util :as u]) (:import metabase.driver.druid.DruidDriver)) diff --git a/test/metabase/test/data/generic_sql.clj b/test/metabase/test/data/generic_sql.clj index 49a3b4fe11ae5f064e3f9f7ccb691e58422c2611..8568cc34e36177d33640e969cbb94e0ba275682f 100644 --- a/test/metabase/test/data/generic_sql.clj +++ b/test/metabase/test/data/generic_sql.clj @@ -2,22 +2,20 @@ "Common functionality for various Generic SQL dataset drivers." (:require [clojure.java.jdbc :as jdbc] [clojure.string :as s] - [clojure.tools.logging :as log] - (honeysql [core :as hsql] - [format :as hformat] - [helpers :as h]) + [honeysql + [core :as hsql] + [format :as hformat] + [helpers :as h]] [medley.core :as m] - [metabase.driver :as driver] [metabase.driver.generic-sql :as sql] - (metabase.test.data [datasets :as datasets] - [interface :as i]) + [metabase.test.data + [datasets :as datasets] + [interface :as i]] [metabase.util :as u] [metabase.util.honeysql-extensions :as hx]) - (:import java.sql.SQLException - clojure.lang.Keyword - (metabase.test.data.interface DatabaseDefinition - FieldDefinition - TableDefinition))) + (:import clojure.lang.Keyword + java.sql.SQLException + [metabase.test.data.interface DatabaseDefinition FieldDefinition TableDefinition])) ;;; ## ------------------------------------------------------------ IGenericDatasetLoader + default impls ------------------------------------------------------------ diff --git a/test/metabase/test/data/h2.clj b/test/metabase/test/data/h2.clj index 46ff6757f9216215db1c97bdd8de090439cb0959..79de008ec4ec94aca8abb677654bec342576e4c6 100644 --- a/test/metabase/test/data/h2.clj +++ b/test/metabase/test/data/h2.clj @@ -1,11 +1,10 @@ (ns metabase.test.data.h2 "Code for creating / destroying an H2 database from a `DatabaseDefinition`." - (:require [clojure.core.reducers :as r] - [clojure.string :as s] + (:require [clojure.string :as s] [metabase.db.spec :as dbspec] - metabase.driver.h2 - (metabase.test.data [generic-sql :as generic] - [interface :as i]) + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.h2.H2Driver)) diff --git a/test/metabase/test/data/interface.clj b/test/metabase/test/data/interface.clj index f460946e7dac64caedca25ce1ad18eef7cc67eb0..8a29f32c65568d54861745fdbc31d6409957ea2b 100644 --- a/test/metabase/test/data/interface.clj +++ b/test/metabase/test/data/interface.clj @@ -4,14 +4,16 @@ Objects that implement `IDatasetLoader` know how to load a `DatabaseDefinition` into an actual physical RDMS database. This functionality allows us to easily test with multiple datasets." (:require [clojure.string :as str] - [schema.core :as s] - (metabase [db :as db] - [driver :as driver]) - (metabase.models [database :refer [Database]] - [field :refer [Field] :as field] - [table :refer [Table]]) - [metabase.util :as u] - [metabase.util.schema :as su]) + [metabase + [db :as db] + [driver :as driver] + [util :as u]] + [metabase.models + [database :refer [Database]] + [field :as field :refer [Field]] + [table :refer [Table]]] + [metabase.util.schema :as su] + [schema.core :as s]) (:import clojure.lang.Keyword)) (s/defrecord FieldDefinition [field-name :- su/NonBlankString diff --git a/test/metabase/test/data/mongo.clj b/test/metabase/test/data/mongo.clj index 22e398c61b466d7a044e742df6a9476845269ec6..52e2c40fbb1bcf67fbdb37adc740bfb7b741d1b8 100644 --- a/test/metabase/test/data/mongo.clj +++ b/test/metabase/test/data/mongo.clj @@ -1,10 +1,10 @@ (ns metabase.test.data.mongo - (:require (monger [collection :as mc] - [core :as mg]) - metabase.driver.mongo - [metabase.driver.mongo.util :refer [with-mongo-connection]] + (:require [metabase.driver.mongo.util :refer [with-mongo-connection]] [metabase.test.data.interface :as i] - [metabase.util :as u]) + [metabase.util :as u] + [monger + [collection :as mc] + [core :as mg]]) (:import metabase.driver.mongo.MongoDriver)) (defn- database->connection-details diff --git a/test/metabase/test/data/mysql.clj b/test/metabase/test/data/mysql.clj index 216d4c4f2894d06c7b3d83d5b1f2f8ac1abdb6ac..2e76092bd7ca0c2b70b6e2e351beee3bbcb95f55 100644 --- a/test/metabase/test/data/mysql.clj +++ b/test/metabase/test/data/mysql.clj @@ -1,10 +1,9 @@ (ns metabase.test.data.mysql "Code for creating / destroying a MySQL database from a `DatabaseDefinition`." - (:require [clojure.string :as s] - [environ.core :refer [env]] - metabase.driver.mysql - (metabase.test.data [generic-sql :as generic] - [interface :as i]) + (:require [environ.core :refer [env]] + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.mysql.MySQLDriver)) diff --git a/test/metabase/test/data/oracle.clj b/test/metabase/test/data/oracle.clj index 31893cea4cf86a7091b29341754715e0edfdcad8..c298352a3b0b71fcb44ba2cb8ba459594f21fbf1 100644 --- a/test/metabase/test/data/oracle.clj +++ b/test/metabase/test/data/oracle.clj @@ -3,10 +3,9 @@ [clojure.string :as s] [environ.core :refer [env]] [metabase.driver.generic-sql :as sql] - [metabase.test.data :as data] - (metabase.test.data [datasets :as datasets] - [generic-sql :as generic] - [interface :as i]) + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.oracle.OracleDriver)) diff --git a/test/metabase/test/data/postgres.clj b/test/metabase/test/data/postgres.clj index 6ca22ba89f54a04319fbfaa9c5161014766a0f6b..f29d95c45b01c2d4199cba64d35783c98312b768 100644 --- a/test/metabase/test/data/postgres.clj +++ b/test/metabase/test/data/postgres.clj @@ -1,10 +1,9 @@ (ns metabase.test.data.postgres "Code for creating / destroying a Postgres database from a `DatabaseDefinition`." (:require [environ.core :refer [env]] - (metabase.driver [generic-sql :as sql] - postgres) - (metabase.test.data [generic-sql :as generic] - [interface :as i]) + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.postgres.PostgresDriver)) diff --git a/test/metabase/test/data/presto.clj b/test/metabase/test/data/presto.clj index 790907b1abf8aef6f032d5bdc710f1c8ee235c7c..cb8863953aa0c1bd7c257b3291b8b5bc747530ce 100644 --- a/test/metabase/test/data/presto.clj +++ b/test/metabase/test/data/presto.clj @@ -1,16 +1,15 @@ (ns metabase.test.data.presto (:require [clojure.string :as s] [environ.core :refer [env]] - (honeysql [core :as hsql] - [helpers :as h]) + [honeysql + [core :as hsql] + [helpers :as h]] [metabase.driver.generic-sql.util.unprepare :as unprepare] [metabase.test.data.interface :as i] [metabase.test.util :refer [resolve-private-vars]] - [metabase.util :as u] - [metabase.util.honeysql-extensions :as hx]) + [metabase.util :as u]) (:import java.util.Date - metabase.driver.presto.PrestoDriver - (metabase.query_processor.interface DateTimeValue Value))) + metabase.driver.presto.PrestoDriver)) (resolve-private-vars metabase.driver.presto execute-presto-query! presto-type->base-type quote-name quote+combine-names) diff --git a/test/metabase/test/data/redshift.clj b/test/metabase/test/data/redshift.clj index c1521e0f1078e4fdc1dc8441bc87e73ae9cb3971..a8f57ab088394250385d7b6d1c2c1e3b4c90cd87 100644 --- a/test/metabase/test/data/redshift.clj +++ b/test/metabase/test/data/redshift.clj @@ -1,13 +1,10 @@ (ns metabase.test.data.redshift - (:require [clojure.java.jdbc :as jdbc] - [clojure.tools.logging :as log] - [clojure.string :as s] + (:require [clojure.string :as s] [environ.core :refer [env]] - (metabase.driver [generic-sql :as sql] - redshift) - (metabase.test.data [generic-sql :as generic] - [interface :as i] - [postgres :as postgres]) + [metabase.driver.generic-sql :as sql] + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.redshift.RedshiftDriver)) diff --git a/test/metabase/test/data/sqlite.clj b/test/metabase/test/data/sqlite.clj index 49ceda7c06991206074fba947b7ae407c2355212..639c483e1ddf38486970d56c811b46a69e23538d 100644 --- a/test/metabase/test/data/sqlite.clj +++ b/test/metabase/test/data/sqlite.clj @@ -1,9 +1,8 @@ (ns metabase.test.data.sqlite - (:require [clojure.string :as s] - [honeysql.core :as hsql] - metabase.driver.sqlite - (metabase.test.data [generic-sql :as generic] - [interface :as i]) + (:require [honeysql.core :as hsql] + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u] [metabase.util.honeysql-extensions :as hx]) (:import metabase.driver.sqlite.SQLiteDriver)) diff --git a/test/metabase/test/data/sqlserver.clj b/test/metabase/test/data/sqlserver.clj index d4bb90ec570292308bc1cf8edddfa39f86105052..26db970701937b9612d4245181288bdea442548c 100644 --- a/test/metabase/test/data/sqlserver.clj +++ b/test/metabase/test/data/sqlserver.clj @@ -3,11 +3,11 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as s] [environ.core :refer [env]] - (metabase.driver [generic-sql :as sql] - sqlserver) - (metabase.test.data [datasets :as datasets] - [generic-sql :as generic] - [interface :as i]) + [metabase.driver.generic-sql :as sql] + [metabase.test.data + [datasets :as datasets] + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.sqlserver.SQLServerDriver)) diff --git a/test/metabase/test/data/users.clj b/test/metabase/test/data/users.clj index 5698ebae330aae5620c9422b05d3653aaa14eb40..773f80d5f9641d901d2acc7c3d60c54b7e246f9e 100644 --- a/test/metabase/test/data/users.clj +++ b/test/metabase/test/data/users.clj @@ -1,15 +1,13 @@ (ns metabase.test.data.users "Code related to creating / managing fake `Users` for testing purposes." - ;; TODO - maybe this namespace should just be `metabase.test.users`. (:require [medley.core :as m] - [toucan.db :as db] - [metabase.config :as config] + [metabase + [config :as config] + [http-client :as http] + [util :as u]] [metabase.core.initialization-status :as init-status] - [metabase.http-client :as http] - (metabase.models [permissions-group :as perms-group] - [user :refer [User]]) - [metabase.util :as u] - [metabase.test.util :refer [random-name]]) + [metabase.models.user :refer [User]] + [toucan.db :as db]) (:import clojure.lang.ExceptionInfo)) ;;; ------------------------------------------------------------ User Definitions ------------------------------------------------------------ diff --git a/test/metabase/test/data/vertica.clj b/test/metabase/test/data/vertica.clj index 562c1759deabe727feabf2188ab8a45ddec55938..e40032ff833e7129e049aac9d9ed22b9dc2503eb 100644 --- a/test/metabase/test/data/vertica.clj +++ b/test/metabase/test/data/vertica.clj @@ -1,10 +1,10 @@ (ns metabase.test.data.vertica "Code for creating / destroying a Vertica database from a `DatabaseDefinition`." (:require [environ.core :refer [env]] - (metabase.driver [generic-sql :as sql] - vertica) - (metabase.test.data [generic-sql :as generic] - [interface :as i]) + [metabase.driver.generic-sql :as sql] + [metabase.test.data + [generic-sql :as generic] + [interface :as i]] [metabase.util :as u]) (:import metabase.driver.vertica.VerticaDriver)) diff --git a/test/metabase/test/util.clj b/test/metabase/test/util.clj index 839cead1244956bda609fdfad58a1c5723180841..0c5117caf93c935dbebd8a8966aa3cc54799c9c5 100644 --- a/test/metabase/test/util.clj +++ b/test/metabase/test/util.clj @@ -1,31 +1,30 @@ (ns metabase.test.util "Helper functions and macros for writing unit tests." - (:require [clojure.tools.logging :as log] + (:require [cheshire.core :as json] + [clojure.tools.logging :as log] [clojure.walk :as walk] - [cheshire.core :as json] [expectations :refer :all] - (toucan [db :as db] - [models :as models]) - [toucan.util.test :as test] - (metabase.models [card :refer [Card]] - [collection :refer [Collection]] - [dashboard :refer [Dashboard]] - [dashboard-card-series :refer [DashboardCardSeries]] - [database :refer [Database]] - [field :refer [Field]] - [metric :refer [Metric]] - [permissions-group :refer [PermissionsGroup]] - [pulse :refer [Pulse]] - [pulse-channel :refer [PulseChannel]] - [raw-column :refer [RawColumn]] - [raw-table :refer [RawTable]] - [revision :refer [Revision]] - [segment :refer [Segment]] - [setting :as setting] - [table :refer [Table]] - [user :refer [User]]) + [metabase.models + [card :refer [Card]] + [collection :refer [Collection]] + [dashboard :refer [Dashboard]] + [dashboard-card-series :refer [DashboardCardSeries]] + [database :refer [Database]] + [field :refer [Field]] + [metric :refer [Metric]] + [permissions-group :refer [PermissionsGroup]] + [pulse :refer [Pulse]] + [pulse-channel :refer [PulseChannel]] + [raw-column :refer [RawColumn]] + [raw-table :refer [RawTable]] + [revision :refer [Revision]] + [segment :refer [Segment]] + [setting :as setting] + [table :refer [Table]] + [user :refer [User]]] [metabase.test.data :as data] - [metabase.util :as u])) + [metabase.util :as u] + [toucan.util.test :as test])) (declare $->prop) diff --git a/test/metabase/test_setup.clj b/test/metabase/test_setup.clj index 3f9b447793cb1f942341abdf1fe485a909ac64de..a5b2f8914c1f97530beed2eefc7790d68facc1f5 100644 --- a/test/metabase/test_setup.clj +++ b/test/metabase/test_setup.clj @@ -1,19 +1,16 @@ (ns metabase.test-setup "Functions that run before + after unit tests (setup DB, start web server, load test data)." - (:require clojure.data - [clojure.java.io :as io] - [clojure.set :as set] + (:require [clojure data + [set :as set]] [clojure.tools.logging :as log] [expectations :refer :all] - [metabase.core :as core] + [metabase + [core :as core] + [db :as mdb] + [driver :as driver] + [util :as u]] [metabase.core.initialization-status :as init-status] - (metabase [db :as mdb] - [driver :as driver]) - (metabase.models [setting :as setting] - [table :refer [Table]]) - [metabase.test.data :as data] - [metabase.test.data.datasets :as datasets] - [metabase.util :as u])) + [metabase.models.setting :as setting])) ;; # ---------------------------------------- EXPECTAIONS FRAMEWORK SETTINGS ------------------------------ diff --git a/test/metabase/timeseries_query_processor_test.clj b/test/metabase/timeseries_query_processor_test.clj index 50765b41ab1df0e3fea23515c7eac14062e67a29..ed647a33f823072dd909f969334aac0ed6e56630 100644 --- a/test/metabase/timeseries_query_processor_test.clj +++ b/test/metabase/timeseries_query_processor_test.clj @@ -1,14 +1,15 @@ (ns metabase.timeseries-query-processor-test "Query processor tests for DBs that are event-based, like Druid. There architecture is different enough that we can't test them along with our 'normal' DBs in `query-procesor-test`." - (:require [expectations :refer :all] + (:require [metabase + [query-processor-test :refer [first-row format-rows-by rows]] + [util :as u]] [metabase.query-processor.expand :as ql] - [metabase.query-processor-test :refer [format-rows-by rows first-row]] [metabase.test.data :as data] - (metabase.test.data [dataset-definitions :as defs] - [datasets :as datasets] - [interface :as i]) - [metabase.util :as u])) + [metabase.test.data + [dataset-definitions :as defs] + [datasets :as datasets] + [interface :as i]])) (def ^:private ^:const event-based-dbs #{:druid}) diff --git a/test/metabase/util/schema_test.clj b/test/metabase/util/schema_test.clj index ed4ab0f7d385cfb0503f61fadaf3490c9fe38284..250075b4eb4ad1e6a68fa3f21e5dbc90a7efbc2b 100644 --- a/test/metabase/util/schema_test.clj +++ b/test/metabase/util/schema_test.clj @@ -1,7 +1,7 @@ (ns metabase.util.schema-test - (:require [metabase.util.schema :as su] - [schema.core :as s] - [expectations :refer :all])) + (:require [expectations :refer :all] + [metabase.util.schema :as su] + [schema.core :as s])) ;; check that the API error message generation is working as intended (expect diff --git a/test/metabase/util/stats_test.clj b/test/metabase/util/stats_test.clj index 814bd7e68ece36635be024bc3514c421b871fe15..8ad29b6f9c4e66b4960d48704991b321ca20299a 100644 --- a/test/metabase/util/stats_test.clj +++ b/test/metabase/util/stats_test.clj @@ -1,9 +1,9 @@ (ns metabase.util.stats-test (:require [expectations :refer :all] - [toucan.db :as db] [metabase.models.query-execution :refer [QueryExecution]] + [metabase.test.util :as tu] [metabase.util.stats :refer :all] - [metabase.test.util :as tu])) + [toucan.db :as db])) (tu/resolve-private-vars metabase.util.stats bin-micro-number bin-medium-number bin-large-number)