Przeglądaj źródła

add rebase tests

Tienson Qin 6 dni temu
rodzic
commit
0f45a7641a

+ 1 - 1
rebase.md

@@ -1,7 +1,7 @@
 # Remote Rebase (Client)
 # Remote Rebase (Client)
 
 
 This doc describes how the client rebases and applies remote tx data in
 This doc describes how the client rebases and applies remote tx data in
-`rebase-apply-remote-tx!` to keep the server thin and to tolerate offline
+`apply-remote-tx!` to keep the server thin and to tolerate offline
 conflicts.
 conflicts.
 
 
 ## Goals
 ## Goals

+ 3 - 3
src/main/frontend/worker/db_sync.cljs

@@ -639,7 +639,7 @@
                                (p/resolved nil)))
                                (p/resolved nil)))
                            (p/resolved nil)))))
                            (p/resolved nil)))))
 
 
-(defn- rebase-apply-remote-tx! [repo client tx-data]
+(defn- apply-remote-tx! [repo client tx-data]
   (if-let [conn (worker-state/get-datascript-conn repo)]
   (if-let [conn (worker-state/get-datascript-conn repo)]
     (let [local-txs (pending-txs repo)
     (let [local-txs (pending-txs repo)
           pending-tx-ids (mapv :tx-id local-txs)
           pending-tx-ids (mapv :tx-id local-txs)
@@ -686,7 +686,7 @@
                              (let [pending-tx-data (->> local-txs
                              (let [pending-tx-data (->> local-txs
                                                         (mapcat :tx)
                                                         (mapcat :tx)
                                                         keep-last-parent-update)
                                                         keep-last-parent-update)
-                                   db (:db-after @temp-conn)
+                                   db @temp-conn
                                    pending-tx-data (sanitize-remote-tx-data db pending-tx-data)]
                                    pending-tx-data (sanitize-remote-tx-data db pending-tx-data)]
                                (when (seq pending-tx-data)
                                (when (seq pending-tx-data)
                                  (let [rebased-report (d/with (:db-after tx-report) pending-tx-data)
                                  (let [rebased-report (d/with (:db-after tx-report) pending-tx-data)
@@ -746,7 +746,7 @@
                                      (parse-transit (:tx data) {:repo repo :type "pull/ok"}))
                                      (parse-transit (:tx data) {:repo repo :type "pull/ok"}))
                                    txs)]
                                    txs)]
                     (when (seq tx)
                     (when (seq tx)
-                      (rebase-apply-remote-tx! repo client tx)
+                      (apply-remote-tx! repo client tx)
                       (client-op/update-local-tx repo remote-tx)
                       (client-op/update-local-tx repo remote-tx)
                       (flush-pending! repo client)))
                       (flush-pending! repo client)))
         "changed" (do
         "changed" (do

+ 50 - 7
src/test/frontend/worker/db_sync_test.cljs

@@ -51,7 +51,7 @@
     (let [{:keys [conn parent child1]} (setup-parent-child)]
     (let [{:keys [conn parent child1]} (setup-parent-child)]
       (with-datascript-conns conn nil
       (with-datascript-conns conn nil
         (fn []
         (fn []
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/add (:db/id parent) :block/parent (:db/id child1)]])
            [[:db/add (:db/id parent) :block/parent (:db/id child1)]])
@@ -68,7 +68,7 @@
       (with-datascript-conns conn client-ops-conn
       (with-datascript-conns conn client-ops-conn
         (fn []
         (fn []
           (d/transact! conn [[:db/add (:db/id child1) :block/parent (:db/id child2)]])
           (d/transact! conn [[:db/add (:db/id child1) :block/parent (:db/id child2)]])
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/add (:db/id child2) :block/parent (:db/id child1)]])
            [[:db/add (:db/id child2) :block/parent (:db/id child1)]])
@@ -84,7 +84,7 @@
         (fn []
         (fn []
           (d/transact! conn [[:db/add (:db/id child2) :block/parent (:db/id child1)]
           (d/transact! conn [[:db/add (:db/id child2) :block/parent (:db/id child1)]
                              [:db/add (:db/id child3) :block/parent (:db/id child2)]])
                              [:db/add (:db/id child3) :block/parent (:db/id child2)]])
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/add (:db/id child2) :block/parent (:db/id child3)]
            [[:db/add (:db/id child2) :block/parent (:db/id child3)]
@@ -103,7 +103,7 @@
       (with-datascript-conns conn client-ops-conn
       (with-datascript-conns conn client-ops-conn
         (fn []
         (fn []
           (outliner-core/insert-blocks! conn [{:block/title "child 4"}] parent {:sibling? false})
           (outliner-core/insert-blocks! conn [{:block/title "child 4"}] parent {:sibling? false})
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/retractEntity [:block/uuid (:block/uuid parent)]]])
            [[:db/retractEntity [:block/uuid (:block/uuid parent)]]])
@@ -117,7 +117,7 @@
       (with-datascript-conns conn client-ops-conn
       (with-datascript-conns conn client-ops-conn
         (fn []
         (fn []
           (d/transact! conn [[:db/add (:db/id child1) :block/title "child 1 local"]])
           (d/transact! conn [[:db/add (:db/id child1) :block/title "child 1 local"]])
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/add (:db/id child1) :block/order order]
            [[:db/add (:db/id child1) :block/order order]
@@ -135,7 +135,7 @@
       (with-datascript-conns conn client-ops-conn
       (with-datascript-conns conn client-ops-conn
         (fn []
         (fn []
           (d/transact! conn [[:db/add (:db/id child1) :block/title "child 1 local"]])
           (d/transact! conn [[:db/add (:db/id child1) :block/title "child 1 local"]])
-          (#'db-sync/rebase-apply-remote-tx!
+          (#'db-sync/apply-remote-tx!
            test-repo
            test-repo
            nil
            nil
            [[:db/add (:db/id child1) :block/order child2-order]])
            [[:db/add (:db/id child1) :block/order child2-order]])
@@ -161,7 +161,7 @@
                                         {:sibling? true})
                                         {:sibling? true})
           (let [local1 (db-test/find-block-by-content @conn "local 1")
           (let [local1 (db-test/find-block-by-content @conn "local 1")
                 local2 (db-test/find-block-by-content @conn "local 2")]
                 local2 (db-test/find-block-by-content @conn "local 2")]
-            (#'db-sync/rebase-apply-remote-tx!
+            (#'db-sync/apply-remote-tx!
              test-repo
              test-repo
              nil
              nil
              [[:db/add -1 :block/uuid remote-uuid-1]
              [[:db/add -1 :block/uuid remote-uuid-1]
@@ -183,3 +183,46 @@
                 orders (map :block/order children)]
                 orders (map :block/order children)]
             (is (every? some? orders))
             (is (every? some? orders))
             (is (= (count orders) (count (distinct orders))))))))))
             (is (= (count orders) (count (distinct orders))))))))))
+
+(deftest rebase-replaces-pending-txs-test
+  (testing "pending txs are rebased into a single tx after remote rebase"
+    (let [{:keys [conn client-ops-conn parent child1 child2]} (setup-parent-child)
+          child1-uuid (:block/uuid child1)
+          child2-uuid (:block/uuid child2)]
+      (with-redefs [db-sync/enqueue-local-tx!
+                    (let [orig db-sync/enqueue-local-tx!]
+                      (fn [repo tx-report]
+                        (when-not (:rtc-tx? (:tx-meta tx-report))
+                          (orig repo tx-report))))]
+        (with-datascript-conns conn client-ops-conn
+          (fn []
+            (d/transact! conn [[:db/add (:db/id child1) :block/title "child 1 local"]])
+            (d/transact! conn [[:db/add (:db/id child2) :block/title "child 2 local"]])
+            (is (= 2 (count (#'db-sync/pending-txs test-repo))))
+            (#'db-sync/apply-remote-tx!
+             test-repo
+             nil
+             [[:db/add (:db/id parent) :block/title "parent remote"]])
+            (let [pending (#'db-sync/pending-txs test-repo)
+                  txs (mapcat :tx pending)]
+              (is (= 1 (count pending)))
+              (is (some #(= % [:db/add [:block/uuid child1-uuid] :block/title "child 1 local"]) txs))
+              (is (some #(= % [:db/add [:block/uuid child2-uuid] :block/title "child 2 local"]) txs)))))))))
+
+(deftest rebase-keeps-pending-when-rebased-empty-test
+  (testing "pending txs stay when rebased txs are empty"
+    (let [{:keys [conn client-ops-conn child1]} (setup-parent-child)]
+      (with-redefs [db-sync/enqueue-local-tx!
+                    (let [orig db-sync/enqueue-local-tx!]
+                      (fn [repo tx-report]
+                        (when-not (:rtc-tx? (:tx-meta tx-report))
+                          (orig repo tx-report))))]
+        (with-datascript-conns conn client-ops-conn
+          (fn []
+            (d/transact! conn [[:db/add (:db/id child1) :block/title "same"]])
+            (is (= 1 (count (#'db-sync/pending-txs test-repo))))
+            (#'db-sync/apply-remote-tx!
+             test-repo
+             nil
+             [[:db/add (:db/id child1) :block/title "same"]])
+            (is (= 1 (count (#'db-sync/pending-txs test-repo))))))))))