scrub / tests /test_scrub_key.py
solidprivacy-nl
Add Scrub Key model tests
e250098
Raw History Blame
3.73 kB
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