Browse Source

add tests for extends cycle validation

Tienson Qin 4 months ago
parent
commit
9c49f63a6f

+ 8 - 5
deps/outliner/src/logseq/outliner/validate.cljs

@@ -174,7 +174,7 @@
   [db parent-ent child-ents]
   (doseq [child child-ents]
     (let [children-ids (set (cons (:db/id child)
-                                  (map :db/id (db-class/get-structured-children db (:db/id child)))))]
+                                  (db-class/get-structured-children db (:db/id child))))]
       (when (contains? children-ids (:db/id parent-ent))
         (throw (ex-info "Extends cycle"
                         {:type :notification
@@ -183,10 +183,13 @@
                                    :blocks (map #(select-keys % [:db/id :block/title]) [child])}}))))))
 
 (defn validate-extends-property
-  [db parent-ent child-ents]
-  (disallow-extends-cycle db parent-ent child-ents)
-  (disallow-built-in-class-extends-change parent-ent child-ents)
-  (validate-extends-property-have-correct-type parent-ent child-ents))
+  [db parent-ent* child-ents]
+  (let [parent-ent (if (integer? parent-ent*)
+                     (d/entity db parent-ent*)
+                     parent-ent*)]
+    (disallow-extends-cycle db parent-ent child-ents)
+    (disallow-built-in-class-extends-change parent-ent child-ents)
+    (validate-extends-property-have-correct-type parent-ent child-ents)))
 
 (defn- disallow-node-cant-tag-with-built-in-non-tags
   [db _block-eids v]

+ 18 - 0
deps/outliner/test/logseq/outliner/property_test.cljs

@@ -321,3 +321,21 @@
         block (db-test/find-block-by-content @conn "o1")]
     (is (= [:user.property/p1 :user.property/p2 :user.property/p3]
            (map :db/ident (:classes-properties (outliner-property/get-block-classes-properties @conn (:db/id block))))))))
+
+(deftest extends-cycle
+  (testing "Fail when creating a cycle of extends"
+    (let [conn (db-test/create-conn-with-blocks
+                {:classes {:Class1 {}
+                           :Class2 {}
+                           :Class3 {}}})
+          db @conn
+          class1 (d/entity db :user.class/Class1)
+          class2 (d/entity db :user.class/Class2)
+          class3 (d/entity db :user.class/Class3)]
+      (outliner-property/set-block-property! conn (:db/id class1) :logseq.property.class/extends (:db/id class2))
+      (outliner-property/set-block-property! conn (:db/id class2) :logseq.property.class/extends (:db/id class3))
+      (is (thrown-with-msg?
+           js/Error
+           #"Extends cycle"
+           (outliner-property/set-block-property! conn (:db/id class3) :logseq.property.class/extends (:db/id class1)))
+          "Extends cycle"))))

+ 6 - 4
deps/outliner/test/logseq/outliner/validate_test.cljs

@@ -97,10 +97,11 @@
         page1 (db-test/find-page-by-title @conn "page1")
         class1 (db-test/find-page-by-title @conn "Class1")
         class2 (db-test/find-page-by-title @conn "Class2")
-        property (db-test/find-page-by-title @conn "prop1")]
+        property (db-test/find-page-by-title @conn "prop1")
+        db @conn]
 
     (testing "valid parent and child combinations"
-      (is (nil? (outliner-validate/validate-extends-property class1 [class2]))
+      (is (nil? (outliner-validate/validate-extends-property db class1 [class2]))
           "parent class to child class is valid"))
 
     (testing "invalid parent and child combinations"
@@ -108,7 +109,7 @@
            (thrown-with-msg?
             js/Error
             #"Can't extend"
-            (outliner-validate/validate-extends-property parent [child]))
+            (outliner-validate/validate-extends-property db parent [child]))
 
         class1 page1
         page1 class1
@@ -118,7 +119,8 @@
       (is (thrown-with-msg?
            js/Error
            #"Can't change.*built-in"
-           (outliner-validate/validate-extends-property (entity-plus/entity-memoized @conn :logseq.class/Task)
+           (outliner-validate/validate-extends-property db
+                                                        (entity-plus/entity-memoized @conn :logseq.class/Task)
                                                         [(entity-plus/entity-memoized @conn :logseq.class/Cards)]))))))
 
 (deftest validate-tags-property

+ 0 - 1
src/main/frontend/components/property/value.cljs

@@ -1487,7 +1487,6 @@
                      "Fix it!")]
        (let [empty-value? (when (coll? v) (= :logseq.property/empty-placeholder (:db/ident (first v))))
              closed-values? (seq (:property/closed-values property))
-             property-ident (:db/ident property)
              value-cp [:div.property-value-inner
                        {:data-type type
                         :class (str (when empty-value? "empty-value")