70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
|
|
"""Pure, offline tests for target_revenue.breach_record._validate
|
||
|
|
(WP-0006-T09). No Docker/Postgres required — persistence/publication
|
||
|
|
round-trips are covered by the Docker-gated tests in
|
||
|
|
tests/test_ledger_hosting.py.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from target_revenue import breach_record
|
||
|
|
|
||
|
|
|
||
|
|
def _base_event(**overrides):
|
||
|
|
event = {
|
||
|
|
"id": "trsl:breach:example0010001",
|
||
|
|
"case_id": "trsl:case:example001",
|
||
|
|
"event_type": "alleged",
|
||
|
|
"category": "unauthorized-commercial-use",
|
||
|
|
"event_at": "2026-08-01T00:00:00Z",
|
||
|
|
}
|
||
|
|
event.update(overrides)
|
||
|
|
return event
|
||
|
|
|
||
|
|
|
||
|
|
def test_valid_anonymized_alleged_event_has_no_errors():
|
||
|
|
assert breach_record._validate(_base_event()) == []
|
||
|
|
|
||
|
|
|
||
|
|
def test_missing_required_field_rejected():
|
||
|
|
event = _base_event()
|
||
|
|
del event["category"]
|
||
|
|
errors = breach_record._validate(event)
|
||
|
|
assert any("category" in e for e in errors)
|
||
|
|
|
||
|
|
|
||
|
|
def test_unknown_event_type_rejected():
|
||
|
|
errors = breach_record._validate(_base_event(event_type="dismissed"))
|
||
|
|
assert any("event_type" in e for e in errors)
|
||
|
|
|
||
|
|
|
||
|
|
def test_named_disclosure_requires_holder_and_authorization():
|
||
|
|
errors = breach_record._validate(_base_event(anonymized=False))
|
||
|
|
assert any("named_entitlement_holder" in e for e in errors)
|
||
|
|
assert any("named_disclosure_authorized_under_cua" in e for e in errors)
|
||
|
|
|
||
|
|
|
||
|
|
def test_named_disclosure_with_holder_but_no_authorization_still_rejected():
|
||
|
|
errors = breach_record._validate(
|
||
|
|
_base_event(anonymized=False, named_entitlement_holder="Acme Corp")
|
||
|
|
)
|
||
|
|
assert any("named_disclosure_authorized_under_cua" in e for e in errors)
|
||
|
|
|
||
|
|
|
||
|
|
def test_named_disclosure_with_holder_and_authorization_accepted():
|
||
|
|
errors = breach_record._validate(
|
||
|
|
_base_event(
|
||
|
|
anonymized=False,
|
||
|
|
named_entitlement_holder="Acme Corp",
|
||
|
|
named_disclosure_authorized_under_cua=True,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
assert errors == []
|
||
|
|
|
||
|
|
|
||
|
|
def test_anonymized_event_with_holder_set_rejected():
|
||
|
|
"""A caller must not be able to sneak a name in while anonymized=True."""
|
||
|
|
errors = breach_record._validate(
|
||
|
|
_base_event(anonymized=True, named_entitlement_holder="Acme Corp")
|
||
|
|
)
|
||
|
|
assert any("must not be set" in e for e in errors)
|