diff --git a/CHANGELOG.md b/CHANGELOG.md index aca13b7ec56f0726ccf0f85861c7319366576656..03f0808a1135b2d2e693dddaac08412f9c2bd5bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added (for new features) +* Test for [caosdb-pylib#89](https://gitlab.com/linkahead/linkahead-pylib/-/issues/89) +* Test for [caosdb-pylib#103](https://gitlab.com/linkahead/linkahead-pylib/-/issues/103) * Tests for entity state [caosdb-server!62](https://gitlab.com/caosdb/caosdb-server/-/merge_requests/62) * Tests for version history * Tests for inheritance bug (caosdb/caosdb-server!54) diff --git a/tests/test_issues_pylib.py b/tests/test_issues_pylib.py index ec9e873c7b8cd2375570021672bb8eb2bc1ca5c3..94ffa891748a575bd810fb6ac00be4c09f3effd8 100644 --- a/tests/test_issues_pylib.py +++ b/tests/test_issues_pylib.py @@ -28,8 +28,10 @@ import math import os import tempfile import time +import warnings import linkahead as db +import linkahead.common.utils import pytest from linkahead import administration as admin @@ -66,6 +68,50 @@ def teardown_function(function): # ########################### Issue tests start here ##################### +def test_gitlab_com_89(): + """ + Test that after retrieving an entity from the server, generating an xml + string and subsequently recreating the container from xml does not + generate any errors. + + See https://gitlab.com/linkahead/linkahead-pylib/-/issues/89 and + https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/81 + """ + # We need a container generated with data from the server + rt = db.RecordType(name="TestType") + rt.insert() + container = db.execute_query("FIND RECORDTYPE *") + + # With this container, to_xml, xml2str, and from_xml should not generate + # warnings - the simplefilter means that any warning fails the test + with warnings.catch_warnings(): + warnings.simplefilter("error") + xml_str = linkahead.common.utils.xml2str(container.to_xml()) + cont_from_xml = db.Container.from_xml(xml_str) + assert len(cont_from_xml) == len(container) + assert cont_from_xml[0].name == rt.name + + +def test_gitlab_com_103(): + """ + Test that after causing an UriTooLong error the used auth_token + is still valid. + + See https://gitlab.com/linkahead/linkahead-pylib/-/issues/103 and + https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/82 + """ + # Configure connection to use auth_token + auth_token = db.get_connection()._authenticator.auth_token + db.configure_connection(auth_token=auth_token) + + # Trigger UriTooLong error and check correct error thrown + c = db.Container() + c.extend([db.Record(id=i) for i in range(1000, 5000)]) + with pytest.raises(db.exceptions.TransactionError) as te: + c.retrieve() + assert "authentication token" not in str(te) + + # @pytest.mark.xfail(reason="Entities with many, long, properties: " # "https://gitlab.com/linkahead/linkahead-pylib/-/issues/108") def test_gitlab_com_108(): diff --git a/tests/test_server_side_scripting.py b/tests/test_server_side_scripting.py index 1ad258ea335a1ab7a35d7ab2b1a5880bfb0c56de..e0f60b1f6dae66800adf7652dcd703293261226e 100644 --- a/tests/test_server_side_scripting.py +++ b/tests/test_server_side_scripting.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # # ** header v3.0 -# This file is a part of the CaosDB Project. +# This file is a part of the LinkAhead Project. # # Copyright (C) 2018 Research Group Biomedical Physics, # Max-Planck-Institute for Dynamics and Self-Organization Göttingen @@ -33,13 +33,13 @@ import ssl import tempfile from http.client import HTTPSConnection -from caosdb import Info, RecordType -from caosdb import administration as admin -from caosdb import execute_query, get_config, get_connection -from caosdb.connection.encode import MultipartParam, multipart_encode -from caosdb.connection.utils import urlencode, urlparse -from caosdb.exceptions import HTTPClientError, HTTPResourceNotFoundError -from caosdb.utils.server_side_scripting import run_server_side_script +from linkahead import Info, RecordType +from linkahead import administration as admin +from linkahead import execute_query, get_config, get_connection +from linkahead.connection.encode import MultipartParam, multipart_encode +from linkahead.connection.utils import urlencode, urlparse +from linkahead.exceptions import HTTPClientError, HTTPResourceNotFoundError +from linkahead.utils.server_side_scripting import run_server_side_script from lxml import etree from pytest import mark, raises @@ -142,6 +142,29 @@ def teardown_module(): clean_database() +def request(method, headers, path, body=None): + """Connect without auth-token. + + This is clumsy because the pylib is not intended to be used as anonymous user. + """ + context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) + context.verify_mode = ssl.CERT_REQUIRED + + if hasattr(context, "check_hostname"): + context.check_hostname = True + context.load_verify_locations(get_config().get("Connection", "cacert")) + + url = get_config().get("Connection", "url") + fullurl = urlparse(url) + + http_con = HTTPSConnection( + str(fullurl.netloc), timeout=200, context=context) + http_con.request(method=method, headers=headers, url=str(fullurl.path) + + path, body=body) + + return http_con.getresponse() + + def test_call_script_non_existing(): form = dict() form["call"] = "non_existing_script" @@ -355,28 +378,6 @@ def test_call_as_anonymous_with_administration_role(): assert "exception" not in diagnostics["caosdb"] -def request(method, headers, path, body=None): - """ Connect without auth-token. This is clumsy, bc the pylib is not - intended to be used as anonymous user. - """ - context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) - context.verify_mode = ssl.CERT_REQUIRED - - if hasattr(context, "check_hostname"): - context.check_hostname = True - context.load_verify_locations(get_config().get("Connection", "cacert")) - - url = get_config().get("Connection", "url") - fullurl = urlparse(url) - - http_con = HTTPSConnection( - str(fullurl.netloc), timeout=200, context=context) - http_con.request(method=method, headers=headers, url=str(fullurl.path) + - path, body=body) - - return http_con.getresponse() - - def test_anonymous_script_calling_not_permitted(): form = dict() form["call"] = "ok"