Address #21 by adding next.jdbc.specs
Docs still need to be updated for this!
This commit is contained in:
parent
45f25d1912
commit
adf5a03e05
4 changed files with 157 additions and 1 deletions
|
|
@ -11,4 +11,5 @@
|
||||||
The following changes have been committed to the **master** branch and will be in the next release (Beta 1):
|
The following changes have been committed to the **master** branch and will be in the next release (Beta 1):
|
||||||
|
|
||||||
* Set up CircleCI testing (just local DBs for now).
|
* Set up CircleCI testing (just local DBs for now).
|
||||||
|
* Address #21 by adding `next.jdbc.specs` -- still need to update the docs!
|
||||||
* Fix #19 by caching loaded database driver classes.
|
* Fix #19 by caching loaded database driver classes.
|
||||||
|
|
|
||||||
149
src/next/jdbc/specs.clj
Normal file
149
src/next/jdbc/specs.clj
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
;; copyright (c) 2019 Sean Corfield, all rights reserved
|
||||||
|
|
||||||
|
(ns next.jdbc.specs
|
||||||
|
(:require [clojure.spec.alpha :as s]
|
||||||
|
[clojure.spec.test.alpha :as st]
|
||||||
|
[next.jdbc :as jdbc]
|
||||||
|
[next.jdbc.sql :as sql])
|
||||||
|
(:import (java.sql Connection PreparedStatement)
|
||||||
|
(javax.sql DataSource)))
|
||||||
|
|
||||||
|
(s/def ::dbtype string?)
|
||||||
|
(s/def ::dbname string?)
|
||||||
|
(s/def ::classname string?)
|
||||||
|
(s/def ::user string?)
|
||||||
|
(s/def ::password string?)
|
||||||
|
(s/def ::host string?)
|
||||||
|
(s/def ::port pos-int?)
|
||||||
|
(s/def ::db-spec-map (s/keys :req-un [::dbtype ::dbname]
|
||||||
|
:opt-un [::classname
|
||||||
|
::user ::password
|
||||||
|
::host ::port]))
|
||||||
|
|
||||||
|
(s/def ::connection #(instance? Connection %))
|
||||||
|
(s/def ::datasource #(instance? DataSource %))
|
||||||
|
(s/def ::prepared-statement #(instance? PreparedStatement %))
|
||||||
|
|
||||||
|
(s/def ::db-spec (s/or :db-spec ::db-spec-map
|
||||||
|
:string string?
|
||||||
|
:ds ::datasource))
|
||||||
|
|
||||||
|
(s/def ::connectable any?)
|
||||||
|
(s/def ::key-map (s/map-of keyword? any?))
|
||||||
|
(s/def ::opts-map (s/map-of keyword? any?))
|
||||||
|
|
||||||
|
(s/def ::sql-params (s/and vector?
|
||||||
|
(s/cat :sql string?
|
||||||
|
:params (s/* any?))))
|
||||||
|
|
||||||
|
(s/fdef jdbc/get-datasource
|
||||||
|
:args (s/cat :spec ::db-spec))
|
||||||
|
|
||||||
|
(s/fdef jdbc/get-connection
|
||||||
|
:args (s/cat :spec ::db-spec
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef jdbc/prepare
|
||||||
|
:args (s/cat :connection ::connection
|
||||||
|
:sql-params ::sql-params
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef jdbc/reducible!
|
||||||
|
:args (s/alt :prepared (s/cat :stmt ::prepared-statement)
|
||||||
|
:sql (s/cat :connectable ::connectable
|
||||||
|
:sql-params ::sql-params
|
||||||
|
:opts (s/? ::opts-map))))
|
||||||
|
|
||||||
|
(s/fdef jdbc/execute!
|
||||||
|
:args (s/alt :prepared (s/cat :stmt ::prepared-statement)
|
||||||
|
:sql (s/cat :connectable ::connectable
|
||||||
|
:sql-params ::sql-params
|
||||||
|
:opts (s/? ::opts-map))))
|
||||||
|
|
||||||
|
(s/fdef jdbc/execute-one!
|
||||||
|
:args (s/alt :prepared (s/cat :stmt ::prepared-statement)
|
||||||
|
:sql (s/cat :connectable ::connectable
|
||||||
|
:sql-params ::sql-params
|
||||||
|
:opts (s/? ::opts-map))))
|
||||||
|
|
||||||
|
(s/fdef jdbc/transact
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:f fn?
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef jdbc/with-transaction
|
||||||
|
:args (s/cat :binding (s/and vector?
|
||||||
|
(s/cat :sym simple-symbol?
|
||||||
|
:connectable ::connectable
|
||||||
|
:opts ::opts-map))
|
||||||
|
:body (s/* any?)))
|
||||||
|
|
||||||
|
(s/fdef sql/insert!
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:key-map ::key-map
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef sql/insert-multi!
|
||||||
|
:args (s/and (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:cols (s/coll-of keyword? :kind vector?)
|
||||||
|
:rows (s/coll-of (s/coll-of any? :kind vector?) :kind vector?)
|
||||||
|
:opts (s/? ::opts-map))
|
||||||
|
#(apply = (count (:cols %))
|
||||||
|
(map count (:rows %)))))
|
||||||
|
|
||||||
|
(s/fdef sql/query
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:sql-params ::sql-params
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef sql/find-by-keys
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:key-map (s/or :example ::key-map
|
||||||
|
:where ::sql-params)
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef sql/get-by-id
|
||||||
|
:args (s/alt :with-id (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:pk any?
|
||||||
|
:opts (s/? ::opts-map))
|
||||||
|
:pk-name (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:pk any?
|
||||||
|
:pk-name keyword?
|
||||||
|
:opts ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef sql/update!
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:key-map ::key-map
|
||||||
|
:where-params (s/or :example ::key-map
|
||||||
|
:where ::sql-params)
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(s/fdef sql/delete!
|
||||||
|
:args (s/cat :connectable ::connectable
|
||||||
|
:table keyword?
|
||||||
|
:where-params (s/or :example ::key-map
|
||||||
|
:where ::sql-params)
|
||||||
|
:opts (s/? ::opts-map)))
|
||||||
|
|
||||||
|
(defn instrument []
|
||||||
|
(st/instrument [`jdbc/get-datasource
|
||||||
|
`jdbc/get-connection
|
||||||
|
`jdbc/prepare
|
||||||
|
`jdbc/reducible!
|
||||||
|
`jdbc/execute!
|
||||||
|
`jdbc/execute-one!
|
||||||
|
`jdbc/transact
|
||||||
|
`jdbc/with-transaction
|
||||||
|
`sql/insert!
|
||||||
|
`sql/insert-multi!
|
||||||
|
`sql/query
|
||||||
|
`sql/find-by-keys
|
||||||
|
`sql/get-by-id
|
||||||
|
`sql/update!
|
||||||
|
`sql/delete!]))
|
||||||
|
|
@ -6,12 +6,15 @@
|
||||||
At some future date, tests for the syntactic sugar functions will be added."
|
At some future date, tests for the syntactic sugar functions will be added."
|
||||||
(:require [clojure.test :refer [deftest is testing use-fixtures]]
|
(:require [clojure.test :refer [deftest is testing use-fixtures]]
|
||||||
[next.jdbc.quoted :refer [mysql sql-server]]
|
[next.jdbc.quoted :refer [mysql sql-server]]
|
||||||
|
[next.jdbc.specs :as specs]
|
||||||
[next.jdbc.sql :as sql]
|
[next.jdbc.sql :as sql]
|
||||||
[next.jdbc.test-fixtures
|
[next.jdbc.test-fixtures
|
||||||
:refer [with-test-db ds derby? sqlite?]]))
|
:refer [with-test-db ds derby? sqlite?]]))
|
||||||
|
|
||||||
(use-fixtures :once with-test-db)
|
(use-fixtures :once with-test-db)
|
||||||
|
|
||||||
|
(specs/instrument)
|
||||||
|
|
||||||
(deftest test-by-keys
|
(deftest test-by-keys
|
||||||
(testing ":where clause"
|
(testing ":where clause"
|
||||||
(is (= (#'sql/by-keys {:a nil :b 42 :c "s"} :where {})
|
(is (= (#'sql/by-keys {:a nil :b 42 :c "s"} :where {})
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,14 @@
|
||||||
[next.jdbc :as jdbc]
|
[next.jdbc :as jdbc]
|
||||||
[next.jdbc.test-fixtures :refer [with-test-db ds]]
|
[next.jdbc.test-fixtures :refer [with-test-db ds]]
|
||||||
[next.jdbc.prepare :as prep]
|
[next.jdbc.prepare :as prep]
|
||||||
[next.jdbc.result-set :as rs])
|
[next.jdbc.result-set :as rs]
|
||||||
|
[next.jdbc.specs :as specs])
|
||||||
(:import (java.sql ResultSet ResultSetMetaData)))
|
(:import (java.sql ResultSet ResultSetMetaData)))
|
||||||
|
|
||||||
(use-fixtures :once with-test-db)
|
(use-fixtures :once with-test-db)
|
||||||
|
|
||||||
|
(specs/instrument)
|
||||||
|
|
||||||
(deftest basic-tests
|
(deftest basic-tests
|
||||||
(testing "reducible!"
|
(testing "reducible!"
|
||||||
(is (= "Apple"
|
(is (= "Apple"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue