File size: 3,381 Bytes
41fae03
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Tests for the Provenance model."""

from __future__ import annotations

import pytest
from pydantic import ValidationError
from src.app.domain.models import EvidenceType, Provenance


class TestProvenance:
    def test_valid_native(self) -> None:
        p = Provenance(
            provider="paddleocr-vl",
            adapter="adapter.paddle.v1",
            source_ref="$.pages[0].blocks[0]",
            evidence_type=EvidenceType.PROVIDER_NATIVE,
        )
        assert p.derived_from == []

    def test_valid_derived(self) -> None:
        p = Provenance(
            provider="enricher.polygon_to_bbox",
            adapter="enricher.v1",
            source_ref="tl1",
            evidence_type=EvidenceType.DERIVED,
            derived_from=["tl1"],
        )
        assert p.derived_from == ["tl1"]

    def test_native_with_derived_from_rejected(self) -> None:
        with pytest.raises(ValidationError, match="provider_native.*empty derived_from"):
            Provenance(
                provider="paddle",
                adapter="adapter.v1",
                source_ref="$.x",
                evidence_type=EvidenceType.PROVIDER_NATIVE,
                derived_from=["some_id"],
            )

    def test_empty_provider_rejected(self) -> None:
        with pytest.raises(ValidationError):
            Provenance(
                provider="",
                adapter="adapter.v1",
                source_ref="$.x",
                evidence_type=EvidenceType.PROVIDER_NATIVE,
            )

    def test_empty_adapter_rejected(self) -> None:
        with pytest.raises(ValidationError):
            Provenance(
                provider="paddle",
                adapter="",
                source_ref="$.x",
                evidence_type=EvidenceType.PROVIDER_NATIVE,
            )

    def test_empty_source_ref_rejected(self) -> None:
        with pytest.raises(ValidationError):
            Provenance(
                provider="paddle",
                adapter="adapter.v1",
                source_ref="",
                evidence_type=EvidenceType.PROVIDER_NATIVE,
            )

    def test_repaired_evidence_type(self) -> None:
        p = Provenance(
            provider="bbox_repair",
            adapter="enricher.v1",
            source_ref="w1",
            evidence_type=EvidenceType.REPAIRED,
            derived_from=["w1"],
        )
        assert p.evidence_type == EvidenceType.REPAIRED

    def test_manual_evidence_type(self) -> None:
        p = Provenance(
            provider="manual",
            adapter="manual.v1",
            source_ref="user_correction",
            evidence_type=EvidenceType.MANUAL,
        )
        assert p.evidence_type == EvidenceType.MANUAL

    def test_frozen(self) -> None:
        p = Provenance(
            provider="paddle",
            adapter="v1",
            source_ref="$.x",
            evidence_type=EvidenceType.PROVIDER_NATIVE,
        )
        with pytest.raises(ValidationError):
            p.provider = "other"  # type: ignore[misc]

    def test_json_roundtrip(self) -> None:
        p = Provenance(
            provider="paddleocr-vl",
            adapter="adapter.paddle.v1",
            source_ref="$.pages[0]",
            evidence_type=EvidenceType.PROVIDER_NATIVE,
        )
        data = p.model_dump()
        p2 = Provenance.model_validate(data)
        assert p == p2