Spaces:
Sleeping
Sleeping
File size: 7,079 Bytes
e2ec8a2 bbbfba8 e2ec8a2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | """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
|