diff --git a/swift-ticketing/project.clj b/swift-ticketing/project.clj index 174543a..da223ad 100644 --- a/swift-ticketing/project.clj +++ b/swift-ticketing/project.clj @@ -27,6 +27,8 @@ :plugins [[lein-ring "0.12.6"]] :ring {:handler swift-ticketing.app/swift-ticketing-app} :aliases {"migrate" ["run" "-m" "swift-ticketing.migrations/migrate"] - "rollback" ["run" "-m" "swift-ticketing.migrations/rollback"]} + "rollback" ["run" "-m" "swift-ticketing.migrations/rollback"] + "kaocha" ["run" "-m" "kaocha.runner"]} :profiles {:uberjar {:aot :all - :jvm-opts ["-Dclojure.compiler.direct-linking=true"]}}) + :jvm-opts ["-Dclojure.compiler.direct-linking=true"]} + :dev {:dependencies [[lambdaisland/kaocha "1.87.1366"]]}}) diff --git a/swift-ticketing/src/swift_ticketing/components/http_server.clj b/swift-ticketing/src/swift_ticketing/components/http_server.clj index 1a86e07..efc0292 100644 --- a/swift-ticketing/src/swift_ticketing/components/http_server.clj +++ b/swift-ticketing/src/swift_ticketing/components/http_server.clj @@ -3,7 +3,7 @@ [ring.adapter.jetty :refer [run-jetty]] [swift-ticketing.app :as app])) -(defrecord HTTPServer [port database worker] +(defrecord HTTPServer [port join? database worker] component/Lifecycle (start [component] @@ -13,7 +13,7 @@ server (run-jetty (app/swift-ticketing-app connection message-queue) {:port port - :join? true})] + :join? join?})] (assoc component :http-server server))) (stop [component] @@ -21,5 +21,6 @@ (.stop (:http-server component)) (assoc component :http-server nil))) -(defn new-http-server [port] - (map->HTTPServer {:port port})) +(defn new-http-server [port join?] + (map->HTTPServer {:port port + :join? join?})) diff --git a/swift-ticketing/src/swift_ticketing/core.clj b/swift-ticketing/src/swift_ticketing/core.clj index 5bd4f6d..b1f9866 100644 --- a/swift-ticketing/src/swift_ticketing/core.clj +++ b/swift-ticketing/src/swift_ticketing/core.clj @@ -18,7 +18,8 @@ (component/system-map :database (new-database (:database config)) :app (component/using - (new-http-server (get-in config [:server :port])) + (new-http-server (get-in config [:server :port]) + (get-in config [:server :join?])) [:database :worker]) :worker (component/using (new-worker 5 redis-opts) diff --git a/swift-ticketing/test/swift_ticketing/fixtures.clj b/swift-ticketing/test/swift_ticketing/fixtures.clj index c01d479..f0ff6fe 100644 --- a/swift-ticketing/test/swift_ticketing/fixtures.clj +++ b/swift-ticketing/test/swift_ticketing/fixtures.clj @@ -1,20 +1,80 @@ (ns swift-ticketing.fixtures (:require - [next.jdbc :as jdbc] - [honey.sql :as sql] - [swift-ticketing.core :refer [create-connection-pool]] + [com.stuartsierra.component :as component] + [swift-ticketing.core :refer [swift-ticketing-system]] [swift-ticketing.factory :as factory] [swift-ticketing.config :refer [read-test-config]] - [swift-ticketing.migrations :as migrations])) + [swift-ticketing.migrations :as migrations] + [next.jdbc :as jdbc] + [honey.sql :as sql])) (def test-env - (let [db-config (:database (read-test-config))] - {:db-spec (create-connection-pool db-config)})) + {:test-user-id nil + :db-spec nil}) + +(def swift-ticketing-test-system + (swift-ticketing-system (read-test-config))) + +(defn start-test-system [] + (alter-var-root #'swift-ticketing-test-system component/start)) + +(defn stop-test-system [] + (alter-var-root #'swift-ticketing-test-system component/stop)) -(defn run-migrations [tests] - (let [db-config (:database (read-test-config))] +(defn run-with-test-system [tests] + ;; Init db connection pool, start workers + (println "start-test-system") + (start-test-system) + (println "after start-test-system") + (let [db (:database swift-ticketing-test-system) + db-config (:db-config db) + conn (:connection db)] + ;; setup tables (migrations/migrate-with db-config) - (let [test-user-id (factory/add-user-table-entry (:db-spec test-env))] - (alter-var-root #'test-env #(assoc % :test-user-id test-user-id))) + (let [test-user-id (factory/add-user-table-entry conn)] + ;; add a user, update it in test env + (alter-var-root + #'test-env #(assoc % + :test-user-id test-user-id + :db-spec conn))) + ;; run tests (tests) - (migrations/rollback-with db-config))) + ;; rollback db + (migrations/rollback-with db-config) + ;; stop db connections, workers + (stop-test-system))) + +(defn setup-test-system [test-plan] + ;; Init db connection pool, start workers + (start-test-system) + (let [db (:database swift-ticketing-test-system) + db-config (:db-config db) + conn (:connection db)] + ;; setup tables + (migrations/migrate-with db-config) + (let [test-user-id (factory/add-user-table-entry conn)] + ;; add a user, update it in test env + (alter-var-root + #'test-env #(assoc % + :test-user-id test-user-id + :db-spec conn)))) + test-plan) + +(defn teardown-test-system [test-plan] + (let [db (:database swift-ticketing-test-system) + db-config (:db-config db)] + ;; rollback db + (migrations/rollback-with db-config) + ;; stop db connections, workers + (stop-test-system)) + test-plan) + +(defn truncate-tables [db-spec] + (let [tables [:ticket :ticket_type :booking :event] + truncate-fn #(sql/format {:truncate [% [:raw "cascade"]]})] + (doseq [table tables] + (jdbc/execute! db-spec (truncate-fn table))))) + +(defn clear-tables [tests] + (truncate-tables (:db-spec test-env)) + (tests)) diff --git a/swift-ticketing/test/swift_ticketing/handlers_test.clj b/swift-ticketing/test/swift_ticketing/handlers_test.clj index c3f9c17..7827f5c 100644 --- a/swift-ticketing/test/swift_ticketing/handlers_test.clj +++ b/swift-ticketing/test/swift_ticketing/handlers_test.clj @@ -4,18 +4,16 @@ [next.jdbc :as jdbc] [clojure.data.json :as json] [next.jdbc.result-set :as rs] - [clojure.set :as s] - [clojure.walk :refer [keywordize-keys stringify-keys]] + [clojure.walk :refer [keywordize-keys]] [swift-ticketing.app :refer [swift-ticketing-app]] [swift-ticketing.fixtures :as fixtures] [swift-ticketing.factory :as factory] [swift-ticketing.utils :as utils] [swift-ticketing.db.event :as db-event] [swift-ticketing.db.ticket :as ticket] - [swift-ticketing.client :as client] - [swift-ticketing.specs :as specs])) + [swift-ticketing.client :as client])) -(use-fixtures :each fixtures/run-migrations) +(use-fixtures :each fixtures/clear-tables) (deftest create-event-test (let [{:keys [db-spec]} fixtures/test-env] @@ -116,6 +114,7 @@ (defn create-ticket-test* [event-id ticket-request-fn] (testing "with valid request" (let [{:keys [request response status]} (client/create-tickets event-id (ticket-request-fn)) + {:keys [db-spec test-user-id]} fixtures/test-env ticket-type-id (get response "ticket-type-id") created-tickets (jdbc/execute! db-spec (ticket/get-unbooked-tickets ticket-type-id) {:builder-fn rs/as-unqualified-maps}) tickets (get response "tickets") @@ -150,8 +149,3 @@ (create-ticket-test* event-id factory/general-ticket-request)) (testing "Creating ticket (Seated)" (create-ticket-test* event-id factory/seated-ticket-request)))) - -; (run-tests) -(run-test create-event-test) -(run-test list-events-test) -(run-test get-event-test) diff --git a/swift-ticketing/tests.edn b/swift-ticketing/tests.edn new file mode 100644 index 0000000..0725246 --- /dev/null +++ b/swift-ticketing/tests.edn @@ -0,0 +1,6 @@ +#kaocha/v1 + {:fail-fast? false + :plugins [:hooks] + :kaocha.hooks/pre-run [swift-ticketing.fixtures/setup-test-system] + :kaocha.hooks/post-run [swift-ticketing.fixtures/teardown-test-system] + }