reference_test.cljs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. (ns frontend.db.reference-test
  2. (:require [cljs.test :refer [deftest is testing]]
  3. [datascript.core :as d]
  4. [logseq.db :as ldb]
  5. [logseq.db.common.reference :as db-reference]
  6. [shadow.resource :as rc]))
  7. (def test-transit (rc/inline "fixtures/references.transit"))
  8. ;; (use-fixtures :each test-helper/db-based-start-and-destroy-db)
  9. (defn- create-conn!
  10. []
  11. (let [db (ldb/read-transit-str test-transit)]
  12. (d/conn-from-db db)))
  13. ;; FIXME: EDN import doesn't work
  14. (comment
  15. (def test-page-blocks
  16. {:pages-and-blocks
  17. [{:page
  18. {:build/journal 20250611},
  19. :blocks
  20. [{:block/title "[[68485f78-1e70-4173-a569-1ebcb2ba69e6]] 1",
  21. :build/children
  22. [{:block/title "[[68485f7a-d9c1-495a-a364-e7aae6ab0147]] 1",
  23. :build/children
  24. [{:block/title "test",
  25. :build/children
  26. [{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 1"}]}
  27. {:block/title "another test",
  28. :build/children
  29. [{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 2"}]}]}
  30. {:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 3"}]}
  31. {:block/title "[[68485f78-1e70-4173-a569-1ebcb2ba69e6]] 2",
  32. :build/children
  33. [{:block/title "[[68485f7f-3de9-46d3-a1e5-50a7d052066e]] 4",
  34. :build/children
  35. [{:block/title "[[68485f7a-d9c1-495a-a364-e7aae6ab0147]] 1"}]}]}]}
  36. {:page
  37. {:block/title "bar",
  38. :block/uuid #uuid "68485f7a-d9c1-495a-a364-e7aae6ab0147",
  39. :build/keep-uuid? true}}
  40. {:page
  41. {:block/title "baz",
  42. :block/uuid #uuid "68485f7f-3de9-46d3-a1e5-50a7d052066e",
  43. :build/keep-uuid? true}}
  44. {:page
  45. {:block/title "foo",
  46. :block/uuid #uuid "68485f78-1e70-4173-a569-1ebcb2ba69e6",
  47. :build/keep-uuid? true}}],
  48. :logseq.db.sqlite.export/export-type :page}))
  49. (comment
  50. (defn- import-edn!
  51. [conn data]
  52. (let [{:keys [init-tx block-props-tx misc-tx error] :as _txs} (sqlite-export/build-import data @conn {})]
  53. (when error
  54. (throw (ex-info "Build import failed" {:data test-page-blocks})))
  55. (d/transact! conn init-tx)
  56. (when (seq block-props-tx)
  57. (d/transact! conn block-props-tx))
  58. (when (seq misc-tx)
  59. (d/transact! conn misc-tx)))))
  60. (defn- retract-filters!
  61. [conn foo-id]
  62. (d/transact! conn [[:db/retract foo-id :logseq.property.linked-references/includes]
  63. [:db/retract foo-id :logseq.property.linked-references/excludes]]))
  64. (deftest ^:large-vars/cleanup-todo get-linked-references
  65. (let [conn (create-conn!)
  66. foo-id (:db/id (ldb/get-page @conn "foo"))
  67. _ (retract-filters! conn foo-id)
  68. db @conn
  69. [foo bar baz] (map #(ldb/get-page @conn %) ["foo" "bar" "baz"])]
  70. (testing "Linked references without filters"
  71. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references db (:db/id foo))]
  72. (is (= (set [["baz" 4] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
  73. (set ref-pages-count))
  74. "ref-pages-count check failed")
  75. (is (empty? ref-matched-children-ids)
  76. "ref-matched-children-ids check failed")
  77. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  78. "ref-blocks check failed")))
  79. (testing "Linked references include \"bar\""
  80. (d/transact! conn
  81. [{:db/id (:db/id foo)
  82. :logseq.property.linked-references/includes (:db/id bar)}])
  83. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  84. (is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
  85. (set ref-pages-count))
  86. "ref-pages-count check failed")
  87. (is (= 7 (count ref-matched-children-ids))
  88. "ref-matched-children-ids check failed")
  89. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  90. "ref-blocks check failed")))
  91. (testing "Linked references include \"bar\" and \"baz\""
  92. (d/transact! conn
  93. [{:db/id (:db/id foo)
  94. :logseq.property.linked-references/includes (:db/id baz)}])
  95. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  96. (is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
  97. (set ref-pages-count))
  98. "ref-pages-count check failed")
  99. (is (= 7 (count ref-matched-children-ids))
  100. "ref-matched-children-ids check failed")
  101. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  102. "ref-blocks check failed")))
  103. (testing "Linked references exclude \"bar\""
  104. (retract-filters! conn foo-id)
  105. (d/transact! conn
  106. [{:db/id (:db/id foo)
  107. :logseq.property.linked-references/excludes (:db/id bar)}])
  108. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  109. (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
  110. "ref-pages-count check failed")
  111. (is (= 2 (count ref-matched-children-ids))
  112. "ref-matched-children-ids check failed")
  113. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  114. "ref-blocks check failed")))
  115. (testing "Linked references exclude \"baz\""
  116. (retract-filters! conn foo-id)
  117. (d/transact! conn
  118. [{:db/id (:db/id foo)
  119. :logseq.property.linked-references/excludes (:db/id baz)}])
  120. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  121. (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 1]]) (set ref-pages-count))
  122. "ref-pages-count check failed")
  123. (is (= 3 (count ref-matched-children-ids))
  124. "ref-matched-children-ids check failed")
  125. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  126. "ref-blocks check failed")))
  127. (testing "Linked references exclude both \"baz\" and \"bar\""
  128. (retract-filters! conn foo-id)
  129. (d/transact! conn
  130. [{:db/id (:db/id foo)
  131. :logseq.property.linked-references/excludes #{(:db/id baz) (:db/id bar)}}])
  132. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  133. (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2]]) (set ref-pages-count))
  134. "ref-pages-count check failed")
  135. (is (zero? (count ref-matched-children-ids))
  136. "ref-matched-children-ids check failed")
  137. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  138. "ref-blocks check failed")))
  139. (testing "Linked references includes \"bar\" and excludes \"baz\""
  140. (retract-filters! conn foo-id)
  141. (d/transact! conn
  142. [{:db/id (:db/id foo)
  143. :logseq.property.linked-references/includes (:db/id bar)
  144. :logseq.property.linked-references/excludes (:db/id baz)}])
  145. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  146. (is (= (set [["Journal" 1] ["Jun 11th, 2025" 1] ["bar" 1]]) (set ref-pages-count))
  147. "ref-pages-count check failed")
  148. (is (= 3 (count ref-matched-children-ids))
  149. "ref-matched-children-ids check failed")
  150. (is (= #{"[[foo]] 1"} (set (map :block/title ref-blocks)))
  151. "ref-blocks check failed")))
  152. (testing "Linked references includes \"baz\" and excludes \"bar\""
  153. (retract-filters! conn foo-id)
  154. (d/transact! conn
  155. [{:db/id (:db/id foo)
  156. :logseq.property.linked-references/includes (:db/id baz)
  157. :logseq.property.linked-references/excludes (:db/id bar)}])
  158. (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
  159. (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
  160. "ref-pages-count check failed")
  161. (is (= 2 (count ref-matched-children-ids))
  162. "ref-matched-children-ids check failed")
  163. (is (= #{"[[foo]] 1" "[[foo]] 2"} (set (map :block/title ref-blocks)))
  164. "ref-blocks check failed")))))
  165. (deftest get-unlinked-references
  166. (let [conn (create-conn!)
  167. db @conn
  168. ids (map #(:db/id (ldb/get-page @conn %)) ["foo" "bar" "baz"])]
  169. (is (= [3 2 3]
  170. (mapv #(count (db-reference/get-unlinked-references db %)) ids)))))