Browse Source

enhance(dev): add test helper for ent properties

Was using them across namespaces and they were needlessly different
Gabriel Horner 9 months ago
parent
commit
8550b48f17

+ 20 - 0
deps/db/src/logseq/db/test/helper.cljs

@@ -1,7 +1,9 @@
 (ns ^:node-only logseq.db.test.helper
   "Main ns for providing test fns for DB graphs"
   (:require [datascript.core :as d]
+            [datascript.impl.entity :as de]
             [logseq.db.frontend.entity-plus :as entity-plus]
+            [logseq.db.frontend.property :as db-property]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.sqlite.build :as sqlite-build]
             [logseq.db.sqlite.create-graph :as sqlite-create-graph]))
@@ -41,6 +43,24 @@
        first
        (d/entity db)))
 
+(defn readable-properties
+  "Returns an entity's properties and tags in readable form for assertions.
+   tags are included here since they behave like properties on an ent"
+  [ent]
+  (->> (db-property/properties ent)
+       (mapv (fn [[k v]]
+               [k
+                (cond
+                  (= :block/tags k)
+                  (mapv :db/ident v)
+                  (and (set? v) (every? de/entity? v))
+                  (set (map db-property/property-value-content v))
+                  (de/entity? v)
+                  (or (:db/ident v) (db-property/property-value-content v))
+                  :else
+                  v)]))
+       (into {})))
+
 (defn create-conn
   "Create a conn for a DB graph seeded with initial data"
   []

+ 3 - 20
deps/db/test/logseq/db/sqlite/build_test.cljs

@@ -3,8 +3,7 @@
             [datascript.core :as d]
             [logseq.db.frontend.property :as db-property]
             [logseq.db.sqlite.build :as sqlite-build]
-            [logseq.db.test.helper :as db-test]
-            [datascript.impl.entity :as de]))
+            [logseq.db.test.helper :as db-test]))
 
 (deftest build-tags
   (let [conn (db-test/create-conn)
@@ -67,22 +66,6 @@
                 db-property/property-value-content))
         "built-in :default property is created and correctly associated to a block")))
 
-(defn- readable-properties
-  [ent]
-  (->> (db-property/properties ent)
-       (mapv (fn [[k v]]
-               [k
-                (cond
-                  (= :block/tags k)
-                  (mapv :db/ident v)
-                  (and (set? v) (every? de/entity? v))
-                  (set (map db-property/property-value-content v))
-                  (de/entity? v)
-                  (or (:db/ident v) (db-property/property-value-content v))
-                  :else
-                  v)]))
-       (into {})))
-
 (deftest build-for-existing-blocks
   (let [conn (db-test/create-conn)
         _ (sqlite-build/create-blocks
@@ -125,7 +108,7 @@
       (is (= "imported task" (:block/title updated-block)))
       (is (= {:block/tags [:logseq.class/Task]
               :logseq.task/status :logseq.task/status.todo}
-             (readable-properties updated-block))
+             (db-test/readable-properties updated-block))
           "Block's properties and tags are updated"))
 
     (testing "block with existing user properties and tags"
@@ -136,5 +119,5 @@
       (is (= "imported block" (:block/title updated-block2)))
       (is (= {:block/tags [:user.class/MyClass]
               :user.property/p1 "foo"}
-             (readable-properties updated-block2))
+             (db-test/readable-properties updated-block2))
           "Block's properties and tags are updated"))))

+ 33 - 50
deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs

@@ -11,7 +11,6 @@
             [logseq.db :as ldb]
             [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.malli-schema :as db-malli-schema]
-            [logseq.db.frontend.property :as db-property]
             [logseq.db.frontend.rules :as rules]
             [logseq.db.frontend.validate :as db-validate]
             [logseq.db.test.helper :as db-test]
@@ -21,7 +20,6 @@
             [logseq.graph-parser.test.helper :as test-helper :include-macros true :refer [deftest-async]]
             [logseq.outliner.db-pipeline :as db-pipeline]
             [promesa.core :as p]
-            [datascript.impl.entity :as de]
             [logseq.db.frontend.entity-plus :as entity-plus]))
 
 ;; Helpers
@@ -127,22 +125,6 @@
       (p/finally (fn [_]
                    (reset! gp-block/*export-to-db-graph? false)))))
 
-(defn- readable-properties
-  [ent]
-  (->> (db-property/properties ent)
-       (mapv (fn [[k v]]
-               [k
-                (cond
-                  (= :block/tags k)
-                  (mapv :db/ident v)
-                  (and (set? v) (every? de/entity? v))
-                  (set (map db-property/property-value-content v))
-                  (de/entity? v)
-                  (db-property/property-value-content v)
-                  :else
-                  v)]))
-       (into {})))
-
 ;; Tests
 ;; =====
 
@@ -255,8 +237,7 @@
       (is (= {:user.property/prop-bool true
               :user.property/prop-num 5
               :user.property/prop-string "woot"}
-             (update-vals (db-property/properties (db-test/find-block-by-content @conn "b1"))
-                          (fn [v] (if (de/entity? v) (db-property/property-value-content v) v))))
+             (db-test/readable-properties (db-test/find-block-by-content @conn "b1")))
           "Basic block has correct properties")
       (is (= #{"prop-num" "prop-string" "prop-bool"}
              (->> (db-test/find-block-by-content @conn "b1")
@@ -267,17 +248,17 @@
 
       (is (= {:user.property/prop-num2 10
               :block/tags [:logseq.class/Page]}
-             (readable-properties (db-test/find-page-by-title @conn "new page")))
+             (db-test/readable-properties (db-test/find-page-by-title @conn "new page")))
           "New page has correct properties")
       (is (= {:user.property/prop-bool true
               :user.property/prop-num 5
               :user.property/prop-string "yeehaw"
               :block/tags [:logseq.class/Page :user.class/Some---Namespace]}
-             (readable-properties (db-test/find-page-by-title @conn "some page")))
+             (db-test/readable-properties (db-test/find-page-by-title @conn "some page")))
           "Existing page has correct properties")
 
       (is (= {:user.property/rating 5.5}
-             (readable-properties (db-test/find-block-by-content @conn ":rating float")))
+             (db-test/readable-properties (db-test/find-block-by-content @conn ":rating float")))
           "Block with float property imports as a float")
 
       (is (= []
@@ -295,17 +276,17 @@
 
       (let [b (db-test/find-block-by-content @conn #"MEETING TITLE")]
         (is (= {}
-               (and b (readable-properties b)))
+               (and b (db-test/readable-properties b)))
             ":template properties are ignored to not invalidate its property types"))
 
       (is (= 20221126
-             (-> (readable-properties (db-test/find-block-by-content @conn "only deadline"))
+             (-> (db-test/readable-properties (db-test/find-block-by-content @conn "only deadline"))
                  :logseq.task/deadline
                  date-time-util/ms->journal-day))
           "deadline block has correct journal as property value")
 
       (is (= 20221125
-             (-> (readable-properties (db-test/find-block-by-content @conn "only scheduled"))
+             (-> (db-test/readable-properties (db-test/find-block-by-content @conn "only scheduled"))
                  :logseq.task/scheduled
                  date-time-util/ms->journal-day))
           "scheduled block converted to correct deadline")
@@ -316,24 +297,26 @@
                            @conn "Apr 1st, 2024")))
           "Only one journal page exists when deadline is on same day as journal")
 
-      (is (= {:logseq.task/priority "High"}
-             (readable-properties (db-test/find-block-by-content @conn "high priority")))
+      (is (= {:logseq.task/priority :logseq.task/priority.high}
+             (db-test/readable-properties (db-test/find-block-by-content @conn "high priority")))
           "priority block has correct property")
 
-      (is (= {:logseq.task/status "Doing" :logseq.task/priority "Medium" :block/tags [:logseq.class/Task]}
-             (readable-properties (db-test/find-block-by-content @conn "status test")))
+      (is (= {:logseq.task/status :logseq.task/status.doing
+              :logseq.task/priority :logseq.task/priority.medium
+              :block/tags [:logseq.class/Task]}
+             (db-test/readable-properties (db-test/find-block-by-content @conn "status test")))
           "status block has correct task properties and class")
 
       (is (= #{:logseq.task/status :block/tags}
-             (set (keys (readable-properties (db-test/find-block-by-content @conn "old todo block")))))
+             (set (keys (db-test/readable-properties (db-test/find-block-by-content @conn "old todo block")))))
           "old task properties like 'todo' are ignored")
 
       (is (= {:logseq.property/order-list-type "number"}
-             (readable-properties (db-test/find-block-by-content @conn "list one")))
+             (db-test/readable-properties (db-test/find-block-by-content @conn "list one")))
           "numered block has correct property")
 
       (is (= #{"gpt"}
-             (:block/alias (readable-properties (db-test/find-page-by-title @conn "chat-gpt"))))
+             (:block/alias (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt"))))
           "alias set correctly")
       (is (= ["y"]
              (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property/parent]]
@@ -346,27 +329,27 @@
 
       (is (= {:logseq.property.linked-references/includes #{"Oct 9th, 2024"}
               :logseq.property.linked-references/excludes #{"ref2"}}
-             (select-keys (readable-properties (db-test/find-page-by-title @conn "chat-gpt"))
+             (select-keys (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt"))
                           [:logseq.property.linked-references/excludes :logseq.property.linked-references/includes]))
           "linked ref filters set correctly"))
 
     (testing "built-in classes and their properties"
       ;; Queries
       (is (= {:logseq.property.table/sorting [{:id :user.property/prop-num, :asc? false}]
-              :logseq.property.view/type "Table View"
+              :logseq.property.view/type :logseq.property.view/type.table
               :logseq.property.table/ordered-columns [:block/title :user.property/prop-string :user.property/prop-num]
               :logseq.property/query "(property :prop-string)"
               :block/tags [:logseq.class/Query]}
-             (readable-properties (find-block-by-property-value @conn :logseq.property/query "(property :prop-string)")))
+             (db-test/readable-properties (find-block-by-property-value @conn :logseq.property/query "(property :prop-string)")))
           "simple query block has correct query properties")
       (is (= "For example, here's a query with title text:"
              (:block/title (db-test/find-block-by-content @conn #"query with title text")))
           "Text around a simple query block is set as a query's title")
-      (is (= {:logseq.property.view/type "List View"
+      (is (= {:logseq.property.view/type :logseq.property.view/type.list
               :logseq.property/query "{:query (task todo doing)}"
               :block/tags [:logseq.class/Query]
               :logseq.property.table/ordered-columns [:block/title]}
-             (readable-properties (db-test/find-block-by-content @conn #"tasks with")))
+             (db-test/readable-properties (db-test/find-block-by-content @conn #"tasks with")))
           "Advanced query has correct query properties")
       (is (= "tasks with todo and doing"
              (:block/title (db-test/find-block-by-content @conn #"tasks with")))
@@ -374,7 +357,7 @@
 
       ;; Cards
       (is (= {:block/tags [:logseq.class/Card]}
-             (readable-properties (db-test/find-block-by-content @conn "card 1")))
+             (db-test/readable-properties (db-test/find-block-by-content @conn "card 1")))
           "None of the card properties are imported since they are deprecated"))
 
     (testing "tags convert to classes"
@@ -440,7 +423,7 @@
              (:logseq.property/type (d/entity @conn :user.property/description)))
           ":default property to :node (or any non :default value) remains :default")
       (is (= "[[Jakob]]"
-             (:user.property/description (readable-properties (db-test/find-block-by-content @conn #":default to :node"))))
+             (:user.property/description (db-test/readable-properties (db-test/find-block-by-content @conn #":default to :node"))))
           ":default to :node property saves :default property value default with full text")
 
       (testing "with changes to upstream/existing property value"
@@ -448,17 +431,17 @@
                (:logseq.property/type (d/entity @conn :user.property/duration)))
             ":number property to :default value changes to :default")
         (is (= "20"
-               (:user.property/duration (readable-properties (db-test/find-block-by-content @conn "existing :number to :default"))))
+               (:user.property/duration (db-test/readable-properties (db-test/find-block-by-content @conn "existing :number to :default"))))
             "existing :number property value correctly saved as :default")
 
         (is (= {:logseq.property/type :default :db/cardinality :db.cardinality/many}
                (select-keys (d/entity @conn :user.property/people) [:logseq.property/type :db/cardinality]))
             ":node property to :default value changes to :default and keeps existing cardinality")
         (is (= #{"[[Jakob]] [[Gabriel]]"}
-               (:user.property/people (readable-properties (db-test/find-block-by-content @conn ":node people"))))
+               (:user.property/people (db-test/readable-properties (db-test/find-block-by-content @conn ":node people"))))
             "existing :node property value correctly saved as :default with full text")
         (is (= #{"[[Gabriel]] [[Jakob]]"}
-               (:user.property/people (readable-properties (db-test/find-block-by-content @conn #"pending block for :node"))))
+               (:user.property/people (db-test/readable-properties (db-test/find-block-by-content @conn #"pending block for :node"))))
             "pending :node property value correctly saved as :default with full text")
         (is (some? (db-test/find-page-by-title @conn "Jakob"))
             "Previous :node property value still exists")
@@ -511,7 +494,7 @@
     (testing "whiteboards"
       (let [block-with-props (db-test/find-block-by-content @conn #"block with props")]
         (is (= {:user.property/prop-num 10}
-               (readable-properties block-with-props)))
+               (db-test/readable-properties block-with-props)))
         (is (= "block with props" (:block/title block-with-props)))))))
 
 (deftest-async export-basic-graph-with-convert-all-tags-option-disabled
@@ -564,10 +547,10 @@
             "tag page is not a class")
 
         (is (= #{"Movie"}
-               (:logseq.property/page-tags (readable-properties tagged-page)))
+               (:logseq.property/page-tags (db-test/readable-properties tagged-page)))
             "tagged page has existing page imported as a tag to page-tags")
         (is (= #{"LargeLanguageModel" "fun" "ai"}
-               (:logseq.property/page-tags (readable-properties (db-test/find-page-by-title @conn "chat-gpt"))))
+               (:logseq.property/page-tags (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt"))))
             "tagged page has new page and other pages marked with '#' and '[[]]` imported as tags to page-tags")))))
 
 (deftest-async export-files-with-tag-classes-option
@@ -584,7 +567,7 @@
       (is (= (:block/title block) "Inception")
           "tagged block with configured tag strips tag from content")
       (is (= [:user.class/Movie]
-             (:block/tags (readable-properties block)))
+             (:block/tags (db-test/readable-properties block)))
           "tagged block has configured tag imported as a class")
 
       (is (= [:logseq.class/Tag] (mapv :db/ident (:block/tags tag-page)))
@@ -593,7 +576,7 @@
           "unconfigured tag page is not a class")
 
       (is (= {:block/tags [:logseq.class/Page :user.class/Movie]}
-             (readable-properties (db-test/find-page-by-title @conn "Interstellar")))
+             (db-test/readable-properties (db-test/find-page-by-title @conn "Interstellar")))
           "tagged page has configured tag imported as a class"))))
 
 (deftest-async export-files-with-property-classes-option
@@ -627,7 +610,7 @@
       (is (= (:block/title block) "The Creator")
           "tagged block with configured tag strips tag from content")
       (is (= [:user.class/Movie]
-             (:block/tags (readable-properties block)))
+             (:block/tags (db-test/readable-properties block)))
           "tagged block has configured tag imported as a class")
       (is (= (:user.property/testtagclass block) (:block/tags block))
           "tagged block can have another property that references the same class it is tagged with,
@@ -639,7 +622,7 @@
           "No page exists for configured property")
 
       (is (= #{:user.class/Property :logseq.class/Property}
-             (set (:block/tags (readable-properties (db-test/find-page-by-title @conn "url")))))
+             (set (:block/tags (db-test/readable-properties (db-test/find-page-by-title @conn "url")))))
           "tagged page has correct tags including one from option"))))
 
 (deftest-async export-files-with-remove-inline-tags