From e20c9f49818e8c7f18a5101eb7b3e15c5cc7ccb1 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Fri, 6 Nov 2020 11:19:23 +0000
Subject: [PATCH] ENH: Add tests for inheritance bug

---
 CHANGELOG.md              |   1 +
 tests/test_inheritance.py | 242 ++++++++++++++++++++------------------
 2 files changed, 126 insertions(+), 117 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ea205f..38a97c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added (for new features)
 
+* Tests for inheritance bug (caosdb/caosdb-server!54)
 * Tests for versioning
 * Tests for deeply nested SELECT queries
 * Tests for [#62](https://gitlab.com/caosdb/caosdb-server/-/issues/62)
diff --git a/tests/test_inheritance.py b/tests/test_inheritance.py
index 16e1ec0..6b4fd2c 100644
--- a/tests/test_inheritance.py
+++ b/tests/test_inheritance.py
@@ -27,30 +27,39 @@
 """
 
 
-import caosdb as h
-from nose.tools import assert_equal, assert_true, assert_is_not_none, with_setup
+import caosdb as db
+
+
+def setup():
+    teardown()
+
+
+def teardown():
+    d = db.execute_query("FIND ENTITY WITH ID > 99")
+    if len(d) > 0:
+        d.delete()
 
 
 def test_inheritance_fix_properties():
     try:
         """FIX PROPERTIES."""
         '''insert simple property with unit'''
-        p1 = h.Property(name='UnitTestProperty', datatype='double', unit='m')
+        p1 = db.Property(name='UnitTestProperty', datatype='double', unit='m')
         p1.insert()
 
-        p1c = h.Property(id=p1.id).retrieve()
-        assert_true(p1c.is_valid())
-        assert_equal('m', p1c.unit)
+        p1c = db.Property(id=p1.id).retrieve()
+        assert p1c.is_valid()
+        assert 'm' == p1c.unit
 
         '''subtyping with unit inheritance'''
-        p2 = h.Property(
+        p2 = db.Property(
             name='SubTypeOfUnitTestProperty').add_parent(
             id=p1.id, inheritance="FIX")
         print(p2)
         p2.insert()
         print(p2)
-        assert_true(p2.is_valid())
-        assert_equal('m', p2.unit)
+        assert p2.is_valid()
+        assert 'm' == p2.unit
     finally:
         try:
             p2.delete()
@@ -65,54 +74,52 @@ def test_inheritance_fix_properties():
 def test_inheritance_obl_properties():
     try:
         """OBLIGATORY PROPERTIES."""
-        c = h.Container()
+        c = db.Container()
         c.append(
-            h.Property(
+            db.Property(
                 name="SimpleTextProperty",
                 description="simple text property (from test_inheritance.py)",
                 datatype='text'))
         c.append(
-            h.Property(
+            db.Property(
                 name="SimpleDoubleProperty",
                 description="simple double property (from test_inheritance.py)",
                 datatype='double'))
         c.append(
-            h.Property(
+            db.Property(
                 name="SimpleIntegerProperty",
                 description="simple integer property (from test_inheritance.py)",
                 datatype='integer'))
         c.append(
-            h.Property(
+            db.Property(
                 name="SimpleDatetimeProperty",
                 description="simple datetime property (from test_inheritance.py)",
                 datatype='datetime'))
         c.append(
-            h.Property(
+            db.Property(
                 name="SimpleFileProperty",
                 description="simple file property (from test_inheritance.py)",
                 datatype='file'))
 
-        c.append(
-            h.RecordType(
-                name="SimpleRecordType",
-                description="simple recordType (from test_inheritance.py)") .add_property(
-                name='SimpleTextProperty',
-                importance="obligatory") .add_property(
-                name='SimpleDoubleProperty',
-                importance="obligatory") .add_property(
-                    name='SimpleIntegerProperty',
-                    importance="obligatory") .add_property(
-                        name='SimpleDatetimeProperty') .add_property(
-                            name='SimpleFileProperty'))
+        rt = db.RecordType(
+            name="SimpleRecordType",
+            description="simple recordType (from test_inheritance.py)")
+        rt.add_property(name='SimpleTextProperty', importance="obligatory")
+        rt.add_property(name='SimpleDoubleProperty', importance="obligatory")
+        rt.add_property(name='SimpleIntegerProperty', importance="obligatory")
+        rt.add_property(name='SimpleDatetimeProperty')
+        rt .add_property(name='SimpleFileProperty')
+        c.append(rt)
         c.insert()
 
-        rt = h.RecordType(
+        rt = db.RecordType(
             name="SubTypeOfSimpleRecordType",
             description="recordtype with inheritance (from test_inheritance.py)").add_parent(
             name="SimpleRecordType",
             inheritance="obligatory")
         rt.insert()
-        assert_equal(3, len(rt.get_properties()))
+        # only three properties are obligatory
+        assert 3 == len(rt.get_properties())
     finally:
         try:
             rt.delete()
@@ -125,69 +132,59 @@ def test_inheritance_obl_properties():
 
 
 def test_inheritance_all_properties():
-    try:
-        """ALL PROPERTIES."""
-        c = h.Container()
-        c.append(
-            h.Property(
-                name="SimpleTextProperty",
-                description="simple text property (from test_inheritance.py)",
-                datatype='text'))
-        c.append(
-            h.Property(
-                name="SimpleDoubleProperty",
-                description="simple double property (from test_inheritance.py)",
-                datatype='double'))
-        c.append(
-            h.Property(
-                name="SimpleIntegerProperty",
-                description="simple integer property (from test_inheritance.py)",
-                datatype='integer'))
-        c.append(
-            h.Property(
-                name="SimpleDatetimeProperty",
-                description="simple datetime property (from test_inheritance.py)",
-                datatype='datetime'))
-        c.append(
-            h.Property(
-                name="SimpleFileProperty",
-                description="simple file property (from test_inheritance.py)",
-                datatype='file'))
-
-        c.append(
-            h.RecordType(
-                name="SimpleRecordType",
-                description="simple recordType (from test_inheritance.py)") .add_property(
-                name='SimpleTextProperty',
-                importance="obligatory") .add_property(
-                name='SimpleDoubleProperty',
-                importance="obligatory") .add_property(
-                    name='SimpleIntegerProperty',
-                    importance="obligatory") .add_property(
-                        name='SimpleDatetimeProperty') .add_property(
-                            name='SimpleFileProperty'))
-        c.insert()
-
-        rt = h.RecordType(
-            name="SubTypeOfSimpleRecordType",
-            description="recordtype with inheritance (from test_inheritance.py)").add_parent(
+    """ALL PROPERTIES."""
+    c = db.Container()
+    c.append(
+        db.Property(
+            name="SimpleTextProperty",
+            description="simple text property (from test_inheritance.py)",
+            datatype='text'))
+    c.append(
+        db.Property(
+            name="SimpleDoubleProperty",
+            description="simple double property (from test_inheritance.py)",
+            datatype='double'))
+    c.append(
+        db.Property(
+            name="SimpleIntegerProperty",
+            description="simple integer property (from test_inheritance.py)",
+            datatype='integer'))
+    c.append(
+        db.Property(
+            name="SimpleDatetimeProperty",
+            description="simple datetime property (from test_inheritance.py)",
+            datatype='datetime'))
+    c.append(
+        db.Property(
+            name="SimpleFileProperty",
+            description="simple file property (from test_inheritance.py)",
+            datatype='file'))
+
+    c.append(
+        db.RecordType(
             name="SimpleRecordType",
-            inheritance="obligatory")
-        rt.insert()
-        assert_equal(3, len(rt.get_properties()))
-    finally:
-        try:
-            rt.delete()
-        except BaseException:
-            pass
-        try:
-            c.delete()
-        except BaseException:
-            pass
+            description="simple recordType (from test_inheritance.py)") .add_property(
+            name='SimpleTextProperty',
+            importance="obligatory") .add_property(
+            name='SimpleDoubleProperty',
+            importance="obligatory") .add_property(
+                name='SimpleIntegerProperty',
+                importance="obligatory") .add_property(
+                    name='SimpleDatetimeProperty') .add_property(
+                        name='SimpleFileProperty'))
+    c.insert()
+
+    rt = db.RecordType(
+        name="SubTypeOfSimpleRecordType",
+        description="recordtype with inheritance (from test_inheritance.py)").add_parent(
+        name="SimpleRecordType",
+        inheritance="obligatory")
+    rt.insert()
+    assert 3 == len(rt.get_properties())
 
 
 def test_inheritance_unit():
-    p = h.Property(
+    p = db.Property(
         name="SimpleIntProperty",
         datatype="INTEGER",
         unit="m")
@@ -195,7 +192,7 @@ def test_inheritance_unit():
     assert p.is_valid()
     assert p.unit == "m"
 
-    rt = h.RecordType(
+    rt = db.RecordType(
         name="SimpleRecordType")
     rt.add_property(p, unit="km")
     rt.insert()
@@ -203,11 +200,11 @@ def test_inheritance_unit():
     assert rt.is_valid()
     assert rt.get_property("SimpleIntProperty").unit == "km"
 
-    rt2 = h.execute_query("FIND SimpleRecordType", True)
+    rt2 = db.execute_query("FIND SimpleRecordType", True)
     assert rt2.id == rt.id
     assert rt2.get_property("SimpleIntProperty").unit == "km"
 
-    rt3 = h.RecordType(
+    rt3 = db.RecordType(
         name="SimpleRecordType2")
     rt3.add_parent(rt, inheritance="ALL")
     rt3.insert()
@@ -215,12 +212,12 @@ def test_inheritance_unit():
     assert rt3.get_property("SimpleIntProperty") is not None
     assert rt3.get_property("SimpleIntProperty").unit == "km"
 
-    rt4 = h.execute_query("FIND SimpleRecordType2", True)
+    rt4 = db.execute_query("FIND SimpleRecordType2", True)
     assert rt4.is_valid()
     assert rt4.id == rt3.id
     assert rt4.get_property("SimpleIntProperty").unit == "km"
 
-    rec = h.Record(
+    rec = db.Record(
         name="SimpleRecord")
     rec.add_parent(rt3)
     rec.add_property(name="SimpleIntProperty", value=1)
@@ -231,43 +228,54 @@ def test_inheritance_unit():
 
 
 _ENTITIES = [
-    h.RecordType(name="Simulation").add_property(name="SimulationModel"),
+    db.RecordType(name="Simulation").add_property(name="SimulationModel"),
 
-    h.RecordType(name="PublicationReference").add_property(name="date"),
-    h.RecordType(
+    db.RecordType(name="PublicationReference").add_property(name="date"),
+    db.RecordType(
         name="SimulationModel").add_property(
         name="PublicationReference"),
 
-    h.Property(name="date", datatype=h.TEXT),
-    h.Property(name="blub", datatype=h.TEXT),
+    db.Property(name="date", datatype=db.TEXT),
+    db.Property(name="blub", datatype=db.TEXT),
 ]
 
 
-def setup_subproperties():
-    con = h.Container().extend(_ENTITIES)
-    con.insert()
-
-
-def setup_module():
-    old = h.execute_query("FIND ENTITY WITH ID > 100")
-    if old:
-        old.delete()
-
-
-def teardown_module():
-    setup_module()
-
-
-@with_setup(setup_subproperties)
 def test_inherit_subproperties():
-    valid = h.Container().extend(_ENTITIES).retrieve()
-    container = h.Container().extend(_ENTITIES)
+    con = db.Container().extend(_ENTITIES)
+    con.insert()
+    valid = db.Container().extend(_ENTITIES).retrieve()
+    container = db.Container().extend(_ENTITIES)
     container.get_entity_by_name("Simulation").add_property(name="blub")
     for valid_e in valid:
         for entity in container:
             for prop in entity.get_properties():
                 if valid_e.name == prop.name:
                     prop.id = valid_e.id
-                    entity.get_properties()._inheritance[prop] = h.ALL
+                    entity.get_properties()._inheritance[prop] = db.ALL
     container.get_entity_by_name("SimulationModel").update()
     container.get_entity_by_name("Simulation").update()
+
+
+def test_inheritance_in_same_container():
+    """This test covers three cases:
+
+        1. inheritance=db.SUGGESTED
+        2. inheritance=db.RECOMMENDED
+        3. inheritance=db.OBLIGATORY
+    """
+    p = db.Property("TestProperty1", datatype=db.TEXT)
+    rt1 = db.RecordType("TestRT1").add_property(p, importance=db.RECOMMENDED)
+    rt2 = db.RecordType("TestRT2").add_parent("TestRT1",
+                                              inheritance=db.SUGGESTED)
+    rt3 = db.RecordType("TestRT3").add_parent("TestRT1",
+                                              inheritance=db.RECOMMENDED)
+    rt4 = db.RecordType("TestRT4").add_parent("TestRT1",
+                                              inheritance=db.OBLIGATORY)
+    c = db.Container().extend([p, rt1, rt2, rt3, rt4])
+
+    c.insert()
+
+    assert len(rt1.get_properties()) == 1
+    assert len(rt2.get_properties()) == 1
+    assert len(rt3.get_properties()) == 1
+    assert len(rt4.get_properties()) == 0
-- 
GitLab