Source code for icat_esrf_definitions.tests.assert_raises

from contextlib import contextmanager
from typing import Any
from typing import Dict
from typing import List

import pytest
from pydantic import ValidationError


[docs] @contextmanager def raises_validationerror(errors: List[Dict[str, Any]]): with pytest.raises(ValidationError) as exc_info: yield exc_info raised = exc_info.value.errors() for error in raised: _ = error.pop("url") assert _normalize_errors(raised) == _normalize_errors(errors)
def _normalize_errors(errors: List[Dict[str, Any]]) -> List[Dict[str, Any]]: normalized = [] for err in errors: err = err.copy() if "ctx" in err: ctx = err["ctx"].copy() for k, v in ctx.items(): if isinstance(v, Exception): ctx[k] = _serialize_exception(v) err["ctx"] = ctx normalized.append(err) return normalized def _serialize_exception(exc: Exception) -> dict: data = { "type": type(exc).__name__, "message": str(exc), } if exc.__cause__: data["cause"] = _serialize_exception(exc.__cause__) if exc.__context__ and not exc.__suppress_context__: data["context"] = _serialize_exception(exc.__context__) return data