diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b854effcd1b7e556803b46508ccb110dc3be67d..03f0808a1135b2d2e693dddaac08412f9c2bd5bf 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) +* 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 diff --git a/README.md b/README.md index 8ba5ca8d295f6ee3e594f1faa130cdd25f65d5e2..92e4225585d0ea9ba5dd0b9e4ee1ac7571f4c287 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,14 @@ CaosDB project. which points to the `resources` directory here in the pyinttest repository. You can create a symlink like that with the following command (adapt paths to match your setting): `custom$ ln -s ../../../../caosdb-pyinttest/resources debug-scripting-bin` -- Modify `pycaosdb.ini.template` and save it as `pycaosdb.ini`, taking care of the following points: - - Certificates must be valid and be specified in `pycaosdb.ini`. +- Modify `pylinkahead.ini.template` and save it as `pylinkahead.ini`, taking care of the following points: + - Certificates must be valid and be specified in `pylinkahead.ini`. - Server-side scripting paths must be given, otherwise server-side scripting will be omitted. - - The local path `test_server_side_scripting.bin_dir.local` should point to a - `linkahead-server/scripting/bin` somwhere. - - The remote path `test_server_side_scripting.bin_dir.server` should probably be something like - `/opt/caosdb/git/caosdb-server/scripting/bin-debug`. + - The *local* path `test_server_side_scripting.bin_dir.local` should point to the + `linkahead-server/scripting/bin` directory in linkahead-server sources. + - The *remote* path `test_server_side_scripting.bin_dir.server` should probably be something + like `/opt/caosdb/git/caosdb-server/scripting/bin-debug`. This is the path as seen by the + server (in most cases inside the docker container). - Paths for the file tests must exist, or be creatable by the testing script and the server. - Run the tests with `pytest` or `pytest-3` (depending on your system). - If you want to run just a single test, you can also select a single test file: diff --git a/tests/test_issues_pylib.py b/tests/test_issues_pylib.py index a0db34bb06d2b760e33d522ee807674dab42523c..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,30 @@ 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 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"