XmLLM / tests /unit /test_document_policy.py
Claude
Sprint 4: validation layer and document policy
e2ec8a2 unverified
Raw
History Blame Contribute Delete
3.21 kB
"""Tests for document policy and validation report."""
from __future__ import annotations
from src.app.domain.errors import Severity, ValidationEntry, ValidationReport
from src.app.policies.document_policy import (
DocumentPolicy,
PolicyMode,
permissive_policy,
strict_policy,
)
class TestDocumentPolicy:
def test_default_is_standard(self) -> None:
p = DocumentPolicy()
assert p.mode == PolicyMode.STANDARD
assert not p.strict_mode
def test_strict(self) -> None:
p = strict_policy()
assert p.strict_mode
assert not p.allow_bbox_inference
assert not p.allow_partial_alto
def test_permissive(self) -> None:
p = permissive_policy()
assert p.mode == PolicyMode.PERMISSIVE
assert p.allow_bbox_inference
assert p.bbox_containment_tolerance == 10.0
def test_never_allows_text_invention(self) -> None:
for factory in [DocumentPolicy, strict_policy, permissive_policy]:
p = factory()
assert p.allow_text_invention is False
def test_never_allows_bbox_invention(self) -> None:
for factory in [DocumentPolicy, strict_policy, permissive_policy]:
p = factory()
assert p.allow_bbox_invention is False
def test_frozen(self) -> None:
import pytest
from pydantic import ValidationError
p = DocumentPolicy()
with pytest.raises(ValidationError):
p.mode = PolicyMode.STRICT # type: ignore[misc]
class TestValidationReport:
def test_empty_is_valid(self) -> None:
r = ValidationReport()
assert r.is_valid
assert r.error_count == 0
assert r.warning_count == 0
def test_with_error(self) -> None:
r = ValidationReport()
r.add(ValidationEntry(
validator="test", severity=Severity.ERROR,
path="pages[0]", message="bad",
))
assert not r.is_valid
assert r.error_count == 1
def test_warnings_dont_invalidate(self) -> None:
r = ValidationReport()
r.add(ValidationEntry(
validator="test", severity=Severity.WARNING,
path="pages[0]", message="meh",
))
assert r.is_valid
assert r.warning_count == 1
def test_merge(self) -> None:
r1 = ValidationReport()
r1.add(ValidationEntry(
validator="a", severity=Severity.ERROR,
path="x", message="e1",
))
r2 = ValidationReport()
r2.add(ValidationEntry(
validator="b", severity=Severity.WARNING,
path="y", message="w1",
))
r1.merge(r2)
assert r1.error_count == 1
assert r1.warning_count == 1
assert len(r1.entries) == 2
def test_errors_property(self) -> None:
r = ValidationReport()
r.add(ValidationEntry(validator="a", severity=Severity.ERROR, path="x", message="e"))
r.add(ValidationEntry(validator="b", severity=Severity.WARNING, path="y", message="w"))
r.add(ValidationEntry(validator="c", severity=Severity.INFO, path="z", message="i"))
assert len(r.errors) == 1
assert len(r.warnings) == 1