Răsfoiți Sursa

enhance: make e2e tests more stable

Tienson Qin 7 luni în urmă
părinte
comite
f4c04a45f1

+ 1 - 1
clj-e2e/deps.edn

@@ -2,7 +2,7 @@
  :deps {org.clojure/clojure {:mvn/version "1.12.0"}
         ;; io.github.pfeodrippe/wally {:local/root "../../../wally"}
         io.github.pfeodrippe/wally {:git/url "https://github.com/logseq/wally"
-                                    :sha "6b0583701fc64ec5177eec6577e33bb8d9115d61"}
+                                    :sha "80ea665c75704a8ca80cb22caeaec3ae6f39ffdb"}
         ;; io.github.zmedelis/bosquet {:mvn/version "2025.03.28"}
         org.clj-commons/claypoole          {:mvn/version "1.2.2"}}
  :aliases

+ 12 - 5
clj-e2e/src/logseq/e2e/assert.clj

@@ -4,15 +4,21 @@
 
 (def assert-that PlaywrightAssertions/assertThat)
 
+(defn- locator-from-q
+  [q]
+  (if (instance? com.microsoft.playwright.Locator q)
+    q
+    (w/-query q)))
+
 (defn assert-is-visible
   "Multiple elements may match `q`, check and wait for the first element to be visible."
   [q]
-  (-> q w/query first assert-that .isVisible)
+  (-> (locator-from-q q) assert-that .isVisible)
   true)
 
 (defn assert-is-hidden
   [q]
-  (-> (w/-query q) assert-that .isHidden)
+  (-> (locator-from-q q) assert-that .isHidden)
   true)
 
 (defn assert-in-normal-mode?
@@ -20,7 +26,7 @@
   - no action bar
   - no search(cmdk) modal"
   []
-  (assert-is-hidden (w/get-by-label "editing block"))
+  (assert-is-hidden (w/get-by-test-id "block editor"))
   (assert-is-hidden ".selection-action-bar")
   (assert-is-visible "#search-button")
   true)
@@ -28,10 +34,11 @@
 (defn assert-graph-loaded?
   []
   ;; there's some blocks visible now
-  (assert-is-visible "span.block-title-wrap"))
+  (assert-is-visible (w/get-by-test-id "page title")))
 
 (defn assert-editor-mode
   []
   (let [klass ".editor-wrapper textarea"
         editor (w/-query klass)]
-    (w/wait-for editor)))
+    (w/wait-for editor)
+    editor))

+ 3 - 2
clj-e2e/src/logseq/e2e/block.clj

@@ -17,10 +17,11 @@
 
 (defn new-block
   [title]
-  (let [editor? (util/get-editor)]
-    (when-not editor? (open-last-block))
+  (let [editor (util/get-editor)]
+    (when-not editor (open-last-block))
     (assert/assert-editor-mode)
     (k/enter)
+    (assert/assert-editor-mode)
     (save-block title)))
 
 ;; TODO: support tree

+ 13 - 2
clj-e2e/src/logseq/e2e/util.clj

@@ -62,12 +62,23 @@
   (double-esc)
   (assert/assert-in-normal-mode?)
   (w/click :#search-button)
+  (w/wait-for ".cp__cmdk-search-input")
   (w/fill ".cp__cmdk-search-input" text))
 
 (defn search-and-click
   [search-text]
   (search search-text)
-  (w/click (w/get-by-label search-text)))
+  (w/click (w/get-by-test-id search-text)))
+
+(defn wait-editor-gone
+  ([]
+   (wait-editor-gone ".editor-wrapper textarea"))
+  ([editor]
+   (w/wait-for-not-visible editor)))
+
+(defn wait-editor-visible
+  []
+  (w/wait-for ".editor-wrapper textarea"))
 
 (defn new-page
   [title]
@@ -76,7 +87,7 @@
   ;; (repl/pause)
   (search title)
   (w/click [(ws/text "Create page") (ws/nth= "0")])
-  (w/wait-for ".editor-wrapper textarea"))
+  (wait-editor-visible))
 
 (defn count-elements
   [q]

+ 1 - 1
src/main/frontend/components/cmdk/list_item.cljs

@@ -40,7 +40,7 @@
             highlighted-text (string/replace normal-text query-re "<:hlmarker>$1<:hlmarker>")
             segs (string/split highlighted-text #"<:hlmarker>")]
         (if (seq segs)
-          (into [:span {:aria-label text-string}]
+          (into [:span {:data-testid text-string}]
                 (map-indexed (fn [i seg]
                                (if (even? i)
                                  [:span seg]

+ 1 - 0
src/main/frontend/components/page.cljs

@@ -446,6 +446,7 @@
   (let [with-actions? (not config/publishing?)]
     [:div.ls-page-title.flex.flex-1.w-full.content.items-start.title
      {:class (when-not whiteboard-page? "title")
+      :data-testid "page title"
       :on-pointer-down (fn [e]
                          (when (util/right-click? e)
                            (state/set-state! :page-title/context {:page (:block/title page)

+ 9 - 10
src/main/frontend/ui.cljs

@@ -104,8 +104,6 @@
   {:did-mount (fn [state]
                 (let [^js el (rum/dom-node state)
                       *mouse-point (volatile! nil)]
-                  ;; Passing aria-label as a prop to TextareaAutosize removes the dash
-                  (.setAttribute el "aria-label" "editing block")
                   (doto el
                     (.addEventListener "select"
                                        #(let [start (util/get-selection-start el)
@@ -136,6 +134,7 @@
                                                 (on-change e))
                              (state/set-editor-in-composition! true))))
         props (assoc props
+                     "data-testid" "block editor"
                      :on-change (fn [e] (when-not (state/editor-in-composition?)
                                           (on-change e)))
                      :on-composition-start on-composition
@@ -876,8 +875,8 @@
         enabled-tooltip? (state/enable-tooltip?)]
     (if (and enabled-tooltip? shortcut-tooltip?)
       (tooltip content
-        [:div.text-sm.font-medium (keyboard-shortcut-from-config shortcut-key)]
-        {:trigger-props {:as-child true}})
+               [:div.text-sm.font-medium (keyboard-shortcut-from-config shortcut-key)]
+               {:trigger-props {:as-child true}})
       content)))
 
 (rum/defc progress-bar
@@ -977,12 +976,12 @@
 (rum/defc tooltip
   [trigger tooltip-content & {:keys [portal? root-props trigger-props content-props]}]
   (shui/tooltip-provider
-    (shui/tooltip root-props
-      (shui/tooltip-trigger (merge {:as-child true} trigger-props) trigger)
-      (if (not (false? portal?))
-        (shui/tooltip-portal
-          (shui/tooltip-content content-props tooltip-content))
-        (shui/tooltip-content content-props tooltip-content)))))
+   (shui/tooltip root-props
+                 (shui/tooltip-trigger (merge {:as-child true} trigger-props) trigger)
+                 (if (not (false? portal?))
+                   (shui/tooltip-portal
+                    (shui/tooltip-content content-props tooltip-content))
+                   (shui/tooltip-content content-props tooltip-content)))))
 
 (rum/defc DelDateButton
   [on-delete]