From ca7647f8082b50998addddc3e70abd6e250ba7f9 Mon Sep 17 00:00:00 2001 From: rcmerci Date: Wed, 29 Apr 2026 14:40:18 +0800 Subject: [PATCH] enhance(cli): update db-worker-node options --- src/main/frontend/worker/db_worker_node.cljs | 191 +++++++++++------- src/main/logseq/cli/config.cljs | 5 +- src/main/logseq/cli/server.cljs | 10 +- src/main/logseq/db_worker/daemon.cljs | 3 +- src/main/logseq/db_worker/server_list.cljs | 36 ++-- src/test/electron/db_worker_manager_test.cljs | 20 ++ .../frontend/worker/db_worker_node_test.cljs | 174 ++++++++++++---- src/test/logseq/cli/server_test.cljs | 25 ++- src/test/logseq/db_worker/daemon_test.cljs | 6 +- .../logseq/db_worker/server_list_test.cljs | 12 ++ 10 files changed, 338 insertions(+), 144 deletions(-) create mode 100644 src/test/logseq/db_worker/server_list_test.cljs diff --git a/src/main/frontend/worker/db_worker_node.cljs b/src/main/frontend/worker/db_worker_node.cljs index f12fe2c5d7..99f6db96ae 100644 --- a/src/main/frontend/worker/db_worker_node.cljs +++ b/src/main/frontend/worker/db_worker_node.cljs @@ -22,6 +22,10 @@ (defonce ^:private *file-handler (atom nil)) (defonce ^:private *server-list-file (atom nil)) +(defn- server-list-file-path + [root-dir] + (server-list/path root-dir)) + (defn- send-json! [^js res status payload] (.writeHead res status #js {"Content-Type" "application/json"}) @@ -54,7 +58,6 @@ "--root-dir" (recur (subvec args 2) (assoc opts :root-dir (second args))) "--repo" (recur (subvec args 2) (assoc opts :repo (second args))) "--owner-source" (recur (subvec args 2) (assoc opts :owner-source (second args))) - "--server-list-file" (recur (subvec args 2) (assoc opts :server-list-file (second args))) "--log-level" (recur (subvec args 2) (assoc opts :log-level (second args))) "--create-empty-db" (recur (subvec args 1) (assoc opts :create-empty-db? true)) "--version" (recur (subvec args 1) (assoc opts :version? true)) @@ -354,7 +357,7 @@ (defn- show-help! [] (println (str (style/bold "db-worker-node") " " (style/bold "options") ":")) - (println (str " " (style/bold "--root-dir") " (default ~/logseq)")) + (println (str " " (style/bold "--root-dir") " (required)")) (println (str " " (style/bold "--repo") " (required)")) (println (str " " (style/bold "--create-empty-db") " (start with empty initial datoms)")) (println (str " " (style/bold "--log-level") " (default info)")) @@ -453,15 +456,115 @@ (swap! *lock-info assoc :lock updated-lock) nil)) +(defn- close-server! + [server] + (p/create + (fn [resolve _] + (try + (.close server (fn [] (resolve true))) + (catch :default _ + (resolve true)))))) + +(defn- clear-runtime-state! + [actual-port] + (reset! *ready? false) + (when-let [file-path @*server-list-file] + (server-list/remove-entry! file-path {:pid (.-pid js/process) + :port actual-port})) + (doseq [^js res @*sse-clients] + (try + (.end res) + (catch :default _))) + (reset! *sse-clients #{}) + (when-let [lock-path (:path @*lock-info)] + (db-lock/remove-lock! lock-path))) + +(defn- make-stop! + [{:keys [proxy repo actual-port server stopped? on-stopped!]}] + (fn [] + (if @stopped? + (p/resolved true) + (do + (reset! stopped? true) + (-> (p/let [_ ( (p/let [_ ( (p/let [{:keys [stop!] :as daemon} (start-daemon! {:root-dir root-dir :repo repo :create-empty-db? (:create-empty-db? opts) :owner-source owner-source - :server-list-file server-list-file :on-stopped! (fn [] (log/info :db-worker-node-stopped nil) (.exit js/process 0)) @@ -583,7 +634,7 @@ code (:code data) message (or (.-message error) (str error))] (cond - (= :root-dir-permission code) + (#{:missing-root-dir :root-dir-permission} code) (.error js/console message) (or (string/includes? message ".node") diff --git a/src/main/logseq/cli/config.cljs b/src/main/logseq/cli/config.cljs index 7b73207ac4..53c870f2bf 100644 --- a/src/main/logseq/cli/config.cljs +++ b/src/main/logseq/cli/config.cljs @@ -6,7 +6,8 @@ ["fs" :as fs] ["path" :as node-path] [logseq.cli.output-mode :as output-mode] - [logseq.cli.root-dir :as root-dir])) + [logseq.cli.root-dir :as root-dir] + [logseq.db-worker.server-list :as server-list])) (defn- parse-int [value] @@ -38,7 +39,7 @@ (defn server-list-path [root-dir] - (node-path/join (or root-dir (root-dir/default-root-dir)) "server-list")) + (server-list/path (or root-dir (root-dir/default-root-dir)))) (def ^:private removed-config-keys #{:auth-token :retries :e2ee-password}) diff --git a/src/main/logseq/cli/server.cljs b/src/main/logseq/cli/server.cljs index 3ff5a7d47e..861723b427 100644 --- a/src/main/logseq/cli/server.cljs +++ b/src/main/logseq/cli/server.cljs @@ -5,7 +5,6 @@ [clojure.string :as string] [frontend.worker.db-worker-node-lock :as db-lock] [lambdaisland.glogi :as log] - [logseq.cli.config :as cli-config] [logseq.cli.profile :as profile] [logseq.cli.root-dir :as root-dir] [logseq.common.config :as common-config] @@ -55,7 +54,7 @@ (defn- server-list-path [config] - (cli-config/server-list-path (resolve-root-dir config))) + (server-list/path (resolve-root-dir config))) (defn db-worker-dev-script-path [] @@ -145,12 +144,11 @@ (assoc payload :http-status status))) (defn- spawn-server! - [{:keys [repo root-dir owner-source create-empty-db? server-list-file]}] + [{:keys [repo root-dir owner-source create-empty-db?]}] (daemon/spawn-server! {:script (db-worker-script-path) :repo repo :root-dir root-dir :owner-source owner-source - :server-list-file server-list-file :create-empty-db? create-empty-db?})) (defn- rewrite-lock-owner-source! @@ -232,8 +230,7 @@ (let [root-dir (resolve-root-dir config) path (lock-path root-dir repo) requester-owner (requester-owner-source config) - profile-session (:profile-session config) - server-list-file (server-list-path config)] + profile-session (:profile-session config)] (profile/time! profile-session "server.ensure-started" (fn [] (ensure-repo-dir! root-dir repo) @@ -248,7 +245,6 @@ (spawn-server! {:repo repo :root-dir root-dir :owner-source requester-owner - :server-list-file server-list-file :create-empty-db? (:create-empty-db? config)}))) (-> (profile/time! profile-session "server.wait-lock" diff --git a/src/main/logseq/db_worker/daemon.cljs b/src/main/logseq/db_worker/daemon.cljs index b9a3223d5f..1c56785e63 100644 --- a/src/main/logseq/db_worker/daemon.cljs +++ b/src/main/logseq/db_worker/daemon.cljs @@ -221,11 +221,10 @@ :interval-ms 50})) (defn spawn-server! - [{:keys [script repo root-dir owner-source create-empty-db? server-list-file]}] + [{:keys [script repo root-dir owner-source create-empty-db?]}] (let [owner-source (normalize-owner-source owner-source) detached? (not= owner-source :electron) args (clj->js (cond-> [script "--repo" repo "--root-dir" root-dir "--owner-source" (name owner-source)] - server-list-file (conj "--server-list-file" server-list-file) create-empty-db? (conj "--create-empty-db"))) env (js/Object.assign #js {} (.-env js/process) #js {:ELECTRON_RUN_AS_NODE "1"})] (if-not script diff --git a/src/main/logseq/db_worker/server_list.cljs b/src/main/logseq/db_worker/server_list.cljs index 6882c27b5b..c4cbd0bb18 100644 --- a/src/main/logseq/db_worker/server_list.cljs +++ b/src/main/logseq/db_worker/server_list.cljs @@ -4,6 +4,12 @@ ["fs" :as fs] ["path" :as node-path])) +(defn path + [root-dir-path] + (when-not (seq root-dir-path) + (throw (js/Error. "root-dir is required"))) + (node-path/join root-dir-path "server-list")) + (defn- parse-int [value] (when (re-matches #"\d+" value) @@ -21,39 +27,39 @@ :port port})))))) (defn read-entries - [path] - (if (and (seq path) (fs/existsSync path)) - (->> (.toString (fs/readFileSync path) "utf8") + [file-path] + (if (and (seq file-path) (fs/existsSync file-path)) + (->> (.toString (fs/readFileSync file-path) "utf8") string/split-lines (keep parse-line) vec) [])) (defn rewrite-entries! - [path entries] - (when (seq path) - (fs/mkdirSync (node-path/dirname path) #js {:recursive true}) + [file-path entries] + (when (seq file-path) + (fs/mkdirSync (node-path/dirname file-path) #js {:recursive true}) (let [payload (if (seq entries) (str (string/join "\n" (map (fn [{:keys [pid port]}] (str pid " " port)) entries)) "\n") "")] - (fs/writeFileSync path payload "utf8")))) + (fs/writeFileSync file-path payload "utf8")))) (defn append-entry! - [path {:keys [pid port] :as entry}] - (when (and (seq path) (pos-int? pid) (pos-int? port)) - (fs/mkdirSync (node-path/dirname path) #js {:recursive true}) - (fs/appendFileSync path (str pid " " port "\n") "utf8") + [file-path {:keys [pid port] :as entry}] + (when (and (seq file-path) (pos-int? pid) (pos-int? port)) + (fs/mkdirSync (node-path/dirname file-path) #js {:recursive true}) + (fs/appendFileSync file-path (str pid " " port "\n") "utf8") entry)) (defn remove-entry! - [path {:keys [pid port]}] - (when (seq path) - (let [entries (->> (read-entries path) + [file-path {:keys [pid port]}] + (when (seq file-path) + (let [entries (->> (read-entries file-path) (remove (fn [entry] (and (= pid (:pid entry)) (= port (:port entry))))) vec)] - (rewrite-entries! path entries)))) + (rewrite-entries! file-path entries)))) diff --git a/src/test/electron/db_worker_manager_test.cljs b/src/test/electron/db_worker_manager_test.cljs index 6193661019..5d4d37acad 100644 --- a/src/test/electron/db_worker_manager_test.cljs +++ b/src/test/electron/db_worker_manager_test.cljs @@ -1,6 +1,7 @@ (ns electron.db-worker-manager-test (:require [cljs.test :refer [async deftest is]] [electron.db-worker :as db-worker] + [logseq.cli.server :as cli-server] [promesa.core :as p])) (defn- runtime @@ -238,3 +239,22 @@ (p/catch (fn [e] (is false (str "unexpected error: " e)))) (p/finally (fn [] (done))))))) + +(deftest managed-daemon-start-uses-cli-shared-server-path-with-electron-owner + (async done + (let [captured (atom nil)] + (-> (p/with-redefs [cli-server/ensure-server! (fn [config repo] + (reset! captured {:config config + :repo repo}) + (p/resolved {:base-url "http://127.0.0.1:9300" + :owned? true}))] + ((get db-worker/manager :start-daemon!) "graph-a")) + (p/then (fn [runtime-info] + (is (= "graph-a" (:repo @captured))) + (is (= :electron (get-in @captured [:config :owner-source]))) + (is (nil? (get-in @captured [:config :server-list-file]))) + (is (= "http://127.0.0.1:9300" (:base-url runtime-info))) + (is (= true (:owned? runtime-info))))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally (fn [] (done))))))) diff --git a/src/test/frontend/worker/db_worker_node_test.cljs b/src/test/frontend/worker/db_worker_node_test.cljs index f7944115fd..621e7beed4 100644 --- a/src/test/frontend/worker/db_worker_node_test.cljs +++ b/src/test/frontend/worker/db_worker_node_test.cljs @@ -6,8 +6,8 @@ [clojure.string :as string] [frontend.test.node-helper :as node-helper] [frontend.worker.db-core :as db-core] - [frontend.worker.db-worker-node-lock :as db-lock] [frontend.worker.db-worker-node :as db-worker-node] + [frontend.worker.db-worker-node-lock :as db-lock] [frontend.worker.platform.node :as platform-node] [goog.object :as gobj] [logseq.cli.config :as cli-config] @@ -156,6 +156,36 @@ (reset-daemon-state!) (quiet-debug-output-after)) +(defn- run-main-with-overrides + [{:keys [argv on-exit on-log on-error start-daemon-fn]}] + (test-helper/with-js-property-override + js/process + "argv" + argv + (fn [] + (test-helper/with-js-property-override + js/process + "exit" + on-exit + (fn [] + (test-helper/with-js-property-override + js/console + "log" + on-log + (fn [] + (test-helper/with-js-property-override + js/console + "error" + on-error + (fn [] + (p/with-redefs [db-worker-node/start-daemon! start-daemon-fn] + (p/resolved + (try + (db-worker-node/main) + (catch :default e + (when-not (= "process-exit" (.-message e)) + (throw e))))))))))))))) + (use-fixtures :each {:before normalize-db-worker-state-before :after normalize-db-worker-state-after}) @@ -282,13 +312,15 @@ (is (= "logseq_db_parse_args" (:repo result))) (is (= true (:create-empty-db? result))))) -(deftest db-worker-node-parse-args-recognizes-server-list-file +(deftest db-worker-node-parse-args-ignores-server-list-file (let [parse-args #'db-worker-node/parse-args result (parse-args #js ["node" "dist/db-worker-node.js" "--repo" "logseq_db_parse_args" + "--root-dir" "/tmp/logseq-root" "--server-list-file" "/tmp/server-list"])] (is (= "logseq_db_parse_args" (:repo result))) - (is (= "/tmp/server-list" (:server-list-file result))))) + (is (= "/tmp/logseq-root" (:root-dir result))) + (is (nil? (:server-list-file result))))) (deftest db-worker-node-parse-args-recognizes-version (let [parse-args #'db-worker-node/parse-args @@ -299,36 +331,92 @@ (deftest db-worker-node-main-version-exits-early-without-repo (async done - (let [exit-code* (atom nil) - start-called? (atom false)] - (-> (test-helper/with-js-property-override - js/process - "argv" - #js ["node" "dist/db-worker-node.js" "--version"] - (fn [] - (test-helper/with-js-property-override - js/process - "exit" - (fn [code] - (reset! exit-code* code) - (throw (ex-info "process-exit" {:code code}))) - (fn [] - (p/with-redefs [db-worker-node/start-daemon! (fn [_] - (reset! start-called? true) - (p/rejected (ex-info "should-not-start-daemon" {})))] - (p/resolved - (let [output (with-out-str - (try - (db-worker-node/main) - (catch :default e - (when-not (= "process-exit" (.-message e)) - (throw e)))))] - (is (= 0 @exit-code*)) - (is (= false @start-called?)) - (is (string/includes? output "Revision:"))))))))) - (p/catch (fn [e] - (is false (str "unexpected error: " e)))) - (p/finally done))))) + (let [exit-code* (atom nil) + start-called? (atom false)] + (-> (test-helper/with-js-property-override + js/process + "argv" + #js ["node" "dist/db-worker-node.js" "--version"] + (fn [] + (test-helper/with-js-property-override + js/process + "exit" + (fn [code] + (reset! exit-code* code) + (throw (ex-info "process-exit" {:code code}))) + (fn [] + (p/with-redefs [db-worker-node/start-daemon! (fn [_] + (reset! start-called? true) + (p/rejected (ex-info "should-not-start-daemon" {})))] + (p/resolved + (let [output (with-out-str + (try + (db-worker-node/main) + (catch :default e + (when-not (= "process-exit" (.-message e)) + (throw e)))))] + (is (= 0 @exit-code*)) + (is (= false @start-called?)) + (is (string/includes? output "Revision:"))))))))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally done))))) + +(deftest db-worker-node-main-missing-root-dir-prints-error-and-exits-1 + (async done + (let [exit-code* (atom nil) + stdout* (atom []) + stderr* (atom []) + start-called? (atom false)] + (-> (run-main-with-overrides + {:argv #js ["node" "dist/db-worker-node.js" "--repo" "logseq_db_missing_root"] + :on-exit (fn [code] + (reset! exit-code* code) + (throw (ex-info "process-exit" {:code code}))) + :on-log (fn [& args] + (swap! stdout* conj (string/join " " args))) + :on-error (fn [& args] + (swap! stderr* conj (string/join " " args))) + :start-daemon-fn (fn [_] + (reset! start-called? true) + (p/rejected (ex-info "should-not-start-daemon" {})))}) + (p/then (fn [_] + (is (= 1 @exit-code*)) + (is (= false @start-called?)) + (is (empty? @stdout*)) + (is (some #(string/includes? % "root-dir is required") + @stderr*)))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally done))))) + +(deftest db-worker-node-main-missing-repo-prints-error-and-exits-1 + (async done + (let [exit-code* (atom nil) + stdout* (atom []) + stderr* (atom []) + start-called? (atom false)] + (-> (run-main-with-overrides + {:argv #js ["node" "dist/db-worker-node.js" "--root-dir" "/tmp/logseq-root"] + :on-exit (fn [code] + (reset! exit-code* code) + (throw (ex-info "process-exit" {:code code}))) + :on-log (fn [& args] + (swap! stdout* conj (string/join " " args))) + :on-error (fn [& args] + (swap! stderr* conj (string/join " " args))) + :start-daemon-fn (fn [_] + (reset! start-called? true) + (p/rejected (ex-info "should-not-start-daemon" {})))}) + (p/then (fn [_] + (is (= 1 @exit-code*)) + (is (= false @start-called?)) + (is (empty? @stdout*)) + (is (some #(string/includes? % "repo is required") + @stderr*)))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally done))))) (deftest db-worker-node-owner-source-cli-is-written-into-lock (async done @@ -406,18 +494,21 @@ (is (= {:request-id "r1"} (ldb/read-transit-str (:payload parsed))))))) -(deftest db-worker-node-help-omits-auth-token +(deftest db-worker-node-help-documents-required-root-dir-and-omits-server-list-file (let [show-help! #'db-worker-node/show-help! output (binding [style/*color-enabled?* true] (with-out-str (show-help!))) plain-output (style/strip-ansi output)] (is (not (string/includes? (style/strip-ansi output) "--auth-token"))) (is (not (string/includes? plain-output "--rtc-ws-url"))) - (is (string/includes? plain-output "(default ~/logseq)")) + (is (not (string/includes? plain-output "--server-list-file"))) + (is (not (string/includes? plain-output "(default ~/logseq)"))) (is (re-find #"\u001b\[[0-9;]*moptions\u001b\[[0-9;]*m:" output)) (is (contains-bold? output "db-worker-node")) (is (contains-bold? output "--root-dir")) (is (contains-bold? output "--repo")) + (is (string/includes? plain-output "--root-dir")) + (is (string/includes? plain-output "(required)")) (is (string/includes? plain-output "--create-empty-db")) (is (contains-bold? output "--create-empty-db")) (is (not (contains-bold? output "--rtc-ws-url"))) @@ -537,12 +628,12 @@ (is false (str "unexpected error: " e)))) (p/finally done))))) -(deftest db-worker-node-start-daemon-registers-and-unregisters-server-list-entry +(deftest db-worker-node-start-daemon-registers-and-unregisters-derived-server-list-entry (async done (let [data-dir (node-helper/create-tmp-dir "db-worker-server-list") repo (str "logseq_db_server_list_" (subs (str (random-uuid)) 0 8)) lock-file-path (lock-path data-dir repo) - server-list-file (node-path/join data-dir "server-list")] + server-list-file (cli-config/server-list-path data-dir)] (-> (p/with-redefs [platform-node/node-platform (fn [_opts] #js {}) db-core/init-core! (fn [_platform] #js {:remoteInvoke (fn [_method _direct-pass? _args] @@ -556,7 +647,6 @@ db-lock/update-lock! (fn [_path lock] lock)] (p/let [{:keys [port stop!]} (db-worker-node/start-daemon! {:root-dir data-dir :repo repo - :server-list-file server-list-file :log-level "error"}) contents-after-start (.toString (fs/readFileSync server-list-file) "utf8") _ (is (string/includes? contents-after-start (str (.-pid js/process) " " port))) @@ -709,14 +799,13 @@ (let [daemon (atom nil) data-dir (node-helper/create-tmp-dir "db-worker-daemon") repo (str "logseq_db_smoke_" (subs (str (random-uuid)) 0 8)) - server-list-file (node-path/join data-dir "server-list") + server-list-file (cli-config/server-list-path data-dir) now (js/Date.now) page-uuid (random-uuid) block-uuid (random-uuid)] (-> (p/let [{:keys [host port stop!]} (start-daemon! {:root-dir data-dir - :repo repo - :server-list-file server-list-file}) + :repo repo}) health (http-get host port "/healthz") missing-readyz (http-get host port "/readyz") health-body (js->clj (js/JSON.parse (:body health)) :keywordize-keys true) @@ -1163,8 +1252,7 @@ page-uuid (random-uuid)] (-> (p/let [{:keys [host port stop!]} (start-daemon! {:root-dir data-dir - :repo repo - :server-list-file server-list-file}) + :repo repo}) _ (reset! daemon {:stop! stop!}) _ (invoke host port "thread-api/create-or-open-db" [repo {}]) _ (invoke host port "thread-api/transact" diff --git a/src/test/logseq/cli/server_test.cljs b/src/test/logseq/cli/server_test.cljs index 8de18f9378..47f430ba00 100644 --- a/src/test/logseq/cli/server_test.cljs +++ b/src/test/logseq/cli/server_test.cljs @@ -60,6 +60,28 @@ (is (= (cli-server/db-worker-script-path) (cli-server/db-worker-runtime-script-path)))) +(deftest cli-server-spawn-server-does-not-forward-server-list-file + (async done + (let [spawn-server! #'cli-server/spawn-server! + captured (atom nil)] + (-> (p/with-redefs [daemon/spawn-server! (fn [opts] + (reset! captured opts) + nil)] + (p/resolved + (spawn-server! {:repo "logseq_db_spawn_test" + :root-dir "/tmp/logseq-root" + :owner-source :cli + :server-list-file "/tmp/server-list" + :create-empty-db? true}))) + (p/then (fn [_] + (is (= "logseq_db_spawn_test" (:repo @captured))) + (is (= "/tmp/logseq-root" (:root-dir @captured))) + (is (= true (:create-empty-db? @captured))) + (is (nil? (:server-list-file @captured))))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally done))))) + (deftest ensure-server-repairs-stale-lock (async done (let [root-dir (node-helper/create-tmp-dir "cli-server") @@ -290,8 +312,7 @@ (is (= (cli-server/resolve-root-dir {:root-dir root-dir}) (:root-dir @captured))) (is (= true (:create-empty-db? @captured))) - (is (= (cli-config/server-list-path root-dir) - (:server-list-file @captured))))) + (is (nil? (:server-list-file @captured))))) (p/catch (fn [e] (is false (str "unexpected error: " e)))) (p/finally done))))) diff --git a/src/test/logseq/db_worker/daemon_test.cljs b/src/test/logseq/db_worker/daemon_test.cljs index aef48fa3b4..0c256f741d 100644 --- a/src/test/logseq/db_worker/daemon_test.cljs +++ b/src/test/logseq/db_worker/daemon_test.cljs @@ -13,7 +13,7 @@ (when-let [v (get (ns-interns 'logseq.db-worker.daemon) sym)] (apply @v args))) -(deftest spawn-server-uses-detached-process-and-no-host-port-args +(deftest spawn-server-ignores-server-list-file-and-uses-detached-process (let [captured (atom nil) unref-called? (atom false) original-spawn (.-spawn child-process)] @@ -32,8 +32,8 @@ (is (= "/tmp/db-worker-node.js" (first (:args @captured)))) (is (some #{"--repo"} (:args @captured))) (is (some #{"--root-dir"} (:args @captured))) - (is (some #{"--server-list-file"} (:args @captured))) - (is (some #{"/tmp/server-list"} (:args @captured))) + (is (not-any? #{"--server-list-file"} (:args @captured))) + (is (not-any? #{"/tmp/server-list"} (:args @captured))) (is (not-any? #{"--host" "--port"} (:args @captured))) (is (= true (get-in @captured [:opts :detached]))) (is (= "1" (get-in @captured [:opts :env :ELECTRON_RUN_AS_NODE]))) diff --git a/src/test/logseq/db_worker/server_list_test.cljs b/src/test/logseq/db_worker/server_list_test.cljs new file mode 100644 index 0000000000..2f79364c82 --- /dev/null +++ b/src/test/logseq/db_worker/server_list_test.cljs @@ -0,0 +1,12 @@ +(ns logseq.db-worker.server-list-test + (:require [cljs.test :refer [deftest is]] + [logseq.db-worker.server-list :as server-list])) + +(deftest path-derives-server-list-from-root-dir + (is (= "/tmp/logseq-root/server-list" + (server-list/path "/tmp/logseq-root")))) + +(deftest path-rejects-missing-root-dir + (is (thrown-with-msg? js/Error + #"root-dir is required" + (server-list/path nil))))