(ns tbd.sqlite-test (:require [clojure.java.io :as io] [clojure.test :refer [deftest is testing]] [next.jdbc :as jdbc] [tbd.oauth.db :as oauth-db] [tbd.sqlite :as sqlite] [tbd.todo.db :as todo-db]) (:import (java.nio.file Files) (java.nio.file.attribute FileAttribute))) (defn temp-db-path "A path for a database file inside a fresh temp directory (which `open` has to create a subdirectory of, as with the default data/tbd.db)." [] (str (Files/createTempDirectory "tbd" (make-array FileAttribute 0)) "/data/tbd.db")) (deftest env-config-test (is (= {:db-path "data/tbd.db"} (sqlite/env-config {}))) (is (= {:db-path "data/tbd.db"} (sqlite/env-config {"DB_PATH" " "}))) (is (= {:db-path "/var/tbd.db"} (sqlite/env-config {"DB_PATH" " /var/tbd.db "})))) (deftest open-test (testing "creates the file and its directory" (let [path (temp-db-path)] (sqlite/open path todo-db/migrate!) (is (.exists (io/file path))))) (testing "no path is an error, not a database in the working directory" (is (thrown? clojure.lang.ExceptionInfo (sqlite/open nil))) (is (thrown? clojure.lang.ExceptionInfo (sqlite/open " ")))) (testing "every migration runs on the datasource, and again (harmlessly) on reopening" (let [path (temp-db-path) tables #(set (map :name (jdbc/execute! % ["SELECT name FROM sqlite_master WHERE type = 'table'"] {:builder-fn next.jdbc.result-set/as-unqualified-maps})))] (is (every? (tables (sqlite/open path todo-db/migrate! oauth-db/migrate!)) ["todos" "clients" "codes" "grants"])) (is (every? (tables (sqlite/open path todo-db/migrate! oauth-db/migrate!)) ["todos" "clients" "codes" "grants"])))) (testing "the groups keep their data apart in the one file" (let [path (temp-db-path) ds (sqlite/open path todo-db/migrate! oauth-db/migrate!)] (todo-db/insert! ds {:owner-id 7 :title "buy milk" :done false :created-at 1 :updated-at 1}) (oauth-db/insert-client! ds {:id "c1" :name "Test client" :redirect-uris ["http://localhost/cb"] :created-at 1}) (is (= ["buy milk"] (map :title (todo-db/list-todos ds 7)))) (is (= "c1" (:id (oauth-db/find-client ds "c1")))))))