Index tests

This commit is contained in:
George Narroway 2019-11-14 11:27:59 +08:00
parent 1a9ef79536
commit 1816cab2ba
2 changed files with 107 additions and 29 deletions

View file

@ -605,17 +605,31 @@
(let [opts' (->CreateCollectionOptions opts)]
(.createCollection db coll opts'))))
(defn rename
"Renames `coll` to `new-coll` in the same DB."
[^MongoDatabase db coll new-coll opts]
(let [{:keys [drop-target?]} opts
opts' (RenameCollectionOptions.)]
(defn ->RenameCollectionOptions
"Coerce options map into RenameCollectionOptions. See `rename` usage."
[{:keys [rename-collection-options drop-target?]}]
(let [opts (or rename-collection-options (RenameCollectionOptions.))]
(when (some? drop-target?) (.dropTarget opts drop-target?))
(when drop-target? (.dropTarget opts' true))
opts))
(defn rename
"Renames `coll` to `new-coll` in the same DB.
Takes an options map:
-- query options
:drop-target? Boolean drop tne target collection if it exists. Default: false
:rename-collection-options A RenameCollectionOptions for configuring directly. If specified,
any other query options will be applied to it"
([^MongoDatabase db coll new-coll]
(rename db coll new-coll {}))
([^MongoDatabase db coll new-coll opts]
(let [opts' (->RenameCollectionOptions opts)]
(.renameCollection (collection db coll opts)
(MongoNamespace. (.getName db) new-coll)
opts')))
opts'))))
(defn drop
"Drops a collection from a database."
@ -666,30 +680,24 @@
-- optional
any attributes available in `->IndexOptions`"
[^MongoDatabase db coll indexes]
([^MongoDatabase db coll indexes]
(create-indexes db coll indexes {}))
([^MongoDatabase db coll indexes opts]
(->> indexes
(map (fn [x] (IndexModel. (document (:keys x)) (->IndexOptions x))))
(.createIndexes (collection db coll))))
(.createIndexes (collection db coll opts)))))
(defn list-indexes
"Lists indexes."
[^MongoDatabase db coll]
(->> (.listIndexes (collection db coll))
(map #(from-document % true))))
([^MongoDatabase db coll]
(list-indexes db coll {}))
([^MongoDatabase db coll opts]
(->> (.listIndexes (collection db coll opts))
(map #(from-document % true)))))
;;; Utility functions
(defn empty?
"Returns true if a collection is empty"
[^MongoDatabase db coll]
(zero? (count-documents db coll)))
(defn exists?
"Returns true if collection exists"
[^MongoDatabase db coll]
(some #(= coll %) (.listCollectionNames db)))
(defn with-transaction
(defn- with-transaction
"Executes `body` in a transaction.
`body` should be a fn with one or more mongo operations in it.

View file

@ -4,9 +4,10 @@
[mongo-driver-3.collection :as mc])
(:import (com.mongodb ReadConcern ReadPreference WriteConcern)
(java.util.concurrent TimeUnit)
(com.mongodb.client.model InsertOneOptions InsertManyOptions DeleteOptions FindOneAndUpdateOptions ReturnDocument FindOneAndReplaceOptions CountOptions UpdateOptions ReplaceOptions IndexOptions CreateCollectionOptions)
(com.mongodb.client.model InsertOneOptions InsertManyOptions DeleteOptions FindOneAndUpdateOptions ReturnDocument FindOneAndReplaceOptions CountOptions UpdateOptions ReplaceOptions IndexOptions CreateCollectionOptions RenameCollectionOptions)
(java.time ZoneId LocalDate LocalTime LocalDateTime)
(java.util Date UUID)))
(java.util Date UUID)
(com.mongodb.client MongoDatabase)))
;;; Unit
@ -97,6 +98,16 @@
(let [opts (DeleteOptions.)]
(is (= opts (mc/->DeleteOptions {:delete-options opts})) "configure directly")))
(deftest test->RenameCollectionOptions
(is (instance? RenameCollectionOptions (mc/->RenameCollectionOptions {})))
(are [expected arg]
(= expected (.isDropTarget (mc/->RenameCollectionOptions {:drop-target? arg})))
true true
false false
false nil)
(let [opts (RenameCollectionOptions.)]
(is (= opts (mc/->RenameCollectionOptions {:rename-collection-options opts})) "configure directly")))
(deftest test->FindOneAndUpdateOptions
(is (instance? FindOneAndUpdateOptions (mc/->FindOneAndUpdateOptions {})))
(let [opts (FindOneAndUpdateOptions.)]
@ -460,3 +471,62 @@
(is (= 0 (.getMatchedCount res)))
(is (= 0 (.getModifiedCount res)))
(is (some? (.getUpsertedId res)))))))
(defn- coll-exists?
"Returns true if collection exists"
[db coll]
(some #(= coll %) (.listCollectionNames db)))
(deftest ^:integration test-create
(testing "not existing"
(let [db (new-db @client)
_ (mc/create db "my-coll")]
(is (true? (coll-exists? db "my-coll")))))
(testing "existing"
(let [db (new-db @client)
_ (mc/create db "my-coll")]
(is (thrown? Exception (mc/create db "my-coll"))))))
(deftest ^:integration test-rename
(testing "not existing"
(let [db (new-db @client)
_ (mc/create db "old")
_ (mc/rename db "old" "new")]
(is (not (coll-exists? db "old")))
(is (true? (coll-exists? db "new")))))
(testing "existing"
(let [db (new-db @client)
_ (mc/create db "old")
_ (mc/create db "new")]
(is (thrown? Exception (mc/rename db "old" "new")))
(mc/rename db "old" "new" {:drop-target? true})
(is (not (coll-exists? db "old")))
(is (true? (coll-exists? db "new"))))))
(deftest ^:integration test-drop
(testing "existing"
(let [db (new-db @client)
_ (mc/create db "my-coll")
_ (mc/drop db "my-coll")]
(is (not (coll-exists? db "my-coll")))))
(testing "not existing"
(let [db (new-db @client)]
(is (nil? (mc/drop db "my-coll"))))))
(deftest ^:integration test-list-indexes
(let [db (new-db @client)
_ (mc/create db "test")]
(is (= 1 (count (mc/list-indexes db "test"))) "has default index")))
(deftest ^:integration test-create-index
(let [db (new-db @client)
_ (mc/create-index db "test" {:a 1})]
(is (= [{:_id 1} {:a 1}] (map :key (mc/list-indexes db "test"))))))
(deftest ^:integration test-create-indexes
(let [db (new-db @client)
_ (mc/create-indexes db "test" [{:keys {:a 1}} {:keys {:b 1}}])]
(is (= [{:_id 1} {:a 1} {:b 1}] (map :key (mc/list-indexes db "test"))))))