From e39e681be449f0a4320520578fc7dc5c7ef1dd62 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <alexander@mail-schlemmer.de>
Date: Fri, 21 Jan 2022 15:56:27 +0100
Subject: [PATCH] FIX: for missing entries in comparison

---
 src/caosdb/apiutils.py     |  8 +++---
 unittests/test_apiutils.py | 52 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py
index 4ee0dacd..e0464cc8 100644
--- a/src/caosdb/apiutils.py
+++ b/src/caosdb/apiutils.py
@@ -558,8 +558,8 @@ def getCommitIn(folder):
         return t.readline().strip()
 
 
-COMPARED = ["name", "role", "datatype", "description", "importance"]
-
+COMPARED = ["name", "role", "datatype", "description", "importance",
+            "id", "path", "checksum", "size"]
 
 def compare_entities(old_entity: Entity, new_entity: Entity):
     """
@@ -613,7 +613,7 @@ def compare_entities(old_entity: Entity, new_entity: Entity):
 
             if new_entity_attr_exists:
                 newdiff[attr] = newattr
-
+                
     # properties
 
     for prop in old_entity.properties:
@@ -653,7 +653,7 @@ def compare_entities(old_entity: Entity, new_entity: Entity):
                 olddiff["properties"].pop(prop.name)
 
         else:
-            raise NotImplementedError()
+            raise NotImplementedError("Comparison not implemented for multi-properties.")
 
     for prop in new_entity.properties:
         if len([0 for p in old_entity.properties if p.name == prop.name]) == 0:
diff --git a/unittests/test_apiutils.py b/unittests/test_apiutils.py
index 9cf9e1b7..b46d8998 100644
--- a/unittests/test_apiutils.py
+++ b/unittests/test_apiutils.py
@@ -179,3 +179,55 @@ def test_compare_entities_units():
 
     assert diff_r1["properties"]["test"]["unit"] == "cm"
     assert diff_r2["properties"]["test"]["unit"] == "m"
+
+    
+def test_compare_special_properties():
+    # Test for all known special properties:
+    SPECIAL_PROPERTIES = ("description", "name", "checksum", "size", "path", "id")
+    INTS = ("size", "id")
+    HIDDEN = ("checksum", "size")
+
+    for key in SPECIAL_PROPERTIES:
+        set_key = key
+        if key in HIDDEN:
+            set_key = "_" + key
+        r1 = db.Record()
+        r2 = db.Record()
+        if key not in INTS:
+            setattr(r1, set_key, "bla 1")
+            setattr(r2, set_key, "bla 1")
+        else:
+            setattr(r1, set_key, 1)
+            setattr(r2, set_key, 1)
+
+        diff_r1, diff_r2 = compare_entities(r1, r2)
+        print(diff_r1)
+        print(diff_r2)
+        assert key not in diff_r1
+        assert key not in diff_r2
+        assert len(diff_r1["parents"]) == 0
+        assert len(diff_r2["parents"]) == 0
+        assert len(diff_r1["properties"]) == 0
+        assert len(diff_r2["properties"]) == 0
+
+        if key not in INTS:
+            setattr(r2, set_key, "bla test")
+        else:
+            setattr(r2, set_key, 2)
+
+        diff_r1, diff_r2 = compare_entities(r1, r2)
+        print(r1)
+        print(r2)
+        print(diff_r1)
+        print(diff_r2)
+        assert key in diff_r1
+        assert key in diff_r2
+        if key not in INTS:
+            assert diff_r1[key] == "bla 1"
+            assert diff_r2[key] == "bla test"
+        else:
+            assert diff_r1[key] == 1
+            assert diff_r2[key] == 2
+        assert len(diff_r1["properties"]) == 0
+        assert len(diff_r2["properties"]) == 0
+        
-- 
GitLab