File size: 3,732 Bytes
e250098
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from scrub_key import (
    REQUIRED_ITEM_FIELDS,
    build_scrub_key,
    scrub_key_from_json,
    scrub_key_to_json,
    validate_scrub_key,
)


VALID_SYNTHETIC_ROWS = [
    {
        "original_value": "BETROKKENE-TEST-A",
        "placeholder": "[PERSOON_1]",
        "entity_type": "PERSON",
        "type_label": "Naam",
        "source": "detected",
        "review_status": "auto_detected",
        "include": True,
        "timestamp": "2026-06-07T10:00:00Z",
    },
    {
        "Gevonden tekst": "ZAAK-TEST-2026-001",
        "Vervangen door": "[ZAAKNUMMER_1]",
        "entity_type": "LEGAL_REFERENCE",
        "Type gegeven": "Zaaknummer",
        "source": "manual",
        "Status": "Handmatig toegevoegd",
        "Meenemen": "ja",
        "timestamp": "2026-06-07T10:05:00Z",
    },
]


def test_build_scrub_key_creates_valid_key_from_reviewed_rows():
    scrub_key = build_scrub_key(VALID_SYNTHETIC_ROWS, document_label="Dossier voorbeeld")

    assert scrub_key["schema"] == "solidprivacy.scrub_key"
    assert scrub_key["schema_version"] == "1.0"
    assert scrub_key["workflow"] == "Scrub → Review → Scrub Key → AI → Reinsert → Export → Audit"
    assert scrub_key["privacy_model"] == "pseudonymization_not_full_anonymization"
    assert scrub_key["reversible"] is True
    assert scrub_key["document_label"] == "Dossier voorbeeld"
    assert scrub_key["item_count"] == 2
    assert validate_scrub_key(scrub_key) == []


def test_excluded_rows_are_omitted_according_to_spec():
    rows = VALID_SYNTHETIC_ROWS + [
        {
            "original_value": "VOORBEELD-REFERENTIE-UITGESLOTEN",
            "placeholder": "[REFERENTIE_2]",
            "entity_type": "LEGAL_REFERENCE",
            "type_label": "Referentie",
            "source": "candidate",
            "review_status": "needs_review",
            "include": False,
            "timestamp": "2026-06-07T10:10:00Z",
        }
    ]

    scrub_key = build_scrub_key(rows, document_label="Dossier voorbeeld")
    exported_originals = {item["original_value"] for item in scrub_key["items"]}

    assert scrub_key["excluded_rows_policy"] == "omitted"
    assert scrub_key["item_count"] == 2
    assert "VOORBEELD-REFERENTIE-UITGESLOTEN" not in exported_originals


def test_required_fields_exist_on_each_mapping_item():
    scrub_key = build_scrub_key(VALID_SYNTHETIC_ROWS, document_label="Dossier voorbeeld")

    for item in scrub_key["items"]:
        assert set(REQUIRED_ITEM_FIELDS).issubset(item.keys())
        assert item["include_state"] == "included"
        assert item["document_label"] == "Dossier voorbeeld"


def test_json_roundtrip_preserves_scrub_key():
    scrub_key = build_scrub_key(VALID_SYNTHETIC_ROWS, document_label="Dossier voorbeeld")

    json_text = scrub_key_to_json(scrub_key)
    loaded = scrub_key_from_json(json_text)

    assert loaded == scrub_key
    assert validate_scrub_key(loaded) == []


def test_validation_catches_missing_required_fields():
    scrub_key = build_scrub_key(VALID_SYNTHETIC_ROWS, document_label="Dossier voorbeeld")
    del scrub_key["items"][0]["placeholder"]
    scrub_key["items"][1]["timestamp"] = ""

    issues = validate_scrub_key(scrub_key)

    assert any("placeholder" in issue for issue in issues)
    assert any("timestamp" in issue for issue in issues)


def test_examples_use_synthetic_dutch_legal_values_only():
    scrub_key = build_scrub_key(VALID_SYNTHETIC_ROWS, document_label="Dossier voorbeeld")
    json_text = scrub_key_to_json(scrub_key)

    assert "BETROKKENE-TEST-A" in json_text
    assert "ZAAK-TEST-2026-001" in json_text
    assert "Dossier voorbeeld" in json_text
    assert "Jan Jansen" not in json_text
    assert "Piet de Vries" not in json_text