test(e2e): add asset-blocks-validate-after-init-downloaded-test

This commit is contained in:
rcmerci
2025-12-19 01:49:40 +08:00
parent 38e3b99803
commit 8d7ce39897
13 changed files with 118 additions and 42 deletions

23
clj-e2e/AGENTS.md Normal file
View File

@@ -0,0 +1,23 @@
# E2E test Guide
- Source Layout (`src/logseq/e2e/`)
- `assert.clj`: Custom assertion functions
- `block.clj`: Block manipulation helpers
- `config.clj`: Configuration settings
- `const.clj`: Shared constants
- `graph.clj`: Graph management helpers
- `keyboard.clj`: Keyboard shortcut helpers
- `locator.clj`: Playwright locator utilities
- `page.clj`: Page operations helpers
- `playwright_page.clj`: Playwright page initialization
- `rtc.clj`: RTC testing helpers
- `settings.clj`: Logseq settings manipulation
- `util.clj`: General utilities
- Tests (`test/logseq/e2e/`)
- `fixtures.clj`: Test fixtures
- Basic Tests: `*_basic_test.clj`
- RTC Tests: `rtc_*_test.clj`
- Run tests commands (in `clj-e2e` directory)
- `clojure -X:dev-run-rtc-extra-test`
- `clojure -X:dev-run-rtc-extra-part2-test`
- `clojure -X:dev-run-all-basic-test`

View File

@@ -21,5 +21,7 @@
:dev {:extra-paths ["dev" "test"]}
:dev-run-rtc-extra-test {:extra-paths ["dev" "test"]
:exec-fn user/run-rtc-extra-test2}
:dev-run-rtc-extra-part2-test {:extra-paths ["dev" "test"]
:exec-fn user/run-rtc-extra-part2-test2}
:dev-run-all-basic-test {:extra-paths ["dev" "test"]
:exec-fn user/run-all-basic-test}}}

View File

@@ -15,6 +15,7 @@
[logseq.e2e.property-basic-test]
[logseq.e2e.reference-basic-test]
[logseq.e2e.rtc-basic-test]
[logseq.e2e.rtc-extra-part2-test]
[logseq.e2e.rtc-extra-test]
[logseq.e2e.tag-basic-test]
[logseq.e2e.util :as util]
@@ -79,6 +80,11 @@
(run-tests 'logseq.e2e.rtc-extra-test)
(System/exit 0))
(defn run-rtc-extra-part2-test2
[& _args]
(run-tests 'logseq.e2e.rtc-extra-part2-test)
(System/exit 0))
(defn run-editor-basic-test
[]
(->> (future (run-tests 'logseq.e2e.editor-basic-test))

View File

@@ -7,3 +7,5 @@
(def *page2
"this 'page' means playwright-page, not logseq-page. it points to the client2 when testing rtc"
(atom nil))
(def ^:dynamic *graph-name* nil)

View File

@@ -59,6 +59,15 @@
(format "div[data-testid='logseq_db_%s']" graph-name)
refresh-all-remote-graphs))
(defn remove-local-graph
[graph-name]
(wait-for-remote-graph graph-name)
(let [action-btn
(.first (w/-query (format "div[data-testid='logseq_db_%s'] .graph-action-btn" graph-name)))]
(w/click action-btn)
(w/click ".delete-local-graph-menu-item")
(w/click "div[role='alertdialog'] button:text('ok')")))
(defn remove-remote-graph
[graph-name]
(wait-for-remote-graph graph-name)
@@ -69,11 +78,11 @@
(w/click "div[role='alertdialog'] button:text('ok')")))
(defn switch-graph
[to-graph-name wait-sync?]
[to-graph-name wait-sync? need-input-password?]
(goto-all-graphs)
(w/click (.last (w/-query (format "div[data-testid='logseq_db_%1$s'] span:has-text('%1$s')" to-graph-name))))
(when wait-sync?
(input-e2ee-password)
(when need-input-password? (input-e2ee-password))
(w/wait-for "button.cloud.on.idle" {:timeout 20000}))
(assert/assert-graph-loaded?))

View File

@@ -18,6 +18,10 @@
(k/esc)
(util/search-and-click page-name))))
(defn get-page-name
[]
(util/get-text "div[data-testid='page title'] .block-title-wrap"))
(defn new-page
[title]
;; Question: what's the best way to close all the popups?
@@ -42,17 +46,18 @@
(k/esc))
(defn- set-tag-extends
[extends & [in-retry?]]
(util/wait-timeout 500)
(w/click (loc/filter ".property-value" :has-text "root tag"))
(let [extends-visible? (mapv #(w/visible? (format "div:has(> button):has(div:text('%s'))" %)) extends)]
(if (every? identity extends-visible?)
(doseq [extend extends]
(w/click (format "div:has(> button):has(div:text('%s'))" extend)))
(if in-retry?
(throw (ex-info "parent-tag not found" {:extends extends :visible? extends-visible?}))
(do (k/esc)
(set-tag-extends extends true))))))
[extends & [retry-count]]
(let [retry-count (or retry-count 5)]
(util/wait-timeout 500)
(w/click (loc/filter ".property-value" :has-text "root tag"))
(let [extends-visible? (mapv #(w/visible? (format "div:has(> button):has(div:text('%s'))" %)) extends)]
(if (every? identity extends-visible?)
(doseq [extend extends]
(w/click (format "div:has(> button):has(div:text('%s'))" extend)))
(if (zero? retry-count)
(throw (ex-info "parent-tag not found" {:extends extends :visible? extends-visible?}))
(do (k/esc)
(set-tag-extends extends (dec retry-count))))))))
(defn convert-to-tag
[page-name & {:keys [extends]}]

View File

@@ -2,7 +2,7 @@
(:require [com.climate.claypoole :as cp]
[logseq.e2e.assert :as assert]
[logseq.e2e.config :as config]
[logseq.e2e.const :refer [*page1 *page2]]
[logseq.e2e.const :refer [*page1 *page2 *graph-name*]]
[logseq.e2e.custom-report :as custom-report]
[logseq.e2e.graph :as graph]
[logseq.e2e.page :as page]
@@ -148,9 +148,10 @@
(graph/new-graph graph-name true))
(w/with-page @*page2
(graph/wait-for-remote-graph graph-name)
(graph/switch-graph graph-name true))
(graph/switch-graph graph-name true true))
(binding [custom-report/*preserve-graph* false]
(binding [custom-report/*preserve-graph* false
*graph-name* graph-name]
(f)
;; cleanup
(if custom-report/*preserve-graph*

View File

@@ -34,15 +34,15 @@
(w/with-page p2
(util/goto-journals)
(assert/assert-in-normal-mode?)
(graph/switch-graph graph-name false))
(graph/switch-graph graph-name false false))
(w/with-page p3
(util/goto-journals)
(assert/assert-in-normal-mode?)
(graph/switch-graph graph-name false))
(graph/switch-graph graph-name false false))
(w/with-page p1
(util/goto-journals)
(assert/assert-in-normal-mode?)
(graph/switch-graph graph-name false))
(graph/switch-graph graph-name false false))
(let [graph-new-blocks (map #(str graph-name "-b1-" %) (range 5))]
(add-blocks-and-check-on-other-tabs graph-new-blocks p1 [p2 p3])))]
(w/with-page p1

View File

@@ -30,7 +30,7 @@
(graph/new-graph graph-name true))
(w/with-page @*page2
(graph/wait-for-remote-graph graph-name)
(graph/switch-graph graph-name true)))
(graph/switch-graph graph-name true true)))
(testing "logseq pages add/delete"
(doseq [page-name page-names]
(let [{:keys [_local-tx remote-tx]}

View File

@@ -1,9 +1,9 @@
(ns logseq.e2e.rtc-extra-part2-test
(:require [clojure.string :as string]
[clojure.test :refer [deftest testing is use-fixtures run-test]]
(:require [clojure.test :refer [deftest testing is use-fixtures run-test]]
[logseq.e2e.block :as b]
[logseq.e2e.const :refer [*page1 *page2]]
[logseq.e2e.const :refer [*page1 *page2 *graph-name*]]
[logseq.e2e.fixtures :as fixtures]
[logseq.e2e.graph :as graph]
[logseq.e2e.page :as page]
[logseq.e2e.rtc :as rtc]
[logseq.e2e.util :as util]
@@ -101,3 +101,37 @@ wait for 5-10 seconds, will found that \"aaa/bbb\" became \"aaa/<encrypted-strin
(util/get-page-blocks-contents)))))
(rtc/validate-graphs-in-2-pw-pages)))
(deftest asset-blocks-validate-after-init-downloaded-test
(testing "
- add some assets in client1
- remove local graph in client2
- re-download the remote graph in client2
- compare asset-blocks data in both clients"
(let [asset-file "../assets/icon.png"
page-title (w/with-page @*page1 (page/get-page-name))]
(w/with-page @*page1
(let [p (w/get-page)]
(.onFileChooser p (reify java.util.function.Consumer
(accept [_ fc]
(.setFiles fc (into-array java.nio.file.Path [(java.nio.file.Paths/get asset-file (into-array String []))])))))
(b/new-block "asset block")
(util/input-command "Upload an asset")
(w/wait-for ".ls-block img")))
(let [{:keys [remote-tx]}
(w/with-page @*page1
(rtc/with-wait-tx-updated
(b/new-block "sync done")))]
(w/with-page @*page2
(rtc/wait-tx-update-to remote-tx)))
(w/with-page @*page2
(graph/remove-local-graph *graph-name*)
(graph/wait-for-remote-graph *graph-name*)
(graph/switch-graph *graph-name* true false)
(page/goto-page page-title)
(w/wait-for ".ls-block img")
(is (some? (.getAttribute (w/-query ".ls-block img") "src"))))
(rtc/validate-graphs-in-2-pw-pages))))