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:
parent
b61d5f00cf
commit
50100d17f6
|
@ -3,7 +3,7 @@
|
||||||
[clojure.test :refer [run-tests]]
|
[clojure.test :refer [run-tests]]
|
||||||
[views.subscriptions-test]
|
[views.subscriptions-test]
|
||||||
[views.base-subscribed-views-test]
|
[views.base-subscribed-views-test]
|
||||||
;; [views.db.core-test]
|
[views.db.core-test]
|
||||||
[views.db.deltas-test]
|
[views.db.deltas-test]
|
||||||
[views.db.checks-test] ; STILL SPECULATIVE
|
[views.db.checks-test] ; STILL SPECULATIVE
|
||||||
[views.db.honeysql-test]
|
[views.db.honeysql-test]
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
[]
|
[]
|
||||||
(run-tests 'views.subscriptions-test
|
(run-tests 'views.subscriptions-test
|
||||||
'views.base-subscribed-views-test
|
'views.base-subscribed-views-test
|
||||||
;; 'views.db.core-test
|
'views.db.core-test
|
||||||
'views.db.deltas-test
|
'views.db.deltas-test
|
||||||
'views.db.checks-test
|
'views.db.checks-test
|
||||||
'views.db.honeysql-test
|
'views.db.honeysql-test
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
(reset! vs/subscribed-views {})
|
(reset! vs/subscribed-views {})
|
||||||
(f))
|
(f))
|
||||||
|
|
||||||
(use-fixtures :each vf/database-fixtures! subscription-fixtures!)
|
(use-fixtures :each (vf/database-fixtures!) subscription-fixtures!)
|
||||||
|
|
||||||
(def persistence (InMemoryPersistence.))
|
(def persistence (InMemoryPersistence.))
|
||||||
|
|
||||||
|
@ -68,3 +68,13 @@
|
||||||
(add-subscription! [:users] vf/templates 1 default-ns)
|
(add-subscription! [:users] vf/templates 1 default-ns)
|
||||||
(add-subscription! [:users] vf/templates 2 default-ns)
|
(add-subscription! [:users] vf/templates 2 default-ns)
|
||||||
(broadcast-deltas base-subbed-views deltas nil)))
|
(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)))
|
||||||
|
|
63
test/views/db/core_test.clj
Normal file
63
test/views/db/core_test.clj
Normal 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)))))
|
||||||
|
;; ))
|
|
@ -12,7 +12,7 @@
|
||||||
([all-views action templates]
|
([all-views action templates]
|
||||||
(vd/do-view-transaction vschema vf/db 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
|
(deftest builds-view-map
|
||||||
(let [{:keys [view-sig view refresh-only?]} (vd/view-map vf/users-tmpl [:users])]
|
(let [{:keys [view-sig view refresh-only?]} (vd/view-map vf/users-tmpl [:users])]
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
[views.db.load :as vload]
|
[views.db.load :as vload]
|
||||||
[clojure.string :refer [upper-case]]))
|
[clojure.string :refer [upper-case]]))
|
||||||
|
|
||||||
(use-fixtures :each database-fixtures!)
|
(use-fixtures :each (database-fixtures!))
|
||||||
|
|
||||||
(defn subscribed-views
|
(defn subscribed-views
|
||||||
[]
|
[]
|
||||||
|
|
|
@ -24,9 +24,12 @@
|
||||||
(j/execute! db [(str "DELETE FROM " t)])))
|
(j/execute! db [(str "DELETE FROM " t)])))
|
||||||
|
|
||||||
(defn database-fixtures!
|
(defn database-fixtures!
|
||||||
[f]
|
([] (database-fixtures! [:posts :users :comments]))
|
||||||
(clean-tables! [:posts :users :comments])
|
([tables]
|
||||||
(f))
|
(fn [f]
|
||||||
|
(clean-tables! tables)
|
||||||
|
(f)
|
||||||
|
(clean-tables! tables)))) ; do it after as well in case a test breaks
|
||||||
|
|
||||||
(defn rand-str
|
(defn rand-str
|
||||||
[l]
|
[l]
|
||||||
|
@ -44,6 +47,17 @@
|
||||||
[name]
|
[name]
|
||||||
(view-action! (hsql/build :insert-into :users :values [{:name name :created_on (sql-ts)}])))
|
(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!
|
(defn gen-n-users!
|
||||||
[n]
|
[n]
|
||||||
(dotimes [n n] (user-fixture! (rand-str 10)))
|
(dotimes [n n] (user-fixture! (rand-str 10)))
|
||||||
|
|
Loading…
Reference in a new issue