From e3734264fc70b58cf3af9d60059b142fd38e8d3d Mon Sep 17 00:00:00 2001 From: rcmerci Date: Thu, 24 Apr 2025 19:03:22 +0800 Subject: [PATCH] test(e2e): open 2 instances, login, create rtc-graph --- .cljfmt.edn | 8 ++-- clj-e2e/.cljfmt.edn | 4 ++ clj-e2e/deps.edn | 2 +- clj-e2e/src/logseq/e2e/util.clj | 49 +++++++++++++++++++++- clj-e2e/test/logseq/e2e/fixtures.clj | 33 +++++++++++++-- clj-e2e/test/logseq/e2e/rtc_basic_test.clj | 29 +++++++++++++ 6 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 clj-e2e/.cljfmt.edn create mode 100644 clj-e2e/test/logseq/e2e/rtc_basic_test.clj diff --git a/.cljfmt.edn b/.cljfmt.edn index 8355849ec0..a32163e909 100644 --- a/.cljfmt.edn +++ b/.cljfmt.edn @@ -1,4 +1,4 @@ - {:extra-indents {missionary.core/sp [[:block 0]] - missionary.core/ap [[:block 0]] - frontend.common.missionary/run-task [[:inner 0]]} - :sort-ns-references? true} +{:extra-indents {missionary.core/sp [[:block 0]] + missionary.core/ap [[:block 0]] + frontend.common.missionary/run-task [[:inner 0]]} + :sort-ns-references? true} diff --git a/clj-e2e/.cljfmt.edn b/clj-e2e/.cljfmt.edn new file mode 100644 index 0000000000..a32163e909 --- /dev/null +++ b/clj-e2e/.cljfmt.edn @@ -0,0 +1,4 @@ +{:extra-indents {missionary.core/sp [[:block 0]] + missionary.core/ap [[:block 0]] + frontend.common.missionary/run-task [[:inner 0]]} + :sort-ns-references? true} diff --git a/clj-e2e/deps.edn b/clj-e2e/deps.edn index 3fb73522a2..7948fa546c 100644 --- a/clj-e2e/deps.edn +++ b/clj-e2e/deps.edn @@ -4,7 +4,7 @@ io.github.pfeodrippe/wally {:git/url "https://github.com/logseq/wally" :sha "6b0583701fc64ec5177eec6577e33bb8d9115d61"} ;; io.github.zmedelis/bosquet {:mvn/version "2025.03.28"} - } + org.clj-commons/claypoole {:mvn/version "1.2.2"}} :aliases {:build {:deps {io.github.clojure/tools.build {:mvn/version "0.10.5"}} :ns-default build} diff --git a/clj-e2e/src/logseq/e2e/util.clj b/clj-e2e/src/logseq/e2e/util.clj index f1c4a6fe5d..782695e447 100644 --- a/clj-e2e/src/logseq/e2e/util.clj +++ b/clj-e2e/src/logseq/e2e/util.clj @@ -4,7 +4,8 @@ [clojure.test :refer [is]] [wally.main :as w] [wally.selectors :as ws]) - (:import (com.microsoft.playwright.assertions PlaywrightAssertions))) + (:import [com.microsoft.playwright.assertions PlaywrightAssertions] + [com.microsoft.playwright TimeoutError])) (def assert-that PlaywrightAssertions/assertThat) @@ -39,6 +40,11 @@ (def press w/keyboard-press) +(defn cmdk + [input-text] + (press "Meta+k") + (input input-text)) + (defn search [text] (w/click :#search-button) @@ -147,3 +153,44 @@ (def mac? (= "Mac OS X" (System/getProperty "os.name"))) (def mod-key (if mac? "Meta" "Control")) + +(defn login-test-account + [& {:keys [username password] + :or {username "e2etest" + password "Logseq-e2e"}}] + (w/eval-js "localStorage.setItem(\"login-enabled\",true);") + (w/click "button[title=\"More\"]") + (w/click "div:text(\"Login\")") + (input username) + (press "Tab") + (input password) + (w/click "button[type=\"submit\"]:text(\"Sign in\")") + (w/wait-for-not-visible ".cp__user-login")) + + +(defn new-graph + [graph-name enable-sync?] + (cmdk "add a db graph") + (w/click (w/get-by-label "Add a DB graph")) + (w/wait-for "h2:text(\"Create a new graph\")") + (w/click "input[placeholder=\"your graph name\"]") + (input graph-name) + (when enable-sync? + (w/click "button#rtc-sync")) + (w/click "button:text(\"Submit\")") + (when enable-sync? + (w/wait-for "button.cloud.on.idle" {:timeout 20000}))) + + +(defn wait-for-remote-graph + [graph-name] + (cmdk "all graphs") + (w/click (w/get-by-label "Go to all graphs")) + (dotimes [i 5] + (prn :wait-for-remote-graph-try i) + (w/click "span:text(\"Refresh\")") + (try + (w/wait-for (str "span:has-text(\"" graph-name "\")")) + (catch TimeoutError e + (when (= 4 i) + (throw e)))))) diff --git a/clj-e2e/test/logseq/e2e/fixtures.clj b/clj-e2e/test/logseq/e2e/fixtures.clj index ebc20dc4c3..e1f002e625 100644 --- a/clj-e2e/test/logseq/e2e/fixtures.clj +++ b/clj-e2e/test/logseq/e2e/fixtures.clj @@ -4,8 +4,9 @@ ;; TODO: save trace ;; TODO: parallel support (defn open-page - [f & {:keys [headless] - :or {headless true}}] + [f & {:keys [headless port] + :or {headless true + port 3002}}] (w/with-page-open (w/make-page {:headless headless :persistent false @@ -13,5 +14,31 @@ ;; Set `slow-mo` lower to find more flaky tests ;; :slow-mo 30 }) - (w/navigate "http://localhost:3002") + (w/navigate (str "http://localhost:" port)) (f))) + +(def *page1 (atom nil)) +(def *page2 (atom nil)) + +(defn open-2-pages + "Use `*page1` and `*page2` in `f`" + [f & {:keys [headless port] + :or {headless true + port 3002}}] + (let [p1 (w/make-page {:headless headless + :persistent false + :slow-mo 100}) + p2 (w/make-page {:headless headless + :persistent false + :slow-mo 100})] + (run! + #(w/with-page % + (w/navigate (str "http://localhost:" port))) + [p1 p2]) + + (reset! *page1 p1) + (reset! *page2 p2) + (binding [w/*page* (delay (throw (ex-info "Don't use *page*, use *page1* and *page2* instead" {})))] + (f)) + (w/with-page-open p1) + (w/with-page-open p2))) diff --git a/clj-e2e/test/logseq/e2e/rtc_basic_test.clj b/clj-e2e/test/logseq/e2e/rtc_basic_test.clj new file mode 100644 index 0000000000..570aabc549 --- /dev/null +++ b/clj-e2e/test/logseq/e2e/rtc_basic_test.clj @@ -0,0 +1,29 @@ +(ns logseq.e2e.rtc-basic-test + (:require + [clojure.test :refer [deftest testing is use-fixtures]] + [com.climate.claypoole :as cp] + [logseq.e2e.fixtures :as fixtures :refer [*page1 *page2]] + [logseq.e2e.util :as util] + [wally.main :as w] + [wally.repl :as repl])) + +(use-fixtures :once fixtures/open-2-pages) + +;; (use-fixtures :once #(fixtures/open-2-pages % :headless false :port 3001)) + +(deftest rtc-basic-test + (let [graph-name (str "rtc-graph-" (.toEpochMilli (java.time.Instant/now)))] + (testing "open 2 app instances" + (cp/prun! + 2 + #(w/with-page % + (util/login-test-account)) + [@*page1 @*page2]) + (w/with-page @*page1 + (util/new-graph graph-name true)) + (w/with-page @*page2 + (util/wait-for-remote-graph graph-name))))) + +(comment + (def xxx (future (clojure.test/run-tests))) + (future-cancel xxx))