Skip to content
Snippets Groups Projects
Commit 39e2a6c8 authored by Florian Spreckelsen's avatar Florian Spreckelsen
Browse files

TST: Add Sketch of unit tests for the new error handling

The sketched tests introduce test cases and explain the desired
behaviour.
parent 559593c7
No related branches found
No related tags found
No related merge requests found
# -*- encoding: utf-8 -*-
#
# ** header v3.0
# This file is a part of the CaosDB 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 new (as of June 2020) error handling. All errors should
be TransactionErrors at first which may have one or more level of
children.
"""
import caosdb as db
from caosdb.common.models import raise_errors
# TODO: Import the relevant error classes once they have been finalized.
from caosdb.exceptions import (EntityDoesNotExistError,
EntityHasNoDatatypeError,
TransactionError)
from pytest import raises
# #################### Single Error Tests ####################
def _add_error_message_to_entity(entity, code, description="Error message"):
"""Attach error message with code and description to entity"""
message = db.Message(type="Error", code=code,
description=description)
entity.add_message(message)
return enetity
def test_has_no_datatype_error():
"""Code 110; property without datatype"""
code = 110
prop = _add_error_message_to_entity(db.Property(name="TestProp"),
code)
with raises(TransactionError) as e:
raise_errors(prop)
# There should be exactly one child
assert len(e.errors) == 1
err = e.errors[0]
# check type and entity of only child
assert isinstance(err, EntityHasNoDatatypeError)
assert err.entity.name == prop.name
def test_entity_does_not_exist_error():
"""Code 101; entity does not exist"""
code = 101
ent = _add_error_message_to_entity(db.Entity(name="TestEnt"),
code)
db.Property(name="TestProp"),
code)
with raises(TransactionError) as e:
raise_errors(ent)
# There should be exactly one child
assert len(e.errors) == 1
err = e.errors[0]
# check type and entity of only child
assert isinstance(err, EntityDoesNotExistError)
assert err.entity.name == ent.name
# TODO: remaining single error tests
def test_entity_error():
"""Code 0; most basic."""
def test_unique_names_error():
"""Code 152; name is not unique"""
def test_authorization_exception():
"""Code 403; transaction not allowed"""
# #################### Children with children ####################
def test_unqualified_parents_error():
"""Code 116; parent does not exist"""
code = 116
entity_does_not_exist_code = 101
parent = _add_error_message_to_entity(
db.RecordType(name="TestParent"),
entity_does_not_exist_code)
rec = _add_error_message_to_entity(db.Record(name="TestRecord"),
code)
rec.add_parent(parent)
with raises(TransactionError) as e:
raise_errors(rec)
# TODO: Both direct and indirect children should be in the errors
# list, the only direct child is the UnqualifiedParentsError with
# entity rec and one child of its own; the EntityDoesNotExistError
# with entity parent.
def test_unqualified_properties_error():
"""Code 114; properties do not exist or have wrong data types or
values.
"""
code = 114
# TODO: One record with two properties; one doesn't exist (code
# 101), the other has a wrong value (EntityError, code 0). Then
# check whether all levels are in order.
# #################### Multiple errors ####################
def test_parent_and_properties_errors():
"""Record with UnqualifiedParentsError and UnqualifiedPropertiesError,
and corresponding parent and properties with their errors as
above. Test whether all levels are in order.
"""
# TODO: record with code 114 and 116, properties with 101 and 0,
# parent with 101
def test_container_with_faulty_elements():
"""Container with valid and invalid entities. All faulty entities have
to be reflected correctly in the errors list of the
TransactionError raised by the container.
"""
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment