Skip to content
Snippets Groups Projects
Select Git revision
  • aea0753beec62733ad69b9345b6d9919bc13c48b
  • main default protected
  • f-yaml-parser-enums
  • dev protected
  • f-fix-paths
  • f-fix-validate-to-dict
  • f-labfolder-converter
  • f-state-machine-script
  • f-xlsx-converter-warnings-errors
  • f-rename
  • f-extra-deps
  • f-more-jsonschema-export
  • f-henrik
  • f-fix-89
  • f-trigger-advanced-user-tools
  • f-real-rename-test
  • f-linkahead-rename
  • f-register-integrationtests
  • f-fix-id
  • f-h5-files
  • f-json-schema
  • v0.14.0
  • v0.13.0
  • v0.12.0
  • v0.11.0
  • v0.10.0-numpy2
  • v0.10.0
  • v0.9.0
  • v0.8.0
  • v0.7.0
  • v0.6.1
  • v0.6.0
  • v0.5.0
  • v0.4.1
  • v0.4.0
  • v0.3.1
  • v0.3.0
37 results

test_datamodel_problems.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    test_datamodel_problems.py 4.01 KiB
    #!/usr/bin/env python
    # encoding: utf-8
    #
    # ** header v3.0
    # This file is a part of the LinkAhead Project.
    #
    # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
    # Copyright (C) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
    #
    # 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
    """Test the error handling in datamodel_problems.py with simple
    insertions. A test using a full-grown crawler finding datamodel errors
    during crawling that tests the integrations of the DataModelProblems
    class in crawler.py and cfood.py can be found in full-tests.
    
    """
    import caosdb as db
    import pytest
    from caosadvancedtools.datamodel_problems import DataModelProblems
    from caosdb.exceptions import (TransactionError,
                                   UnqualifiedParentsError,
                                   UnqualifiedPropertiesError)
    
    
    def setup_module():
        """Clear problem sets and delete possible test entities"""
        DataModelProblems.missing.clear()
        try:
            db.execute_query("FIND Entity Test*").delete()
        except Exception as delete_exc:
            print(delete_exc)
    
    
    @pytest.fixture(autouse=True)
    def setup():
        """Same as module setup."""
        setup_module()
        yield None
        setup_module()
    
    
    def teardown_module():
        """Clear and delete again."""
        setup_module()
    
    
    def _insert_and_evaluate_exception(ent):
        try:
            ent.insert()
        except Exception as e:
            DataModelProblems.evaluate_exception(e)
    
    
    def test_missing_parent():
        """Test if missing RecordType is in datamodel problems."""
        missing_name = "TestType"
        rec = db.Record(name="TestRecord")
        rec.add_parent(name=missing_name)
        with pytest.raises(TransactionError) as te:
            _insert_and_evaluate_exception(rec)
        assert te.value.has_error(UnqualifiedParentsError)
        assert missing_name in DataModelProblems.missing
    
    
    def test_missing_property():
        """Test if missing Property is in datamodel problems."""
        missing_name = "TestProp"
        rec = db.Record(name="TestRecord").add_property(name=missing_name)
        with pytest.raises(TransactionError) as te:
            _insert_and_evaluate_exception(rec)
        assert te.value.has_error(UnqualifiedPropertiesError)
        assert missing_name in DataModelProblems.missing
    
    
    def test_missing_property_existing_type():
        """Test if missing Property is in datamodel problems but existing
        RecordType is not.
    
        """
        missing_prop = "TestProp"
        existing_rt = "TestType"
        db.RecordType(name=existing_rt).insert()
        rec = db.Record(name="TestRecord").add_parent(name=existing_rt)
        rec.add_property(name=missing_prop)
        with pytest.raises(TransactionError) as te:
            _insert_and_evaluate_exception(rec)
        assert te.value.has_error(UnqualifiedPropertiesError)
        assert missing_prop in DataModelProblems.missing
        assert existing_rt not in DataModelProblems.missing
    
    
    def test_wrong_property_value():
        """An error due to a wrong value (type) is no data model problem per
        se
    
        """
        rt_name = "TestType"
        rt = db.RecordType(name=rt_name).insert()
        prop_name = "TestProp"
        prop_dtype = db.DOUBLE
        prop = db.Property(name=prop_name, datatype=prop_dtype).insert()
        rec = db.Record(name="TestRecord").add_parent(
            name=rt_name).add_property(name=prop_name, value="bla")
        with pytest.raises(TransactionError) as te:
            _insert_and_evaluate_exception(rec)
        assert te.value.has_error(UnqualifiedPropertiesError)
        # Should be empty
        assert not DataModelProblems.missing