diff --git a/test/views/all_tests.clj b/test/views/all_tests.clj index c34ab82..8e2c284 100644 --- a/test/views/all_tests.clj +++ b/test/views/all_tests.clj @@ -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 diff --git a/test/views/base_subscribed_views_test.clj b/test/views/base_subscribed_views_test.clj index 296650f..e4e9625 100644 --- a/test/views/base_subscribed_views_test.clj +++ b/test/views/base_subscribed_views_test.clj @@ -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))) diff --git a/test/views/db/core_test.clj b/test/views/db/core_test.clj new file mode 100644 index 0000000..d7e4953 --- /dev/null +++ b/test/views/db/core_test.clj @@ -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))))) +;; )) diff --git a/test/views/db/deltas_test.clj b/test/views/db/deltas_test.clj index e065c4d..637cbd3 100644 --- a/test/views/db/deltas_test.clj +++ b/test/views/db/deltas_test.clj @@ -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])] diff --git a/test/views/db/load_test.clj b/test/views/db/load_test.clj index ba19887..c54617f 100644 --- a/test/views/db/load_test.clj +++ b/test/views/db/load_test.clj @@ -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 [] diff --git a/test/views/fixtures.clj b/test/views/fixtures.clj index f55c8dc..a2a9112 100644 --- a/test/views/fixtures.clj +++ b/test/views/fixtures.clj @@ -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)))