Skip to content
Snippets Groups Projects
Verified Commit 20aa7102 authored by Daniel Hornung's avatar Daniel Hornung
Browse files

Merge branch 'dev' into f-fix-108

parents 7db6120c b3357d5d
No related branches found
No related tags found
No related merge requests found
Pipeline #42764 canceled
...@@ -101,12 +101,14 @@ def test_issue_62(): ...@@ -101,12 +101,14 @@ def test_issue_62():
# renaming has to be reflected in Test_Record and Test_Prop # renaming has to be reflected in Test_Record and Test_Prop
rec = db.execute_query("FIND Record Test_Record", unique=True) rec = db.execute_query("FIND Record Test_Record", unique=True)
assert rec.parents[0].name == rtb.name assert rec.parents[0].name == rtb.name
assert rec.get_property("Test_Prop").datatype == rtb.name
prop = db.execute_query("FIND Property Test_Prop", unique=True) prop = db.execute_query("FIND Property Test_Prop", unique=True)
assert prop.datatype == rtb.name # fails; datatype not updated assert prop.datatype == rtb.name # fails; datatype not updated
# Can't use Test_RTA as datatype anymore # Can't use Test_RTA as datatype anymore
prop2 = db.Property(name="Test_Prop2", datatype="Test_RTA") prop2 = db.Property(name="Test_Prop2", datatype="Test_RTA")
with pytest.raises(TransactionError): with pytest.raises(TransactionError) as exc:
prop2.insert() prop2.insert()
assert "Unknown data type." in str(exc.value)
def test_issue_85_a(): def test_issue_85_a():
...@@ -1358,8 +1360,6 @@ def test_216(): ...@@ -1358,8 +1360,6 @@ def test_216():
assert db.execute_query("FIND RECORDTYPE B", unique=True).name == "B" assert db.execute_query("FIND RECORDTYPE B", unique=True).name == "B"
@pytest.mark.xfail(reason="Needs fix for non-integer ids in queries, "
"see https://gitlab.com/caosdb/caosdb-server/-/issues/138")
def test_138(): def test_138():
"""Problems with non-integer ids in query filters, see """Problems with non-integer ids in query filters, see
https://gitlab.com/caosdb/caosdb-server/-/issues/138 https://gitlab.com/caosdb/caosdb-server/-/issues/138
...@@ -1444,7 +1444,7 @@ def test_235_long_name(): ...@@ -1444,7 +1444,7 @@ def test_235_long_name():
try: try:
rt1.insert() rt1.insert()
except Exception as exc: except Exception as exc:
assert type(exc) is not db.HTTPServerError assert not isinstance(exc, db.HTTPServerError)
# TODO more specific error should be asserted # TODO more specific error should be asserted
rt2 = db.RecordType(name="Short") rt2 = db.RecordType(name="Short")
...@@ -1453,5 +1453,5 @@ def test_235_long_name(): ...@@ -1453,5 +1453,5 @@ def test_235_long_name():
try: try:
rt2.update() rt2.update()
except Exception as exc: except Exception as exc:
assert type(exc) is not db.HTTPServerError assert not isinstance(exc, db.HTTPServerError)
# TODO more specific error should be asserted # TODO more specific error should be asserted
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
@author: Timm Fitschen @author: Timm Fitschen
""" """
import caosdb as db
def test_messages_dict_behavior(): def test_messages_dict_behavior():
...@@ -69,3 +71,8 @@ def test_messages_dict_behavior(): ...@@ -69,3 +71,8 @@ def test_messages_dict_behavior():
# this Message has no code and no description (make easy things easy...) # this Message has no code and no description (make easy things easy...)
msgs["HelloWorld"] = "Hello!" msgs["HelloWorld"] = "Hello!"
assert msgs["HelloWorld"] == "Hello!" assert msgs["HelloWorld"] == "Hello!"
def test_info():
a = str(db.Info())
assert a.startswith("Connection to")
...@@ -29,12 +29,12 @@ ...@@ -29,12 +29,12 @@
import os import os
import random import random
import caosdb as db
from pytest import mark, raises import caosdb as db
from caosdb.connection.connection import get_connection from caosdb.connection.connection import get_connection
from caosdb.exceptions import EmptyUniqueQueryError, TransactionError from caosdb.exceptions import EmptyUniqueQueryError, TransactionError
from lxml import etree from lxml import etree
from pytest import mark, raises
def setup_module(): def setup_module():
...@@ -93,6 +93,8 @@ def test_query_with_reference_by_parent(): ...@@ -93,6 +93,8 @@ def test_query_with_reference_by_parent():
unique=True).id unique=True).id
assert exp_rec.id == db.execute_query( assert exp_rec.id == db.execute_query(
"FIND TestExperiment .-> " + str(sp_rec.id), unique=True).id "FIND TestExperiment .-> " + str(sp_rec.id), unique=True).id
assert exp_rec.id == db.execute_query("FIND ENTITY " + str(exp_rec.id), unique=True).id
assert exp_rec.id == db.execute_query("FIND RECORD " + str(exp_rec.id), unique=True).id
assert exp_rec.id == db.execute_query( assert exp_rec.id == db.execute_query(
"FIND TestExperiment .-> TestSpecialProtocolLog1", unique=True).id "FIND TestExperiment .-> TestSpecialProtocolLog1", unique=True).id
assert exp_rec.id == db.execute_query( assert exp_rec.id == db.execute_query(
...@@ -1334,3 +1336,135 @@ def test_find_query_default_role(): ...@@ -1334,3 +1336,135 @@ def test_find_query_default_role():
db.administration.set_server_property("FIND_QUERY_DEFAULT_ROLE", "asdf") db.administration.set_server_property("FIND_QUERY_DEFAULT_ROLE", "asdf")
with raises(TransactionError): with raises(TransactionError):
assert db.execute_query("FIND Test*", unique=True).id == rec.id assert db.execute_query("FIND Test*", unique=True).id == rec.id
def test_query_paging():
test_query = "FIND RECORDTYPE TestRT*"
# insert 20 entities
for i in range(20):
db.RecordType(f"TestRT{i}").insert()
assert len(db.execute_query(test_query)) == 20
# paging off
assert isinstance(db.execute_query(test_query, page_length=0), db.Container)
assert isinstance(db.execute_query(test_query, page_length=-1), db.Container)
assert isinstance(db.execute_query(test_query, page_length=False), db.Container)
assert isinstance(db.execute_query(test_query, page_length=None), db.Container)
assert isinstance(
db.execute_query(
test_query +
" WITH name=TestRT0",
page_length=10,
unique=True),
db.RecordType)
assert isinstance(db.execute_query("COUNT RECORDTYPE", page_length=10), int)
# zero pages
assert len([page for page in db.execute_query(
test_query + " WITH unmet_condition", page_length=109)]) == 0
# two pages
assert len([page for page in db.execute_query(test_query, page_length=10)]) == 2
assert len([page for page in db.execute_query(test_query, page_length=11)]) == 2
assert len([page for page in db.execute_query(test_query, page_length=19)]) == 2
# one page
assert len([page for page in db.execute_query(test_query, page_length=20)]) == 1
assert len([page for page in db.execute_query(test_query, page_length=100)]) == 1
# concat
assert len([entity for page in db.execute_query(test_query, page_length=10)
for entity in page]) == 20
# concat zero pages
assert len([entity for page in db.execute_query(
test_query + " WITH unmet_condition", page_length=10)
for entity in page]) == 0
# this kind of update is allowed
for entity in [entity for page in db.execute_query(
test_query, page_length=10) for entity in page]:
entity.description = "updated"
entity.update()
# as well as this
container = db.Container().extend(
[entity for page in db.execute_query(test_query, page_length=10) for entity in page])
for entity in container:
entity.description = "updated 2"
container.update()
# but not this
with raises(db.exceptions.PagingConsistencyError):
for page in db.execute_query(test_query, page_length=10):
for entity in page:
entity.description = "update not allowed"
entity.update()
# not ideal: the first page has been written:
pages = db.execute_query(test_query, page_length=10)
for entity in next(pages):
assert entity.description == "update not allowed"
for entity in next(pages):
assert entity.description == "updated 2"
# the above pattern is ok if you don't write, tho
for page in db.execute_query(test_query, page_length=10):
for entity in page:
assert entity.description is not None
# don't: entity.update()
def test_greatest_smallest_id():
rt1 = db.RecordType("TestRT1").insert()
rt2 = db.RecordType("TestRT2").insert()
# assumptions
assert rt1.id < rt2.id
# actual testing
assert db.execute_query(
"FIND RECORDTYPE Test* WITH ID>99 AND THE SMALLEST ID",
unique=True).id == rt1.id
assert db.execute_query("FIND RECORDTYPE Test* WITH THE GREATEST ID", unique=True).id == rt2.id
assert db.execute_query("FIND ENTITY Test* WITH THE SMALLEST ID", unique=True).id == rt1.id
assert db.execute_query("FIND ENTITY Test* WITH THE GREATEST ID", unique=True).id == rt2.id
@mark.xfail(reason="Issue: https://gitlab.com/linkahead/linkahead-server/-/issues/237")
def test_greatest_smallest_id_over_roles():
rt1 = db.RecordType("TestRT1").insert()
rt2 = db.RecordType("TestRT2").insert()
p1 = db.Property("TestProp1", datatype=db.TEXT).insert()
p2 = db.Property("TestProp2", datatype=db.TEXT).insert()
# assumptions
assert rt1.id < rt2.id
assert rt2.id < p1.id
assert p1.id < p2.id
# actual testing
assert db.execute_query("FIND RECORDTYPE WITH THE SMALLEST ID", unique=True).id == rt1.id
assert db.execute_query("FIND RECORDTYPE WITH THE GREATEST ID", unique=True).id == rt2.id
assert db.execute_query("FIND PROPERTY WITH THE SMALLEST ID", unique=True).id == p1.id
assert db.execute_query("FIND PROPERTY WITH THE GREATEST ID", unique=True).id == p2.id
assert db.execute_query("FIND ENTITY WITH THE SMALLEST ID", unique=True).id == rt1.id
assert db.execute_query("FIND ENTITY WITH THE GREATEST ID", unique=True).id == p2.id
def test_find_id():
"""See also: https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/issues/323"""
rt1 = db.RecordType("TestRT1").insert()
rt2 = db.RecordType("TestRT2").insert()
rt3 = db.RecordType("TestRT3").add_parent("TestRT2").add_property("TestRT1").insert()
assert db.execute_query("FIND TestRT1", unique=True).id == rt1.id
assert db.execute_query(f"FIND {rt1.id}", unique=True).id == rt1.id
assert set([e.id for e in db.execute_query("FIND TestRT2")]) == set([rt2.id, rt3.id])
assert db.execute_query("FIND TestRT2 WITH TestRT1", unique=True).id == rt3.id
assert db.execute_query("FIND TestRT3 WITH TestRT1", unique=True).id == rt3.id
assert db.execute_query(f"FIND {rt2.id} WITH TestRT1", unique=True).id == rt3.id
assert db.execute_query(f"FIND {rt3.id} WITH TestRT1", unique=True).id == rt3.id
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment