diff --git a/.circleci/config.yml b/.circleci/config.yml index 92f782a5..0d5d4653 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,6 +38,8 @@ jobs: - run: name: Run JVM tests command: | + export BABASHKA_FEATURE_JDBC=true + export BABASHKA_FEATURE_POSTGRESQL=true script/test script/run_lib_tests # - run: diff --git a/project.clj b/project.clj index e461f701..47e5b674 100644 --- a/project.clj +++ b/project.clj @@ -47,7 +47,8 @@ :feature/transit :feature/datascript {:dependencies [[clj-commons/conch "0.9.2"] - [com.clojure-goes-fast/clj-async-profiler "0.4.1"]]}] + [com.clojure-goes-fast/clj-async-profiler "0.4.1"] + [com.opentable.components/otj-pg-embedded "0.13.3"]]}] :uberjar {:global-vars {*assert* false} :jvm-opts ["-Dclojure.compiler.direct-linking=true" "-Dclojure.spec.skip-macros=true"] diff --git a/script/postgresql_test b/script/postgresql_test index e47c07fe..70a8f37f 100755 --- a/script/postgresql_test +++ b/script/postgresql_test @@ -1,20 +1,5 @@ #!/usr/bin/env bash -set -eu - -trap 'docker rm -f babashka-postgres' EXIT - -docker run --name babashka-postgres -p 54322:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres - -BABASHKA_TEST_ENV=${BABASHKA_TEST_ENV:-} - -if [ "$BABASHKA_TEST_ENV" = "native" ]; then - BB_CMD="./bb" -else - BB_CMD="lein with-profiles +feature/jdbc,+feature/postgresql bb" -fi - - -BABASHKA_FEATURE_JDBC=true \ - BABASHKA_FEATURE_POSTGRESQL=true \ - $BB_CMD -f test-resources/babashka/postgresql_test.clj +BABASHKA_FEATURE_JDBC=true +BABASHKA_FEATURE_POSTGRESQL=true +lein test :only babashka.postgresql-test diff --git a/test-resources/babashka/embedded_pg_tests.clj b/test-resources/babashka/embedded_pg_tests.clj new file mode 100644 index 00000000..e0a9f34f --- /dev/null +++ b/test-resources/babashka/embedded_pg_tests.clj @@ -0,0 +1,23 @@ +(ns embedded-pg-tests + (:require [clojure.test :as t :refer [is]] + [next.jdbc :as jdbc] + [next.jdbc.sql :as sql])) + +(defn wait-for-postgres + [db] + (while + (not + (try (jdbc/execute! db ["select version()"]) + (catch Exception e + (prn (ex-message e)) + (Thread/sleep 100)))))) + +(defn create-table-test [db] + (is (jdbc/execute! db ["drop table if exists foo; create table foo ( foo text )"]))) + +(defn insert-test [db] + (is (sql/insert-multi! db :foo [:foo] [["foo"] ["bar"] ["baz"]]))) + +(defn query-test [db] + (let [results (jdbc/execute! db ["select * from foo"])] + results)) diff --git a/test-resources/babashka/postgresql_test.clj b/test-resources/babashka/postgresql_test.clj deleted file mode 100644 index 12534bc0..00000000 --- a/test-resources/babashka/postgresql_test.clj +++ /dev/null @@ -1,43 +0,0 @@ -(ns babashka.postgres-test - (:require [clojure.test :as t :refer [deftest is]] - [next.jdbc :as jdbc] - [next.jdbc.sql :as sql])) - -(def db {:dbtype "postgres" - :port 54322 - :dbname "postgres" - :user "postgres" - :password "mysecretpassword"}) - -(defmethod clojure.test/report :begin-test-var [m] - (println "===" (-> m :var meta :name)) - (println)) - -(defn wait-for-postgres [] - (while - (not - (try (jdbc/execute! db ["select version()"]) - (catch Exception e - (prn (ex-message e)) - (Thread/sleep 100)))))) - -(deftest create-table-test - (is (jdbc/execute! db ["drop table if exists foo; create table foo ( foo text )"]))) - -(deftest insert-test - (is (sql/insert-multi! db :foo [:foo] [["foo"] ["bar"] ["baz"]]))) - -(deftest query-test - (let [results (jdbc/execute! db ["select * from foo"])] - (is (= '[{:foo/foo "foo"} {:foo/foo "bar"} {:foo/foo "baz"}] - results)))) - -(defn test-ns-hook [] - (wait-for-postgres) - (create-table-test) - (insert-test) - (query-test)) - -(let [{:keys [:fail :error]} - (t/run-tests)] - (System/exit (+ fail error))) diff --git a/test/babashka/postgresql_test.clj b/test/babashka/postgresql_test.clj new file mode 100644 index 00000000..18e4fc57 --- /dev/null +++ b/test/babashka/postgresql_test.clj @@ -0,0 +1,41 @@ +(ns babashka.postgresql-test + (:require [babashka.test-utils :as tu] + [clojure.test :as t :refer [deftest is]]) + (:import [com.opentable.db.postgres.embedded EmbeddedPostgres])) + +(def db {:dbtype "embedded-postgres" + :port 54322}) + +(defmethod clojure.test/report :begin-test-var [m] + (println "===" (-> m :var meta :name)) + (println)) + +(defn jdbc-feature-flag? [] + (= (System/getenv "BABASHKA_FEATURE_JDBC") "true")) + +(defn pg-feature-flag? [] + (= (System/getenv "BABASHKA_FEATURE_POSTGRESQL") "true")) + +(deftest postgresql-test + (when (= "embedded-postgres" (:dbtype db)) + (if (and tu/jvm? (jdbc-feature-flag?) (pg-feature-flag?)) + (let [pg-db-instance (-> (EmbeddedPostgres/builder) + (.setPort (:port db)) + .start + .getPostgresDatabase + .getConnection) + bb-tests (tu/bb nil + "-e" "(require '[clojure.test :as t :refer [deftest is]])" + "-e" "(require '[next.jdbc :as jdbc])" + "-e" "(require '[next.jdbc.sql :as sql])" + "-e" "(load-file (io/file \"test-resources\" \"babashka\" \"embedded_pg_tests.clj\"))" + "-e" "(require '[embedded-pg-tests :as em-pg])" + "-e" "(def db {:dbtype \"postgres\" :port 54322 :user \"postgres\" :dbname \"postgres\"})" + "-e" "(def expected-query-res [{:foo/foo \"foo\"} {:foo/foo \"bar\"} {:foo/foo \"baz\"}])" + "-e" "(em-pg/wait-for-postgres db)" + "-e" "(em-pg/create-table-test db)" + "-e" "(em-pg/insert-test db)" + "-e" "(is (= expected-query-res (em-pg/query-test db)))")] + (is (= bb-tests "true\n")) + (.close pg-db-instance)) + (println "Did not run the pg-tests. Turn on the feature flags to run these tests."))))