Files
logseq/src/test/frontend/db/reference_test.cljs
Gabriel Horner e01664bac4 chore: convert more frontend tests to db graph
Removed file graph specific tests in outliner.core-test and export-test.
Also fixed test for export-test as file graph exports didn't
reference pages in blocks
2026-01-22 13:19:57 -05:00

186 lines
8.7 KiB
Clojure

(ns frontend.db.reference-test
(:require [cljs.test :refer [deftest is testing]]
[datascript.core :as d]
[logseq.db :as ldb]
[logseq.db.common.reference :as db-reference]
[shadow.resource :as rc]))
(def test-transit (rc/inline "fixtures/references.transit"))
;; (use-fixtures :each test-helper/db-based-start-and-destroy-db)
(defn- create-conn!
[]
(let [db (ldb/read-transit-str test-transit)]
(d/conn-from-db db)))
;; FIXME: EDN import doesn't work
(comment
(def test-page-blocks
{:pages-and-blocks
[{:page
{:build/journal 20250611},
:blocks
[{:block/title "[[68485f78-1e70-4173-a569-1ebcb2ba69e6]] 1",
:build/children
[{:block/title "[[68485f7a-d9c1-495a-a364-e7aae6ab0147]] 1",
:build/children
[{:block/title "test",
:build/children
[{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 1"}]}
{:block/title "another test",
:build/children
[{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 2"}]}]}
{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 3"}]}
{:block/title "[[68485f78-1e70-4173-a569-1ebcb2ba69e6]] 2",
:build/children
[{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 4",
:build/children
[{:block/title "[[68485f7a-d9c1-495a-a364-e7aae6ab0147]] 1"}]}]}]}
{:page
{:block/title "bar",
:block/uuid #uuid "68485f7a-d9c1-495a-a364-e7aae6ab0147",
:build/keep-uuid? true}}
{:page
{:block/title "baz",
:block/uuid #uuid "68485f7f-3de9-46d3-a1e5-50a7d052066e",
:build/keep-uuid? true}}
{:page
{:block/title "foo",
:block/uuid #uuid "68485f78-1e70-4173-a569-1ebcb2ba69e6",
:build/keep-uuid? true}}],
:logseq.db.sqlite.export/export-type :page}))
(comment
(defn- import-edn!
[conn data]
(let [{:keys [init-tx block-props-tx misc-tx error] :as _txs} (sqlite-export/build-import data @conn {})]
(when error
(throw (ex-info "Build import failed" {:data test-page-blocks})))
(d/transact! conn init-tx)
(when (seq block-props-tx)
(d/transact! conn block-props-tx))
(when (seq misc-tx)
(d/transact! conn misc-tx)))))
(defn- retract-filters!
[conn foo-id]
(d/transact! conn [[:db/retract foo-id :logseq.property.linked-references/includes]
[:db/retract foo-id :logseq.property.linked-references/excludes]]))
(deftest ^:large-vars/cleanup-todo get-linked-references
(let [conn (create-conn!)
foo-id (:db/id (ldb/get-page @conn "foo"))
_ (retract-filters! conn foo-id)
db @conn
[foo bar baz] (map #(ldb/get-page @conn %) ["foo" "bar" "baz"])]
(testing "Linked references without filters"
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references db (:db/id foo))]
(is (= (set [["baz" 4] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
(set ref-pages-count))
"ref-pages-count check failed")
(is (empty? ref-matched-children-ids)
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references include \"bar\""
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/includes (:db/id bar)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
(set ref-pages-count))
"ref-pages-count check failed")
(is (= 7 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references include \"bar\" and \"baz\""
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/includes (:db/id baz)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
(set ref-pages-count))
"ref-pages-count check failed")
(is (= 7 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references exclude \"bar\""
(retract-filters! conn foo-id)
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/excludes (:db/id bar)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
"ref-pages-count check failed")
(is (= 2 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references exclude \"baz\""
(retract-filters! conn foo-id)
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/excludes (:db/id baz)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 1]]) (set ref-pages-count))
"ref-pages-count check failed")
(is (= 3 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references exclude both \"baz\" and \"bar\""
(retract-filters! conn foo-id)
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/excludes #{(:db/id baz) (:db/id bar)}}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["Journal" 2] ["Jun 11th, 2025" 2]]) (set ref-pages-count))
"ref-pages-count check failed")
(is (zero? (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references includes \"bar\" and excludes \"baz\""
(retract-filters! conn foo-id)
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/includes (:db/id bar)
:logseq.property.linked-references/excludes (:db/id baz)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["Journal" 1] ["Jun 11th, 2025" 1] ["bar" 1]]) (set ref-pages-count))
"ref-pages-count check failed")
(is (= 3 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))
(testing "Linked references includes \"baz\" and excludes \"bar\""
(retract-filters! conn foo-id)
(d/transact! conn
[{:db/id (:db/id foo)
:logseq.property.linked-references/includes (:db/id baz)
:logseq.property.linked-references/excludes (:db/id bar)}])
(let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
(is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
"ref-pages-count check failed")
(is (= 2 (count ref-matched-children-ids))
"ref-matched-children-ids check failed")
(is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
"ref-blocks check failed")))))
(deftest get-unlinked-references
(let [conn (create-conn!)
db @conn
ids (map #(:db/id (ldb/get-page @conn %)) ["foo" "bar" "baz"])]
(is (= [3 2 3]
(mapv #(count (db-reference/get-unlinked-references db %)) ids)))))