Allow for provision of a Testcontainer instance (#16)
* Allow for provision of a Testcontainer instance Testcontainers provides many different container implementations that can be very useful. This simple change allows callers to provide their own, premade container instance so consumers can flexibly choose their container type. If no container instance is supplied, then clj-test-containers falls back to its original behavior. * Extract function * Cleanup, ensure Clojure types instead of Java types Co-authored-by: Tim Zöller <mail@tim-zoeller.de>
This commit is contained in:
parent
c30d02aaaf
commit
8794b4a991
3 changed files with 36 additions and 18 deletions
|
|
@ -9,5 +9,6 @@
|
||||||
:plugins [[metosin/bat-test "0.4.4"]]
|
:plugins [[metosin/bat-test "0.4.4"]]
|
||||||
:bat-test {:report [:pretty {:type :junit
|
:bat-test {:report [:pretty {:type :junit
|
||||||
:output-to "target/junit.xml"}]}
|
:output-to "target/junit.xml"}]}
|
||||||
|
:profiles {:dev {:dependencies [[org.testcontainers/postgresql "1.14.3"]]}}
|
||||||
:target-path "target/%s")
|
:target-path "target/%s")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,23 +12,27 @@
|
||||||
BindMode/READ_WRITE
|
BindMode/READ_WRITE
|
||||||
BindMode/READ_ONLY))
|
BindMode/READ_ONLY))
|
||||||
|
|
||||||
(defn create
|
(defn init
|
||||||
"Sets the properties for a testcontainer instance"
|
"Sets the properties for a testcontainer instance"
|
||||||
[{:keys [image-name exposed-ports env-vars command]}]
|
[{:keys [container exposed-ports env-vars command]}]
|
||||||
(let [container (GenericContainer. image-name)]
|
(.setExposedPorts container (map int exposed-ports))
|
||||||
(.setExposedPorts container (map int exposed-ports))
|
|
||||||
|
|
||||||
(if (some? env-vars)
|
(run! (fn [[k v]] (.addEnv container k v)) env-vars)
|
||||||
(doseq [pair env-vars]
|
|
||||||
(.addEnv container (first pair) (second pair))))
|
|
||||||
|
|
||||||
(if (some? command)
|
(when command
|
||||||
(.setCommand container command))
|
(.setCommand container command))
|
||||||
|
|
||||||
{:container container
|
{:container container
|
||||||
:exposed-ports (.getExposedPorts container)
|
:exposed-ports (vec (.getExposedPorts container))
|
||||||
:env-vars (.getEnvMap container)
|
:env-vars (into {} (.getEnvMap container))
|
||||||
:host (.getHost container)}))
|
:host (.getHost container)})
|
||||||
|
|
||||||
|
(defn create
|
||||||
|
"Creates a generic testcontainer and sets its properties"
|
||||||
|
[{:keys [image-name] :as options}]
|
||||||
|
(->> (GenericContainer. image-name)
|
||||||
|
(assoc options :container)
|
||||||
|
init))
|
||||||
|
|
||||||
(defn create-from-docker-file
|
(defn create-from-docker-file
|
||||||
[{:keys [exposed-ports env-vars command docker-file]
|
[{:keys [exposed-ports env-vars command docker-file]
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
(ns clj-test-containers.core-test
|
(ns clj-test-containers.core-test
|
||||||
(:require [clojure.test :refer :all]
|
(:require [clojure.test :refer :all]
|
||||||
[clj-test-containers.core :refer :all]))
|
[clj-test-containers.core :refer :all])
|
||||||
|
(:import [org.testcontainers.containers
|
||||||
|
PostgreSQLContainer]))
|
||||||
|
|
||||||
|
(deftest create-test
|
||||||
|
(testing "Testing basic testcontainer generic image initialisation"
|
||||||
|
|
||||||
(deftest init-test
|
|
||||||
(testing "Testing basic testcontainer generic image initialization"
|
|
||||||
(let [container (create {:image-name "postgres:12.2"
|
(let [container (create {:image-name "postgres:12.2"
|
||||||
:exposed-ports [5432]
|
:exposed-ports [5432]
|
||||||
:env-vars {"POSTGRES_PASSWORD" "pw"}})
|
:env-vars {"POSTGRES_PASSWORD" "pw"}})
|
||||||
|
|
@ -36,6 +39,16 @@
|
||||||
result (execute-command! initialized-container ["whoami"])
|
result (execute-command! initialized-container ["whoami"])
|
||||||
stopped-container (stop! container)]
|
stopped-container (stop! container)]
|
||||||
(is (= 0 (:exit-code result)))
|
(is (= 0 (:exit-code result)))
|
||||||
|
(is (= "root\n" (:stdout result)))))
|
||||||
|
|
||||||
|
(testing "Executing a command in the running Docker container with a custom container"
|
||||||
|
(let [container (init {:container (PostgreSQLContainer. "postgres:12.2")
|
||||||
|
:exposed-ports [5432]
|
||||||
|
:env-vars {"POSTGRES_PASSWORD" "pw"}})
|
||||||
|
initialized-container (start! container)
|
||||||
|
result (execute-command! initialized-container ["whoami"])
|
||||||
|
stopped-container (stop! container)]
|
||||||
|
(is (= 0 (:exit-code result)))
|
||||||
(is (= "root\n" (:stdout result))))))
|
(is (= "root\n" (:stdout result))))))
|
||||||
|
|
||||||
(deftest init-volume-test
|
(deftest init-volume-test
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue