Spaces:
Sleeping
Sleeping
| """Tests for export eligibility and export policy.""" | |
| from __future__ import annotations | |
| from src.app.domain.models import ( | |
| AltoReadiness, | |
| CanonicalDocument, | |
| EvidenceType, | |
| Geometry, | |
| GeometryStatus, | |
| Page, | |
| PageXmlReadiness, | |
| Provenance, | |
| ReadinessLevel, | |
| Source, | |
| TextLine, | |
| TextRegion, | |
| Word, | |
| ) | |
| from src.app.domain.models.status import InputType | |
| from src.app.policies.document_policy import strict_policy | |
| from src.app.policies.export_policy import check_alto_export, check_page_export | |
| from src.app.validators.export_eligibility_validator import compute_export_eligibility | |
| def _prov() -> Provenance: | |
| return Provenance( | |
| provider="test", adapter="v1", source_ref="$", | |
| evidence_type=EvidenceType.PROVIDER_NATIVE, | |
| ) | |
| def _geo() -> Geometry: | |
| return Geometry(bbox=(10, 10, 100, 30), status=GeometryStatus.EXACT) | |
| def _complete_doc() -> CanonicalDocument: | |
| return CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page( | |
| id="p1", page_index=0, width=2480, height=3508, | |
| alto_readiness=AltoReadiness(level=ReadinessLevel.FULL), | |
| page_readiness=PageXmlReadiness(level=ReadinessLevel.FULL), | |
| reading_order=["tb1"], | |
| text_regions=[ | |
| TextRegion(id="tb1", geometry=_geo(), provenance=_prov(), | |
| lines=[TextLine(id="tl1", geometry=_geo(), provenance=_prov(), | |
| words=[Word(id="w1", text="Hello", geometry=_geo(), | |
| provenance=_prov(), confidence=0.95)])])], | |
| )], | |
| ) | |
| def _empty_doc() -> CanonicalDocument: | |
| return CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page(id="p1", page_index=0, width=2480, height=3508)], | |
| ) | |
| class TestExportEligibility: | |
| def test_complete_doc_full_eligible(self) -> None: | |
| doc = _complete_doc() | |
| elig = compute_export_eligibility(doc) | |
| assert elig.alto_export == ReadinessLevel.FULL | |
| assert elig.page_export == ReadinessLevel.FULL | |
| assert elig.viewer_render == ReadinessLevel.FULL | |
| def test_empty_doc_none(self) -> None: | |
| doc = _empty_doc() | |
| elig = compute_export_eligibility(doc) | |
| assert elig.alto_export == ReadinessLevel.NONE | |
| assert elig.page_export == ReadinessLevel.NONE | |
| assert elig.viewer_render == ReadinessLevel.NONE | |
| def test_strict_policy_downgrades_partial(self) -> None: | |
| # A doc with missing confidence → partial | |
| doc = CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page( | |
| id="p1", page_index=0, width=2480, height=3508, | |
| reading_order=["tb1"], | |
| text_regions=[ | |
| TextRegion(id="tb1", geometry=_geo(), provenance=_prov(), | |
| lines=[TextLine(id="tl1", geometry=_geo(), provenance=_prov(), | |
| words=[Word(id="w1", text="Hello", geometry=_geo(), | |
| provenance=_prov(), confidence=None)])])], | |
| )], | |
| ) | |
| policy = strict_policy() | |
| elig = compute_export_eligibility(doc, policy) | |
| # Strict mode downgrades partial to none | |
| assert elig.alto_export == ReadinessLevel.NONE | |
| def test_viewer_degraded_for_regions_without_exports(self) -> None: | |
| # Doc with unknown word geometry — ALTO none, but viewer shows something | |
| doc = CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page( | |
| id="p1", page_index=0, width=2480, height=3508, | |
| text_regions=[ | |
| TextRegion(id="tb1", geometry=_geo(), provenance=_prov(), | |
| lines=[TextLine(id="tl1", geometry=_geo(), provenance=_prov(), | |
| words=[Word(id="w1", text="Hello", | |
| geometry=Geometry(bbox=(10, 10, 100, 30), | |
| status=GeometryStatus.UNKNOWN), | |
| provenance=_prov())])])], | |
| )], | |
| ) | |
| elig = compute_export_eligibility(doc) | |
| # ALTO is none (missing word geo), but viewer can show regions | |
| assert elig.viewer_render in (ReadinessLevel.FULL, ReadinessLevel.DEGRADED) | |
| class TestExportPolicy: | |
| def test_alto_allowed_full(self) -> None: | |
| doc = _complete_doc() | |
| elig = compute_export_eligibility(doc) | |
| decision = check_alto_export(elig) | |
| assert decision.allowed is True | |
| assert decision.reason == "OK" | |
| def test_alto_refused_none(self) -> None: | |
| doc = _empty_doc() | |
| elig = compute_export_eligibility(doc) | |
| decision = check_alto_export(elig) | |
| assert decision.allowed is False | |
| assert "not possible" in decision.reason | |
| def test_alto_partial_default_allowed(self) -> None: | |
| doc = CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page( | |
| id="p1", page_index=0, width=2480, height=3508, | |
| reading_order=["tb1"], | |
| text_regions=[ | |
| TextRegion(id="tb1", geometry=_geo(), provenance=_prov(), | |
| lines=[TextLine(id="tl1", geometry=_geo(), provenance=_prov(), | |
| words=[Word(id="w1", text="Hello", geometry=_geo(), | |
| provenance=_prov(), confidence=None)])])], | |
| )], | |
| ) | |
| elig = compute_export_eligibility(doc) | |
| decision = check_alto_export(elig) | |
| assert decision.allowed is True | |
| def test_alto_partial_strict_refused(self) -> None: | |
| doc = CanonicalDocument( | |
| document_id="test", | |
| source=Source(input_type=InputType.IMAGE), | |
| pages=[Page( | |
| id="p1", page_index=0, width=2480, height=3508, | |
| reading_order=["tb1"], | |
| text_regions=[ | |
| TextRegion(id="tb1", geometry=_geo(), provenance=_prov(), | |
| lines=[TextLine(id="tl1", geometry=_geo(), provenance=_prov(), | |
| words=[Word(id="w1", text="Hello", geometry=_geo(), | |
| provenance=_prov(), confidence=None)])])], | |
| )], | |
| ) | |
| policy = strict_policy() | |
| elig = compute_export_eligibility(doc, policy) | |
| decision = check_alto_export(elig, policy) | |
| assert decision.allowed is False | |
| def test_page_allowed_full(self) -> None: | |
| doc = _complete_doc() | |
| elig = compute_export_eligibility(doc) | |
| decision = check_page_export(elig) | |
| assert decision.allowed is True | |
| def test_page_refused_none(self) -> None: | |
| doc = _empty_doc() | |
| elig = compute_export_eligibility(doc) | |
| decision = check_page_export(elig) | |
| assert decision.allowed is False | |