Source code for behave_kit.assertions.reporter
"""Formatting of collected soft-assertion failures into legible output."""
from __future__ import annotations
from dataclasses import dataclass, field
_UNSET = object()
[docs]
@dataclass(frozen=True)
class SoftFailure:
"""A single soft assertion failure."""
message: str
expected: object = _UNSET
actual: object = _UNSET
@property
def has_values(self) -> bool:
"""Whether at least one of ``expected`` or ``actual`` was supplied."""
return self.expected is not _UNSET or self.actual is not _UNSET
[docs]
@dataclass(frozen=True)
class SoftAssertReport:
"""Aggregated report of every soft assertion failure in a scenario."""
failures: list[SoftFailure] = field(default_factory=list)
@property
def failure_count(self) -> int:
"""Number of recorded soft assertion failures."""
return len(self.failures)
@property
def has_failures(self) -> bool:
"""Whether any soft assertion failure has been recorded."""
return bool(self.failures)
def __str__(self) -> str:
if not self.failures:
return "Soft assertion failures (0): none"
lines = [f"Soft assertion failures ({len(self.failures)}):"]
for index, failure in enumerate(self.failures, start=1):
lines.append(f" {index}. {failure.message}")
if failure.has_values:
expected = None if failure.expected is _UNSET else failure.expected
actual = None if failure.actual is _UNSET else failure.actual
lines.append(f" Expected: {expected!r}, Got: {actual!r}")
return "\n".join(lines)