From 63658ad0478d4bc6d16904d76587930ed2dbb966 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <alexander@mail-schlemmer.de>
Date: Fri, 5 May 2023 16:48:23 +0200
Subject: [PATCH] FIX: additional checks for unsupported multi-properties were
 needed

---
 src/caosdb/apiutils.py     |  9 ++++++++-
 unittests/test_apiutils.py | 18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py
index 105e3e63..70f7db9c 100644
--- a/src/caosdb/apiutils.py
+++ b/src/caosdb/apiutils.py
@@ -293,6 +293,7 @@ def compare_entities(old_entity: Entity, new_entity: Entity,
                 "Comparison not implemented for multi-properties.")
 
         if len(matching) == 0:
+            # There is no matching property in new_entity:
             olddiff["properties"][prop.name] = {}
         elif len(matching) == 1:
             newdiff["properties"][prop.name] = {}
@@ -347,8 +348,14 @@ def compare_entities(old_entity: Entity, new_entity: Entity,
                 olddiff["properties"].pop(prop.name)
 
             
-
+    # Check whether there are missing properties in old_entity, additionally
+    # check for multi-properties that are currently not supported:
     for prop in new_entity.properties:
+        matching = [p for p in new_entity.properties if p.name == prop.name]
+        if len(matching) > 1:
+            raise NotImplementedError(
+                "Comparison not implemented for multi-properties.")
+        
         if len([0 for p in old_entity.properties if p.name == prop.name]) == 0:
             newdiff["properties"][prop.name] = {}
 
diff --git a/unittests/test_apiutils.py b/unittests/test_apiutils.py
index 91d0eeb2..df06f4db 100644
--- a/unittests/test_apiutils.py
+++ b/unittests/test_apiutils.py
@@ -331,6 +331,24 @@ def test_multi_properties():
     with pytest.raises(NotImplementedError, match=".*multi-properties.*"):
         compare_entities(r1, r2)
 
+    r1 = db.Record()
+    r2 = db.Record()
+    r1.add_property("test", value=4)
+    r1.add_property("test", value=2)
+    # That would be expected:
+    # assert empty_diff(r1, r2)
+    with pytest.raises(NotImplementedError, match=".*multi-properties.*"):
+        compare_entities(r1, r2)
+
+    r1 = db.Record()
+    r2 = db.Record()
+    r2.add_property("test", value=2)
+    r2.add_property("test", value=5)
+    # That would be expected:
+    # assert empty_diff(r1, r2)
+    with pytest.raises(NotImplementedError, match=".*multi-properties.*"):
+        compare_entities(r1, r2)
+
 
 def test_copy_entities():
     r = db.Record(name="A")
-- 
GitLab