diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 27e8607ae1..98f2bc7225 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -212,7 +212,6 @@ frontend.namespaces/import-vars potemkin/import-vars ;; src/test frontend.test.helper/deftest-async clojure.test/deftest - frontend.test.helper/with-reset cljs.test/async frontend.worker.rtc.idb-keyval-mock/with-reset-idb-keyval-mock cljs.test/async frontend.react/defc clojure.core/defn frontend.common.schema-register/defkeyword cljs.spec.alpha/def} diff --git a/src/test/frontend/handler/editor_async_test.cljs b/src/test/frontend/handler/editor_async_test.cljs index cf1803d2b3..953760081d 100644 --- a/src/test/frontend/handler/editor_async_test.cljs +++ b/src/test/frontend/handler/editor_async_test.cljs @@ -22,8 +22,7 @@ (let [sibling-block (ldb/get-left-sibling (d/entity db (:db/id block))) first-block (ldb/get-left-sibling sibling-block) block-dom-id "ls-block-block-to-delete"] - (test-helper/with-reset - reset + (p/with-redefs [editor/get-state (constantly {:block-id (:block/uuid block) :block-parent-id block-dom-id :config {:embed? embed?}}) @@ -48,8 +47,7 @@ (p/do! (editor/delete-block! test-helper/test-db) (when (fn? on-delete) - (on-delete)) - (reset))))) + (on-delete)))))) (deftest-async delete-block-async! (testing "backspace deletes empty block" diff --git a/src/test/frontend/handler/paste_test.cljs b/src/test/frontend/handler/paste_test.cljs index 73695c3de9..8f3360139c 100644 --- a/src/test/frontend/handler/paste_test.cljs +++ b/src/test/frontend/handler/paste_test.cljs @@ -82,35 +82,30 @@ (testing "Raw paste for link should just paste link" (let [clipboard "https://www.youtube.com/watch?v=xu9p5ynlhZk" expected-paste "https://www.youtube.com/watch?v=xu9p5ynlhZk"] - (test-helper/with-reset - reset + (p/with-redefs [utils/getClipText (fn [cb] (cb clipboard)) state/get-input (constantly #js {:value "block"}) commands/delete-selection! (constantly nil) editor-handler/insert (fn [text _] (p/resolved text))] (p/let [result (paste-handler/editor-on-paste-raw!)] - (is (= expected-paste result)) - (reset)))))) + (is (= expected-paste result))))))) (deftest-async editor-on-paste-raw-with-multi-line (let [clipboard "a\n\na" expected-paste "a\n\na"] - (test-helper/with-reset - reset + (p/with-redefs [utils/getClipText (fn [cb] (cb clipboard)) state/get-input (constantly #js {:value "block"}) commands/delete-selection! (constantly nil) editor-handler/insert (fn [text _] (p/resolved text))] (p/let [result (paste-handler/editor-on-paste-raw!)] - (is (= expected-paste result)) - (reset))))) + (is (= expected-paste result)))))) (deftest-async editor-on-paste-with-link (testing "Formatted paste for special link should paste macro wrapped link" (let [clipboard "https://www.youtube.com/watch?v=xu9p5ynlhZk" expected-paste "{{video https://www.youtube.com/watch?v=xu9p5ynlhZk}}"] - (test-helper/with-reset - reset + (p/with-redefs [;; paste-copied-blocks-or-text mocks below commands/delete-selection! (constantly nil) commands/simple-insert! (fn [_input text] (p/resolved text)) @@ -119,15 +114,13 @@ html-parser/convert (constantly nil)] (p/let [result ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste result)) - (reset)))))) + (is (= expected-paste result))))))) (deftest-async editor-on-paste-with-twitter-is-now-x-lol (testing "Formatted paste for the site formerly known as twitter link should paste macro wrapped as twitter" (let [clipboard "https://x.com/chiefnoah13/status/1792677792506843462" expected-paste "{{twitter https://x.com/chiefnoah13/status/1792677792506843462}}"] - (test-helper/with-reset - reset + (p/with-redefs [commands/delete-selection! (constantly nil) commands/simple-insert! (fn [_input text] (p/resolved text)) util/stop (constantly nil) @@ -135,8 +128,7 @@ html-parser/convert (constantly nil)] (p/let [result ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste result)) - (reset)))))) + (is (= expected-paste result))))))) (deftest-async editor-on-paste-with-text-over-link (testing "Paste text over a selected formatted link" @@ -145,8 +137,7 @@ selected-text "https://logseq.com" block-content (str selected-text " is awesome") expected-paste "[logseq](https://logseq.com) is awesome"] - (test-helper/with-reset - reset + (p/with-redefs [;; paste-copied-blocks-or-text mocks below util/stop (constantly nil) util/get-selected-text (constantly selected-text) @@ -157,8 +148,7 @@ cursor/move-cursor-to (constantly nil)] (p/let [_ ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste @actual-text)) - (reset)))))) + (is (= expected-paste @actual-text))))))) (deftest-async editor-on-paste-with-selected-text-and-special-link (testing "Formatted paste with special link on selected text pastes a formatted link" @@ -167,8 +157,7 @@ selected-text "great song" block-content (str selected-text " - Obaluaê!") expected-paste "[great song](https://www.youtube.com/watch?v=xu9p5ynlhZk) - Obaluaê!"] - (test-helper/with-reset - reset + (p/with-redefs [;; paste-copied-blocks-or-text mocks below util/stop (constantly nil) util/get-selected-text (constantly selected-text) @@ -179,14 +168,12 @@ cursor/move-cursor-to (constantly nil)] (p/let [_ ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste @actual-text)) - (reset)))))) + (is (= expected-paste @actual-text))))))) (deftest-async editor-on-paste-with-block-ref-in-between-parens (let [clipboard "((647f90f4-d733-4ee2-bbf5-907e820a23d3))" expected-paste "647f90f4-d733-4ee2-bbf5-907e820a23d3"] - (test-helper/with-reset - reset + (p/with-redefs [;; paste-copied-blocks-or-text mocks below util/stop (constantly nil) state/get-input (constantly #js {:value "(())"}) @@ -194,8 +181,7 @@ commands/simple-insert! (fn [_input text] (p/resolved text))] (p/let [result ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste result)) - (reset))))) + (is (= expected-paste result)))))) (deftest-async editor-on-paste-with-copied-blocks (let [actual-blocks (atom nil) @@ -203,8 +189,7 @@ expected-blocks [{:block/title "Test node"} {:block/title "Notes\nid:: 6422ec75-85c7-4e09-9a4d-2a1639a69b2f"}] clipboard "- Test node\n\t- Notes\nid:: 6422ec75-85c7-4e09-9a4d-2a1639a69b2f"] - (test-helper/with-reset - reset + (p/with-redefs [;; paste-copied-blocks-or-text mocks below util/stop (constantly nil) state/get-current-repo (constantly "test") @@ -213,15 +198,13 @@ editor-handler/paste-blocks (fn [blocks _] (reset! actual-blocks blocks))] (p/let [_ ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-blocks @actual-blocks)) - (reset))))) + (is (= expected-blocks @actual-blocks)))))) (deftest-async editor-on-paste-with-selection-in-property (let [clipboard "after" expected-paste "after" block-content "test:: before"] - (test-helper/with-reset - reset + (p/with-redefs [state/get-input (constantly #js {:value block-content}) ;; paste-copied-blocks-or-text mocks below commands/delete-selection! (constantly nil) @@ -230,15 +213,13 @@ html-parser/convert (constantly nil)] (p/let [result ((paste-handler/editor-on-paste! nil) #js {:clipboardData #js {:getData (constantly clipboard)}})] - (is (= expected-paste result)) - (reset))))) + (is (= expected-paste result)))))) (deftest-async editor-on-paste-with-file-pasting (let [clipboard "" files [{:name "image.png" :type "image/png" :size 11836}] pasted-file (atom nil)] - (test-helper/with-reset - reset + (p/with-redefs [state/preferred-pasting-file? (constantly true) ;; paste-file-if-exists mocks below editor-handler/upload-asset! (fn [_id file & _] @@ -246,7 +227,6 @@ util/stop (constantly nil) state/get-edit-block (constantly {})] (p/let [_ ((paste-handler/editor-on-paste! :fake-id) - #js {:clipboardData #js {:getData (constantly clipboard) - :files files}})] - (is (= files (js->clj @pasted-file))) - (reset))))) + #js {:clipboardData #js {:getData (constantly clipboard) + :files files}})] + (is (= files (js->clj @pasted-file))))))) diff --git a/src/test/frontend/handler/plugin_config_test.cljs b/src/test/frontend/handler/plugin_config_test.cljs index e22f3c96d4..b94bf9227c 100644 --- a/src/test/frontend/handler/plugin_config_test.cljs +++ b/src/test/frontend/handler/plugin_config_test.cljs @@ -67,16 +67,14 @@ error-message (atom nil)] (fs-node/writeFileSync (plugin-config-handler/plugin-config-path) "{:id {}") - (test-helper/with-reset reset + (p/with-redefs [notification/show! (fn [msg _] (reset! error-message msg))] (-> (p/do! (plugin-config-handler/open-replace-plugins-modal) (is (string/starts-with? @error-message "Malformed plugins.edn") "User sees correct notification")) - (p/finally #(do - (reset) - (delete-global-config-dir dir))))))) + (p/finally #(delete-global-config-dir dir)))))) (deftest-async open-replace-plugins-modal-invalid-edn (let [dir (create-global-config-dir) @@ -85,16 +83,14 @@ (fs-node/writeFileSync (plugin-config-handler/plugin-config-path) (pr-str {:id {:theme true :repo "user/repo"}})) - (test-helper/with-reset reset + (p/with-redefs [notification/show! (fn [msg _] (reset! error-message msg))] (-> (p/do! (plugin-config-handler/open-replace-plugins-modal) (is (string/starts-with? @error-message "Invalid plugins.edn") "User sees correct notification")) - (p/finally #(do - (reset) - (delete-global-config-dir dir))))))) + (p/finally #(delete-global-config-dir dir)))))) (defn- installed-plugins->edn-plugins "Converts installed plugins state to edn.plugins format" diff --git a/src/test/frontend/test/helper.clj b/src/test/frontend/test/helper.clj index 3b09e15b78..6c9dad3136 100644 --- a/src/test/frontend/test/helper.clj +++ b/src/test/frontend/test/helper.clj @@ -29,23 +29,4 @@ (fn [] ~@(when-let [post (:after opts)] [post]) - (~'done)))))))) - -;; Copied from https://clojurians.slack.com/archives/C03S1L9DN/p1631221014001900?thread_ts=1631219838.001500&cid=C03S1L9DN -(defmacro with-reset - "Like cljs.core/with-redefs, but bindings persist until the `reset` fn is - called, allowing bindings to be used in async contexts." - [reset bindings & body] - ;; code adapted from https://cljs.github.io/api/cljs.core/with-redefs - (let [names (take-nth 2 bindings) - vals (take-nth 2 (drop 1 bindings)) - orig-val-syms (map (comp gensym #(str % "-orig-val__") name) names) - temp-val-syms (map (comp gensym #(str % "-temp-val__") name) names) - binds (map vector names temp-val-syms) - redefs (reverse (map vector names orig-val-syms)) - bind-value (fn [[k v]] (list 'set! k v))] - `(let [~@(interleave orig-val-syms names) - ~@(interleave temp-val-syms vals) - ~reset #(do ~@(map bind-value redefs))] - ~@(map bind-value binds) - ~@body))) + (~'done)))))))) \ No newline at end of file