File size: 3,369 Bytes
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
"""Tests for the schema validator."""

from __future__ import annotations

from src.app.validators.schema_validator import validate_schema


class TestSchemaValidator:
    def test_valid_document(self) -> None:
        data = {
            "schema_version": "1.0.0",
            "document_id": "doc1",
            "source": {"input_type": "image"},
            "pages": [{
                "id": "p1",
                "page_index": 0,
                "width": 2480,
                "height": 3508,
                "text_regions": [{
                    "id": "tb1",
                    "geometry": {"bbox": [100, 200, 300, 50], "status": "exact"},
                    "provenance": {
                        "provider": "test", "adapter": "v1",
                        "source_ref": "$", "evidence_type": "provider_native",
                        "derived_from": [],
                    },
                    "lines": [{
                        "id": "tl1",
                        "geometry": {"bbox": [100, 200, 300, 50], "status": "exact"},
                        "provenance": {
                            "provider": "test", "adapter": "v1",
                            "source_ref": "$", "evidence_type": "provider_native",
                            "derived_from": [],
                        },
                        "words": [{
                            "id": "w1",
                            "text": "Hello",
                            "geometry": {"bbox": [100, 200, 50, 30], "status": "exact"},
                            "provenance": {
                                "provider": "test", "adapter": "v1",
                                "source_ref": "$", "evidence_type": "provider_native",
                                "derived_from": [],
                            },
                        }],
                    }],
                }],
            }],
        }
        doc, report = validate_schema(data)
        assert doc is not None
        assert report.is_valid

    def test_missing_required_field(self) -> None:
        data = {
            "source": {"input_type": "image"},
            "pages": [],
        }
        doc, report = validate_schema(data)
        assert doc is None
        assert not report.is_valid
        assert report.error_count > 0

    def test_invalid_schema_version(self) -> None:
        data = {
            "schema_version": "bad",
            "document_id": "doc1",
            "source": {"input_type": "image"},
            "pages": [{"id": "p1", "page_index": 0, "width": 100, "height": 100}],
        }
        doc, report = validate_schema(data)
        assert doc is None
        assert not report.is_valid

    def test_empty_pages(self) -> None:
        data = {
            "document_id": "doc1",
            "source": {"input_type": "image"},
            "pages": [],
        }
        doc, report = validate_schema(data)
        assert doc is None
        assert report.error_count > 0

    def test_error_paths_populated(self) -> None:
        data = {
            "document_id": "",
            "source": {"input_type": "image"},
            "pages": [],
        }
        doc, report = validate_schema(data)
        assert doc is None
        for entry in report.errors:
            assert entry.path
            assert entry.message
            assert entry.validator == "schema"