From d52be65620d80b4e8be2cafc987b8c23de9ba25b Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Tue, 1 Nov 2022 16:58:21 +0100
Subject: [PATCH] TST: Add unit tests for force merge

---
 unittests/test_apiutils.py | 86 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 82 insertions(+), 4 deletions(-)

diff --git a/unittests/test_apiutils.py b/unittests/test_apiutils.py
index 89be9b86..815288de 100644
--- a/unittests/test_apiutils.py
+++ b/unittests/test_apiutils.py
@@ -1,11 +1,11 @@
-# -*- encoding: utf-8 -*-
 #
 # This file is a part of the CaosDB Project.
 #
-# Copyright (C) 2018 Research Group Biomedical Physics,
-# Max-Planck-Institute for Dynamics and Self-Organization Göttingen
 # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
+# Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
 # Copyright (C) 2020-2022 IndiScale GmbH <info@indiscale.com>
+# Copyright (C) 2018 Research Group Biomedical Physics,
+# Max-Planck-Institute for Dynamics and Self-Organization Göttingen
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Affero General Public License as
@@ -20,7 +20,6 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 #
-# ** end header
 #
 # Test apiutils
 # A. Schlemmer, 02/2018
@@ -466,3 +465,82 @@ def test_empty_diff():
         "RefType"), value=[ref_rec_b, ref_rec_b])
     assert not empty_diff(rec_a, rec_b)
     assert empty_diff(rec_a, rec_b, compare_referenced_records=True)
+
+
+def test_force_merge():
+    """Test whether a forced merge overwrites existing properties correctly."""
+
+    # name overwrite
+    recA = db.Record(name="A")
+    recB = db.Record(name="B")
+
+    with pytest.raises(RuntimeError) as re:
+        merge_entities(recA, recB)
+    assert "Merge conflict" in str(re.value)
+
+    merge_entities(recA, recB, force=True)
+    assert recA.name == recB.name
+
+    # description overwrite
+    recA = db.Record(name="A")
+    recA.description = "something"
+    recB = db.Record(name="B")
+    recB.description = "something else"
+
+    with pytest.raises(RuntimeError) as re:
+        merge_entities(recA, recB)
+    assert "Merge conflict" in str(re.value)
+
+    merge_entities(recA, recB, force=True)
+    assert recA.description == recB.description
+
+    # property overwrite
+    recA = db.Record(name="A")
+    recA.add_property(name="propA", value="something")
+    recB = db.Record(name="A")
+    recB.add_property(name="propA", value="something else")
+
+    with pytest.raises(RuntimeError) as re:
+        merge_entities(recA, recB)
+    assert "Merge conflict" in str(re.value)
+
+    merge_entities(recA, recB, force=True)
+    assert recA.get_property("propA").value == recB.get_property("propA").value
+
+    # don't overwrite a property that's not in recB
+    recA = db.Record(name="A")
+    recA.add_property(name="propA", value="something")
+    recA.add_property(name="propB", value=5.0)
+    recB = db.Record(name="A")
+    recB.add_property(name="propA", value="something else")
+
+    merge_entities(recA, recB, force=True)
+    assert recA.get_property("propA").value == recB.get_property("propA").value
+    assert recA.get_property("propB").value == 5.0
+
+    # also overwrite datatypes ...
+    rtA = db.RecordType(name="A")
+    rtA.add_property(name="propA", datatype=db.INTEGER)
+    rtB = db.RecordType(name="B")
+    rtB.add_property(name="propA", datatype=db.TEXT)
+
+    with pytest.raises(RuntimeError) as re:
+        merge_entities(rtA, rtB)
+    assert "Merge conflict" in str(re.value)
+
+    merge_entities(rtA, rtB, force=True)
+    assert rtA.get_property(
+        "propA").datatype == rtB.get_property("propA").datatype
+
+    # ... and units
+    recA = db.Record(name="A")
+    recA.add_property(name="propA", value=5, unit="m")
+    recB = db.Record(name="A")
+    recB.add_property(name="propA", value=500, unit="cm")
+
+    with pytest.raises(RuntimeError) as re:
+        merge_entities(recA, recB)
+    assert "Merge conflict" in str(re.value)
+    merge_entities(recA, recB, force=True)
+    assert recA.get_property("propA").value == recB.get_property("propA").value
+    assert recA.get_property("propA").unit == recB.get_property("propA").unit
-- 
GitLab