27 lines
825 B
Python
27 lines
825 B
Python
"""
|
|
Testing utilities for use in integration tests, not unit tests or non-test code.
|
|
Provides better error behavior than Python's `assert` statement.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import contextlib
|
|
import typing as t
|
|
|
|
|
|
class _Checker:
|
|
@staticmethod
|
|
def check(value: object, msg: str | None = 'Value is not truthy.') -> None:
|
|
"""Raise an `AssertionError` if the given `value` is not truthy."""
|
|
if not value:
|
|
raise AssertionError(msg)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def hard_fail_context(msg: str) -> t.Generator[_Checker]:
|
|
"""Enter a context which converts all exceptions to `BaseException` and provides a `Checker` instance for making assertions."""
|
|
try:
|
|
yield _Checker()
|
|
except BaseException as ex:
|
|
raise BaseException(f"Hard failure: {msg}") from ex
|