From 3aaeae7bd933b772508a2e2670ca370ebe4515ea Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Sat, 7 Nov 2020 01:53:59 +0100
Subject: [PATCH] WIP: tests for versioned queries

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

diff --git a/tests/query_version.py b/tests/query_version.py
new file mode 100644
index 0000000..74101db
--- /dev/null
+++ b/tests/query_version.py
@@ -0,0 +1,360 @@
+# encoding: utf-8
+#
+# ** header v3.0
+# 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
+#
+# 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/>.
+#
+# ** end header
+#
+import caosdb as db
+from caosdb import execute_query as query
+
+CONTAINER = db.Container()
+TEST_PROP_TEXT = db.Property("TestPropertyText", datatype=db.TEXT)
+TEST_PROP_DOUBLE = db.Property("TestPropertyDouble", datatype=db.DOUBLE)
+TEST_PROP_INTEGER = db.Property("TestPropertyInteger", datatype=db.INTEGER)
+TEST_PROP_DATETIME = db.Property("TestPropertyDatetime", datatype=db.DATETIME)
+TEST_PROP_DATE = db.Property("TestPropertyDate", datatype=db.DATETIME)
+TEST_REF_RT = db.RecordType("TestRefRecordType")
+
+TEST_REF_1 = db.Record("TestRef1", description="ref1").add_parent(TEST_REF_RT)
+TEST_REF_2 = db.Record("TestRef2", description="ref2").add_parent(TEST_REF_RT)
+TEST_REF_3 = db.Record("TestRef3", description="ref3").add_parent(TEST_REF_RT)
+TEST_RT_1 = db.RecordType("TestRecordType1")
+TEST_REC_1 = db.Record(
+    "TestRecord1",
+    description="v1").add_parent(
+        TEST_RT_1).add_property(
+            TEST_PROP_TEXT,
+            "val1").add_property(
+                TEST_PROP_DOUBLE,
+                1.14).add_property(
+                    TEST_PROP_INTEGER,
+                    100).add_property(
+                        TEST_PROP_DATETIME,
+                        "2021-12-24T20:15:00").add_property(
+                            TEST_PROP_DATE,
+                            "2021-12").add_property(
+                                TEST_REF_RT,
+                                TEST_REF_1)
+
+
+def teardown_module():
+    CONTAINER.delete()
+
+
+def setup_module():
+    CONTAINER.extend([TEST_RT_1, TEST_REC_1, TEST_PROP_TEXT, TEST_PROP_DOUBLE,
+                      TEST_PROP_INTEGER, TEST_PROP_DATETIME, TEST_PROP_DATE,
+                      TEST_REF_RT, TEST_REF_1, TEST_REF_2, TEST_REF_3]).insert()
+
+    # update test_rec_1 two times
+    TEST_REC_1.description = "v2"
+    TEST_REC_1.get_property(TEST_PROP_TEXT).value = "val2"
+    TEST_REC_1.get_property(TEST_PROP_DOUBLE).value = 2.14
+    TEST_REC_1.get_property(TEST_PROP_INTEGER).value = 200
+    TEST_REC_1.get_property(TEST_PROP_DATETIME).value = "2022-12-24T20:15:00"
+    TEST_REC_1.get_property(TEST_PROP_DATE).value = "2022-12"
+    TEST_REC_1.get_property(TEST_REF_RT).value = TEST_REF_2
+    TEST_REC_1.update()
+
+    TEST_REC_1.description = "v3"
+    TEST_REC_1.get_property(TEST_PROP_TEXT).value = "val3"
+    TEST_REC_1.get_property(TEST_PROP_DOUBLE).value = 3.14
+    TEST_REC_1.get_property(TEST_PROP_INTEGER).value = 300
+    TEST_REC_1.get_property(TEST_PROP_DATETIME).value = "2023-12-24T20:15:00"
+    TEST_REC_1.get_property(TEST_PROP_DATE).value = "2023-12"
+    TEST_REC_1.get_property(TEST_REF_RT).value = TEST_REF_3
+    TEST_REC_1.update()
+
+
+def test_normal_find_record():
+    result = query("FIND RECORD TestRecord1")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecordType1")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyText = val3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyText = val1")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDouble = 3.14")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDouble = 1.14")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyInteger = 300")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyInteger = 100")
+    assert len(result) == 0
+
+    result = query(
+        "FIND RECORD TestRecord1 WITH TestPropertyDatetime = 2023-12-24T20:15:00")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND RECORD TestRecord1 WITH TestPropertyDatetime IN 2023-12")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND RECORD TestRecord1 WITH TestPropertyDatetime = 2021-12-24T20:15:00")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDatetime IN 2021")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDate = 2023-12")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDate = 2021-12")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDate in 2023")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestPropertyDate in 2021")
+    assert len(result) == 0
+
+    result = query("FIND RECORD TestRecord1 WITH TestRefRecordType = TestRef3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND RECORD TestRecord1 WITH TestRefRecordType = TestRef1")
+    assert len(result) == 0
+
+    result = query(
+        "FIND RECORD TestRecord1 WITH TestRefRecordType -> TestRef3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND RECORD TestRecord1 WITH TestRefRecordType -> TestRef1")
+    assert len(result) == 0
+
+
+def test_find_any_version_of_record():
+    result = query("FIND ANY VERSION OF RECORD")
+    assert len(result) == 6
+    assert set(["v3", "v2", "v1", "ref1", "ref2", "ref3"]
+               ) == set([r.description for r in result])
+
+
+def test_find_any_version_of_record_by_name():
+    result = query("FIND ANY VERSION OF RECORD TestRecord1")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+
+def test_find_any_version_of_record_by_parent():
+    result = query("FIND ANY VERSION OF RECORD TestRecordType1")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+
+def test_find_any_version_of_named_entity_with_id_filter():
+    result = query(
+        "FIND ANY VERSION OF TestRecord1 WITH id = " + str(TEST_REC_1.id))
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+
+def test_find_any_version_of_entity_with_id_filter():
+    result = query("FIND ANY VERSION OF ENTITY WITH id = " +
+                   str(TEST_REC_1.id))
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+
+def test_find_any_version_of_record_with_id_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH id = " +
+                   str(TEST_REC_1.id))
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+
+def test_find_any_version_of_record_with_simple_pov_text_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyText")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyText = val3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyText = val2")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyText = val1")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+
+def test_find_any_version_of_record_with_simple_pov_double_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDouble")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDouble = 3.14")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDouble = 2.14")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDouble = 1.14")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+
+def test_find_any_version_of_record_with_simple_pov_integer_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyInteger")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyInteger = 300")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyInteger = 200")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyInteger = 100")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+
+def test_find_any_version_of_record_with_simple_pov_datetime_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDatetime")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime = 2023-12-24T20:15:00")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime = 2022-12-24T20:15:00")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime = 2021-12-24T20:15:00")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime IN 2023")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime IN 2022")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDatetime IN 2021")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+
+def test_find_any_version_of_record_with_simple_pov_date_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDate")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDate = 2023-12")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDate = 2022-12")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestPropertyDate = 2021-12")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDate IN 2023")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDate IN 2022")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query("FIND ANY VERSION OF RECORD WITH TestPropertyDate IN 2021")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+
+def test_find_any_version_of_record_with_simple_reference_filter():
+    result = query("FIND ANY VERSION OF RECORD WITH TestRefRecordType")
+    assert len(result) == 3
+    assert set(["v3", "v2", "v1"]) == set([r.description for r in result])
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType = TestRef3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType = TestRef2")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType = TestRef1")
+    assert len(result) == 1
+    assert result[0].description == "v1"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType -> TestRef3")
+    assert len(result) == 1
+    assert result[0].description == "v3"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType -> TestRef2")
+    assert len(result) == 1
+    assert result[0].description == "v2"
+
+    result = query(
+        "FIND ANY VERSION OF RECORD WITH TestRefRecordType -> TestRef1")
+    assert len(result) == 1
+    assert result[0].description == "v1"
-- 
GitLab