| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- (ns client-steps
- (:require [cljs.test :as t :refer [is]]
- [const]
- [datascript.core :as d]
- [frontend.worker.rtc.client-op :as client-op]
- [frontend.worker.rtc.core :as rtc-core]
- [helper]
- [frontend.common.missionary :as c.m]
- [logseq.db :as ldb]
- [missionary.core :as m]))
- (def ^:private step0
- {:client1
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- tx-data (const/tx-data-map :create-page)]
- (helper/transact! conn tx-data)
- (is (=
- #{[:update-page const/page1-uuid]
- [:update const/page1-uuid
- [[:block/title "[\"~#'\",\"basic-edits-test\"]" true]
- [:block/created-at "[\"~#'\",1724836490809]" true]
- [:block/updated-at "[\"~#'\",1724836490809]" true]
- [:block/type "[\"~#'\",\"page\"]" true]]]
- [:move const/block1-uuid]
- [:update const/block1-uuid
- [[:block/updated-at "[\"~#'\",1724836490810]" true]
- [:block/created-at "[\"~#'\",1724836490810]" true]
- [:block/title "[\"~#'\",\"block1\"]" true]]]}
- (set (map helper/simplify-client-op (client-op/get-all-block-ops const/downloaded-test-repo)))))))
- :client2 nil})
- (def ^:private step1
- "client1: start rtc, wait page1, client1->remote
- client2: start rtc, wait page1, remote->client2"
- {:client1
- (m/sp
- (let [r (m/? (rtc-core/new-task--rtc-start false))]
- (is (nil? r))
- (m/? (helper/new-task--wait-all-client-ops-sent))))
- :client2
- (m/sp
- (let [r (m/? (rtc-core/new-task--rtc-start false))]
- (is (nil? r)))
- (m/?
- (c.m/backoff
- {}
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- page1 (d/pull @conn '[*] [:block/uuid const/page1-uuid])
- block1 (d/pull @conn '[*] [:block/uuid const/block1-uuid])]
- (when-not (:block/uuid page1)
- (throw (ex-info "wait page1 synced" {:missionary/retry true})))
- (is
- (= {:block/title "basic-edits-test"
- :block/name "basic-edits-test"
- :block/type "page"}
- (select-keys page1 [:block/title :block/name :block/type])))
- (is
- (= {:block/title "block1"
- :block/order "a0"
- :block/parent {:db/id (:db/id page1)}}
- (select-keys block1 [:block/title :block/order :block/parent]))))))))})
- (def ^:private step2
- "client1: insert 500 blocks, wait for changes to sync to remote
- client2: wait for blocks to sync from remote"
- {:client1
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)]
- (helper/transact! conn (const/tx-data-map :insert-500-blocks))
- (m/? (helper/new-task--wait-all-client-ops-sent))))
- :client2
- (c.m/backoff
- {}
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- page (d/pull @conn '[*] [:block/uuid const/page2-uuid])]
- (when-not (:block/uuid page)
- (throw (ex-info "wait page to be synced" {:missionary/retry true})))
- (let [blocks (ldb/sort-by-order (ldb/get-page-blocks @conn (:db/id page)))]
- (is (= 500 (count blocks)))
- (is (= (map #(str "x" %) (range 500))
- (map :block/title blocks)))))))})
- (def ^:private step3
- "client1:
- 1. add #task properties to block1 (`const/block1-uuid`)
- 2. wait to be synced
- 3. toggle block1 status to TODO
- 4. wait to be synced
- 5. toggle block1 status to DOING
- 6. wait to be synced
- client2:
- 1. wait the block&its properties to be synced"
- {:client1
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- tx-data1 (const/tx-data-map :step3-add-task-properties-to-block1)
- tx-data2 (const/tx-data-map :step3-toggle-status-TODO)
- tx-data3 (const/tx-data-map :step3-toggle-status-DOING)]
- (helper/transact! conn tx-data1)
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (helper/transact! conn tx-data2)
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (helper/transact! conn tx-data3)
- (m/? (helper/new-task--wait-all-client-ops-sent))))
- :client2
- (c.m/backoff
- {}
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- block1 (d/pull @conn
- [{:block/tags [:db/ident]}
- {:logseq.property/status [:db/ident]}
- {:logseq.property/deadline [:block/journal-day]}]
- [:block/uuid const/block1-uuid])]
- (when-not (= :logseq.property/status.doing (:db/ident (:logseq.property/status block1)))
- (throw (ex-info "wait block1's task properties to be synced" {:missionary/retry true})))
- (is (= {:block/tags [{:db/ident :logseq.class/Task}],
- :logseq.property/status {:db/ident :logseq.property/status.doing}
- :logseq.property/deadline {:block/journal-day 20240907}}
- block1)))))})
- (def ^:private step4
- "client1:
- client2:
- "
- {:client1
- (m/sp nil)
- :client2
- (m/sp nil)})
- (def ^:private step5
- "client1:
- - insert some blocks in page2
- - wait to be synced
- - wait a signal from client2
- - send a signal to client2
- - stop rtc
- - move some blocks
- - start rtc
- - wait to be synced
- - wait client2's message, which contains the result of client2's block tree,
- and compare them with blocks in client1
- client2:
- - wait inserted blocks synced
- - send a signal to client1
- - wait a signal from client1
- - stop rtc
- - move some blocks
- - start rtc
- - wait to be synced
- - send a message to client1 contains client2's block tree to client1"
- {:client1
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- tx-data1 (const/tx-data-map :move-blocks-concurrently-1)
- tx-data2 (const/tx-data-map :move-blocks-concurrently-client1)]
- (helper/transact! conn tx-data1)
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (m/? (helper/new-task--client1-sync-barrier-2->1 "move-blocks-concurrently-signal"))
- (m/? helper/new-task--stop-rtc)
- (helper/transact! conn tx-data2)
- (is (nil? (m/? (rtc-core/new-task--rtc-start false))))
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (m/? (helper/new-task--client1-sync-barrier-2->1 "step5"))
- (let [message (m/? (helper/new-task--wait-message-from-other-client
- (fn [message] (= "move-blocks-concurrently-page-blocks" (:id message)))
- :retry-message "move-blocks-concurrently-page-blocks"))
- client2-page-blocks (:page-blocks message)
- client1-page-blocks (ldb/get-page-blocks @conn (:db/id (d/entity @conn [:block/uuid const/page3-uuid]))
- :pull-keys '[:block/uuid :block/title :block/order
- {:block/parent [:block/uuid]}])]
- (is (= (set client1-page-blocks) (set client2-page-blocks))))))
- :client2
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)]
- (m/?
- (c.m/backoff
- (take 4 c.m/delays)
- (m/sp
- (let [page3 (d/pull @conn '[*] [:block/uuid const/page3-uuid])
- page3-blocks (some->> (:db/id page3)
- (ldb/get-page-blocks @conn))]
- (when-not (:block/uuid page3)
- (throw (ex-info "wait page3 synced" {:missionary/retry true})))
- (is (= 6 (count page3-blocks)))))))
- (m/? (helper/new-task--client2-sync-barrier-2->1 "move-blocks-concurrently-signal"))
- (m/? helper/new-task--stop-rtc)
- (helper/transact! conn (const/tx-data-map :move-blocks-concurrently-client2))
- (is (nil? (m/? (rtc-core/new-task--rtc-start false))))
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (m/? (helper/new-task--client2-sync-barrier-2->1 "step5"))
- (m/? (helper/new-task--send-message-to-other-client
- {:id "move-blocks-concurrently-page-blocks"
- :page-blocks (ldb/get-page-blocks @conn (:db/id (d/entity @conn [:block/uuid const/page3-uuid]))
- :pull-keys '[:block/uuid :block/title :block/order
- {:block/parent [:block/uuid]}])}))))})
- (def ^:private step6
- "Delete blocks test-1
- client1:
- - insert some blocks
- - wait to be synced
- - stop rtc
- - delete blocks
- - start rtc
- - wait to be synced
- client2:
- - wait blocks from client1
- - wait delete-blocks changes synced from client1
- - check block-tree"
- {:client1
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)
- tx-data1 (const/tx-data-map :step6-delete-blocks-client1-1)
- tx-data2 (const/tx-data-map :step6-delete-blocks-client1-2)]
- (helper/transact! conn tx-data1)
- (m/? (helper/new-task--wait-all-client-ops-sent))
- (m/? (helper/new-task--client1-sync-barrier-1->2 "step6"))
- (m/? helper/new-task--stop-rtc)
- (helper/transact! conn tx-data2)
- (let [r (m/? (rtc-core/new-task--rtc-start false))]
- (is (nil? r))
- (m/? (helper/new-task--wait-all-client-ops-sent)))))
- :client2
- (m/sp
- (let [conn (helper/get-downloaded-test-conn)]
- (m/? (helper/new-task--client2-sync-barrier-1->2 "step6"))
- (m/?
- (c.m/backoff
- {}
- (m/sp
- (let [page (d/pull @conn '[*] [:block/uuid const/step6-page-uuid])
- page-blocks (when-let [page-id (:db/id page)]
- (ldb/get-page-blocks @conn page-id
- :pull-keys '[:block/uuid {:block/parent [:block/uuid]}]))]
- (when-not (= 1 (count page-blocks))
- (throw (ex-info "wait delete-blocks changes synced"
- {:missionary/retry true
- :page-blocks page-blocks})))
- (is (= {:block/uuid const/step6-block3-uuid
- :block/parent {:block/uuid const/step6-page-uuid}}
- (select-keys (first page-blocks) [:block/uuid :block/parent])))))))))})
- (defn- wrap-print-step-info
- [steps client]
- (map-indexed
- (fn [idx step]
- (m/sp
- (helper/log "start step" idx)
- (some-> (get step client) m/?)
- (helper/log "end step" idx)))
- steps))
- (def ^:private all-steps [step0 step1 step2 step3 step4 step5 step6])
- (def client1-steps
- (wrap-print-step-info all-steps :client1))
- (def client2-steps
- (wrap-print-step-info all-steps :client2))
|