فهرست منبع

test(e2e): dump console logs when test failed

rcmerci 5 ماه پیش
والد
کامیت
5e60ce853d

+ 1 - 1
clj-e2e/src/logseq/e2e/rtc.clj

@@ -19,7 +19,7 @@
          tx# (max local-tx# remote-tx#)]
      ~@body
      (loop [i# 5]
-       (when (zero? i#) (throw (ex-info "wait-tx-updated failed" {:data m#})))
+       (when (zero? i#) (throw (ex-info "wait-tx-updated failed" {:old m# :new (get-rtc-tx)})))
        (util/wait-timeout 1000)
        (let [new-m# (get-rtc-tx)
              new-local-tx# (or (:local-tx new-m#) 0)

+ 18 - 3
clj-e2e/test/logseq/e2e/custom_report.clj

@@ -1,5 +1,6 @@
 (ns logseq.e2e.custom-report
-  (:require [clojure.stacktrace :as stack]
+  (:require [clojure.pprint :as pp]
+            [clojure.stacktrace :as stack]
             [clojure.string :as string]
             [clojure.test :as t]
             [logseq.e2e.playwright-page :as pw-page])
@@ -10,6 +11,8 @@
   record all playwright contexts in this dynamic var"
   nil)
 
+(def ^:dynamic *pw-page->console-logs* nil)
+
 (defn screenshot
   [page test-name]
   (println :screenshot test-name)
@@ -37,7 +40,13 @@
   ;; screenshot for all pw pages when :error
   (when-let [all-contexts (seq *pw-contexts*)]
     (doseq [page (mapcat pw-page/get-pages all-contexts)]
-      (screenshot page (string/join "-" (map (comp str :name meta) t/*testing-vars*))))))
+      (screenshot page (string/join "-" (map (comp str :name meta) t/*testing-vars*)))))
+
+  ;; dump console logs
+  (when-let [pw-page->console-logs (some-> *pw-page->console-logs* deref)]
+    (doseq [[_pw-page logs] pw-page->console-logs]
+      (spit (format "e2e-dump/console-logs-%s.txt" (System/currentTimeMillis))
+            (with-out-str (pp/pprint logs))))))
 
 (defmethod t/report :fail
   [m]
@@ -52,4 +61,10 @@
   ;; screenshot for all pw pages when :fail
   (when-let [all-contexts (seq *pw-contexts*)]
     (doseq [page (mapcat pw-page/get-pages all-contexts)]
-      (screenshot page (string/join "-" (map (comp str :name meta) t/*testing-vars*))))))
+      (screenshot page (string/join "-" (map (comp str :name meta) t/*testing-vars*)))))
+
+;; dump console logs
+  (when-let [pw-page->console-logs (some-> *pw-page->console-logs* deref)]
+    (doseq [[_pw-page logs] pw-page->console-logs]
+      (spit (format "e2e-dump/console-logs-%s.txt" (System/currentTimeMillis))
+            (with-out-str (pp/pprint logs))))))

+ 15 - 2
clj-e2e/test/logseq/e2e/fixtures.clj

@@ -16,11 +16,16 @@
                   :persistent false
                   :slow-mo @config/*slow-mo})
     (w/grant-permissions :clipboard-write :clipboard-read)
-    (binding [custom-report/*pw-contexts* #{(.context (w/get-page))}]
+    (binding [custom-report/*pw-contexts* #{(.context (w/get-page))}
+              custom-report/*pw-page->console-logs* (atom {})]
       (w/navigate (str "http://localhost:" (or port @config/*port)))
       (settings/developer-mode)
       (w/refresh)
       (assert/assert-graph-loaded?)
+      (let [p (w/get-page)]
+        (.onConsoleMessage p (fn [msg]
+                               (when custom-report/*pw-page->console-logs*
+                                 (swap! custom-report/*pw-page->console-logs* update p conj (.text msg))))))
       (f))))
 
 (def *page1 (atom nil))
@@ -39,12 +44,20 @@
     (reset! *page1 p1)
     (reset! *page2 p2)
     (binding [custom-report/*pw-contexts* (set [(.context @p1) (.context @p2)])
+              custom-report/*pw-page->console-logs* (atom {})
               w/*page* (delay (throw (ex-info "Don't use *page*, use *page1* and *page2* instead" {})))]
       (run!
        #(w/with-page %
           (w/navigate (str "http://localhost:" port'))
           (settings/developer-mode)
-          (w/refresh))
+          (w/refresh)
+          (assert/assert-graph-loaded?)
+          (let [p (w/get-page)]
+            (.onConsoleMessage
+             p
+             (fn [msg]
+               (when custom-report/*pw-page->console-logs*
+                 (swap! custom-report/*pw-page->console-logs* update p conj (.text msg)))))))
        [p1 p2])
       (f))
 

+ 3 - 2
deps/db/src/logseq/db/frontend/validate.cljs

@@ -2,6 +2,7 @@
   "Validate frontend db for DB graphs"
   (:require [clojure.pprint :as pprint]
             [datascript.core :as d]
+            [lambdaisland.glogi :as log]
             [logseq.db.frontend.malli-schema :as db-malli-schema]
             [logseq.db.frontend.property :as db-property]
             [malli.core :as m]
@@ -38,10 +39,10 @@
                               ;; remove :db/id as it adds needless declarations to schema
                               #(validator [(dissoc % :db/id)])
                               ent-maps)]
-        (js/console.log "changed eids:" changed-ids tx-meta)
+        (log/info "changed eids:" changed-ids :tx-meta tx-meta)
         (if (seq invalid-ent-maps)
           (let [explainer (get-schema-explainer (:closed-schema? validate-options))]
-            (js/console.error "Invalid datascript entities detected amongst changed entity ids:" changed-ids)
+            (log/error "Invalid datascript entities detected amongst changed entity ids:" changed-ids)
             (doseq [m invalid-ent-maps]
               (let [m' (update m :block/properties (fn [properties]
                                                      (map (fn [[p v]]

+ 2 - 1
shadow-cljs.edn

@@ -47,7 +47,8 @@
                                       :redef false}
                            :cross-chunk-method-motion false}
         :build-hooks [(shadow.hooks/git-revision-hook "--long --always --dirty")]
-        :closure-defines {goog.debug.LOGGING_ENABLED true
+        :closure-defines {lambdaisland.glogi.console/colorize "false"
+                          goog.debug.LOGGING_ENABLED true
                           frontend.modules.instrumentation.sentry/SENTRY-DSN #shadow/env "LOGSEQ_SENTRY_DSN"
                           frontend.modules.instrumentation.posthog/POSTHOG-TOKEN #shadow/env "LOGSEQ_POSTHOG_TOKEN"
                           frontend.config/ENABLE-PLUGINS #shadow/env ["ENABLE_PLUGINS" :as :bool :default true]