Adds test for vexec! and with-view-transactions (but not recursive, yet); modifies database-fixtures to handle an optional vector arg of table names

This commit is contained in:
Dave Della Costa 2014-07-24 19:36:03 +09:00
parent b61d5f00cf
commit 50100d17f6
6 changed files with 95 additions and 8 deletions

View file

@ -3,7 +3,7 @@
[clojure.test :refer [run-tests]]
[views.subscriptions-test]
[views.base-subscribed-views-test]
;; [views.db.core-test]
[views.db.core-test]
[views.db.deltas-test]
[views.db.checks-test] ; STILL SPECULATIVE
[views.db.honeysql-test]
@ -13,7 +13,7 @@
[]
(run-tests 'views.subscriptions-test
'views.base-subscribed-views-test
;; 'views.db.core-test
'views.db.core-test
'views.db.deltas-test
'views.db.checks-test
'views.db.honeysql-test

View file

@ -21,7 +21,7 @@
(reset! vs/subscribed-views {})
(f))
(use-fixtures :each vf/database-fixtures! subscription-fixtures!)
(use-fixtures :each (vf/database-fixtures!) subscription-fixtures!)
(def persistence (InMemoryPersistence.))
@ -68,3 +68,13 @@
(add-subscription! [:users] vf/templates 1 default-ns)
(add-subscription! [:users] vf/templates 2 default-ns)
(broadcast-deltas base-subbed-views deltas nil)))
(deftest sends-deltas-in-batch
(let [deltas {[:users] [{:view-sig [:users] :insert-deltas [{:id 1 :name "Bob"} {:id 2 :name "Alice"}]}]}
sent-delta {[:users] {:insert-deltas [{:id 1 :name "Bob"} {:id 2 :name "Alice"}]}}
send-fn #(do (is (#{1 2} %1))
(is (= %2 :views.deltas))
(is (= %3 sent-delta)))
base-subbed-views (BaseSubscribedViews. (assoc view-config-fixture :send-fn send-fn))]
(add-subscription! [:users] vf/templates 1 default-ns)
(broadcast-deltas base-subbed-views deltas nil)))

View file

@ -0,0 +1,63 @@
(ns views.db.core-test
(:require
[clojure.test :refer [use-fixtures deftest is]]
[views.subscriptions :as vs]
[views.subscribed-views :refer [ISubscribedViews]]
[views.fixtures :as vf :refer [vschema sql-ts]]
[views.db.core :as vdb]))
(def received-deltas (atom nil))
;; Very barebones subscribed-views instance which merely satisfies what vexec! needs:
(deftype TestSubscribedViews []
ISubscribedViews
(subscribed-views [this namespace]
(map :view-data (vals (vs/compiled-views-for))))
(broadcast-deltas [this new-deltas namespace]
(reset! received-deltas new-deltas)))
(def test-subscribed-views (TestSubscribedViews.))
(def test-config {:db vf/db :schema vschema :templates vf/templates :base-subscribed-views test-subscribed-views})
(defn reset-fixtures!
[f]
(reset! vs/subscribed-views {})
(reset! received-deltas {})
(f))
(use-fixtures :each vf/with-user-fixture! (vf/database-fixtures! [:posts :comments]) reset-fixtures!)
(use-fixtures :once (vf/database-fixtures! [:users]))
(deftest vexec-sends-deltas
(let [view-sig [:user-posts (:id @vf/user-fixture)]
sub-to-it (vs/add-subscription! view-sig vf/templates (:id @vf/user-fixture))
posted (first (vdb/vexec! test-config (vf/insert-post-tmpl (:id @vf/user-fixture) "title" "body")))
delta-vs (ffirst @received-deltas)
insert-delta (-> @received-deltas first second first :insert-deltas first)]
(is (= (ffirst @received-deltas) view-sig))
(is (= (:name insert-delta) (:name @vf/user-fixture)))
(is (= (:body insert-delta) (:body posted)))
(is (= (:title insert-delta) (:title posted)))))
(deftest with-view-transaction-sends-deltas
(let [view-sig [:user-posts (:id @vf/user-fixture)]
sub-to-it (vs/add-subscription! view-sig vf/templates (:id @vf/user-fixture))
posted (first (vdb/with-view-transaction
[tc test-config]
(vdb/vexec! tc (vf/insert-post-tmpl (:id @vf/user-fixture) "title" "body"))))
delta-vs (ffirst @received-deltas)
insert-delta (-> @received-deltas first second first :insert-deltas first)]
(is (= (ffirst @received-deltas) view-sig))
(is (= (:name insert-delta) (:name @vf/user-fixture)))
(is (= (:body insert-delta) (:body posted)))
(is (= (:title insert-delta) (:title posted)))))
;; (deftest removes-nil-deltas
;; (let [deltas {[:foo 1] {:insert-deltas '() :delete-deltas []}
;; [:bar 2] {:insert-deltas '() :delete-deltas [] :refresh-set []}
;; [:baz 2] {:insert-deltas '() :delete-deltas [{:baz 1}]}}]
;; (is (= #{[:bar 2] [:baz 2]} (into #{} (keys (vdb/remove-nil-deltas deltas)))))
;; ))

View file

@ -12,7 +12,7 @@
([all-views action templates]
(vd/do-view-transaction vschema vf/db all-views action templates)))
(use-fixtures :each vf/database-fixtures!)
(use-fixtures :each (vf/database-fixtures!))
(deftest builds-view-map
(let [{:keys [view-sig view refresh-only?]} (vd/view-map vf/users-tmpl [:users])]

View file

@ -6,7 +6,7 @@
[views.db.load :as vload]
[clojure.string :refer [upper-case]]))
(use-fixtures :each database-fixtures!)
(use-fixtures :each (database-fixtures!))
(defn subscribed-views
[]

View file

@ -24,9 +24,12 @@
(j/execute! db [(str "DELETE FROM " t)])))
(defn database-fixtures!
[f]
(clean-tables! [:posts :users :comments])
(f))
([] (database-fixtures! [:posts :users :comments]))
([tables]
(fn [f]
(clean-tables! tables)
(f)
(clean-tables! tables)))) ; do it after as well in case a test breaks
(defn rand-str
[l]
@ -44,6 +47,17 @@
[name]
(view-action! (hsql/build :insert-into :users :values [{:name name :created_on (sql-ts)}])))
(def user-fixture (atom nil))
(defn with-user-fixture!
([f] (with-user-fixture! "test user" f))
([name f]
(user-fixture! name)
(let [user (first (j/query db ["SELECT * FROM users WHERE name = ?" name]))]
(reset! user-fixture user)
(f)
(reset! user-fixture nil))))
(defn gen-n-users!
[n]
(dotimes [n n] (user-fixture! (rand-str 10)))