From 3819463a4ec43b9b58036a90a3ef49817076a99b Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 17 Jun 2021 01:33:05 +0200
Subject: [PATCH] Tests for obligatory properties

---
 tests/test_importance.py | 148 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 148 insertions(+)
 create mode 100644 tests/test_importance.py

diff --git a/tests/test_importance.py b/tests/test_importance.py
new file mode 100644
index 0000000..1536f1e
--- /dev/null
+++ b/tests/test_importance.py
@@ -0,0 +1,148 @@
+#
+# This file is a part of the CaosDB Project.
+#
+# Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
+# Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# 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/>.
+#
+
+from pytest import raises
+import caosdb as db
+
+
+def setup():
+    teardown_module()
+
+
+def teardown_module():
+    clean = db.execute_query("FIND Test*")
+    if len(clean) > 0:
+        clean.delete()
+
+
+def test_obl_missing_error():
+    p = db.Property(name="TestOblProperty", datatype=db.TEXT).insert()
+    p_dummy = db.Property(name="TestDummyProperty", datatype=db.TEXT).insert()
+
+    rt1 = db.RecordType(name="TestRecordType1")
+    rt1.add_property(name="TestOblProperty", importance=db.OBLIGATORY)
+    rt1.insert()
+
+    # normal behaviour
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt2.add_property("TestDummyProperty")
+    with raises(db.TransactionError) as exc:
+        rt2.insert()
+    assert exc.value.errors[0].msg == "An obligatory property is missing."
+
+    # force error
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt2.add_property("TestDummyProperty")
+    rt2.set_flag("force-missing-obligatory", "error")
+    with raises(db.TransactionError) as exc:
+        rt2.insert()
+    assert exc.value.errors[0].msg == "An obligatory property is missing."
+
+    # warning is treated as error because "strict" flag
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt2.add_property("TestDummyProperty")
+    rt2.set_flag("force-missing-obligatory", "warn")
+    with raises(db.TransactionError) as exc:
+        rt2.insert(strict=True)
+    assert exc.value.errors[0].msg == "A warning occured while processing an entity with the strict flag."
+    assert "An obligatory property is missing." in [
+        w.description for w in rt2.get_warnings()]
+
+    # insert with warning
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt2.add_property("TestDummyProperty")
+    rt2.set_flag("force-missing-obligatory", "warn")
+    rt2.insert()
+    assert len(rt2.get_errors()) == 0
+    assert rt2.get_warnings(
+    )[0].description == "An obligatory property is missing."
+
+    # insert silently
+    rt3 = db.RecordType(name="TestRecordType3")
+    rt3.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt3.add_property("TestDummyProperty")
+    rt3.set_flag("force-missing-obligatory", "ignore")
+    rt3.insert()
+    assert len(rt3.get_errors()) == 0
+    assert len(rt3.get_warnings()) == 0
+
+
+def test_obl_missing_parent_in_same_container():
+    p = db.Property(name="TestOblProperty", datatype=db.TEXT).insert()
+
+    rt1 = db.RecordType(name="TestRecordType1")
+    rt1.add_property(name="TestOblProperty", importance=db.OBLIGATORY)
+
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+
+    c = db.Container()
+    c.extend([rt1, rt2])
+    # with raises(db.TransactionError) as exc:
+    # c.insert()
+    # assert exc.value == "asdf"
+
+    # set container flag, override in rt2 (entity flag takes precedence here)
+    rt2.set_flag("force-missing-obligatory", "error")
+    with raises(db.TransactionError) as exc:
+        c.insert(flags={"force-missing-obligatory": "ignore"})
+    assert exc.value.errors[0].msg == "An obligatory property is missing."
+
+
+def test_sub_property_of_obl():
+    p1 = db.Property(name="TestOblProperty1", datatype=db.TEXT).insert()
+    p2 = db.Property(name="TestOblProperty2", datatype=db.TEXT)
+    p2.add_parent("TestOblProperty1")
+    p2.insert()
+
+    rt1 = db.RecordType(name="TestRecordType1")
+    rt1.add_property(name="TestOblProperty1", importance=db.OBLIGATORY)
+    rt1.insert()
+
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+
+    # add subtype of TestOblProperty1
+    rt2.add_property("TestOblProperty2")
+    rt2.insert()  # everything ok!
+
+
+def test_sub_property_of_obl_in_same_container():
+
+    p1 = db.Property(name="TestOblProperty1", datatype=db.TEXT).insert()
+
+    rt1 = db.RecordType(name="TestRecordType1")
+    rt1.add_property(name="TestOblProperty1", importance=db.OBLIGATORY)
+    rt1.insert()
+
+    p2 = db.Property(name="TestOblProperty2", datatype=db.TEXT)
+    p2.add_parent("TestOblProperty1")
+
+    rt2 = db.RecordType(name="TestRecordType2")
+    rt2.add_parent("TestRecordType1", inheritance=db.NONE)
+    rt2.add_property("TestOblProperty2")
+
+    c = db.Container()
+    c.extend([rt2, p2])
+    c.insert()  # everything ok!
-- 
GitLab