33 lines
990 B
Python
33 lines
990 B
Python
|
|
"""Unit tests for kb_mail.text.sanitize_surrogates."""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
from kb_mail.text import sanitize_surrogates
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_none_stays_none():
|
|||
|
|
assert sanitize_surrogates(None) is None
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_plain_ascii_unchanged():
|
|||
|
|
assert sanitize_surrogates("hello") == "hello"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_real_unicode_passes_through():
|
|||
|
|
assert sanitize_surrogates("Kąpała") == "Kąpała"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_lone_surrogate_degraded_and_json_safe():
|
|||
|
|
# A compat32 bytes-parse can leave a lone surrogate (undecodable byte);
|
|||
|
|
# postgres jsonb and json.dumps().encode('utf-8') both reject it.
|
|||
|
|
dirty = "Pr\udce9sent" # 0xe9 smuggled in as a surrogate escape
|
|||
|
|
cleaned = sanitize_surrogates(dirty)
|
|||
|
|
assert cleaned == "Pr?sent"
|
|||
|
|
json.dumps(cleaned, ensure_ascii=False).encode("utf-8") # must not raise
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_replacement_char_preserved():
|
|||
|
|
# U+FFFD is already valid UTF-8 and must survive untouched.
|
|||
|
|
assert sanitize_surrogates("bad<EFBFBD>id") == "bad<EFBFBD>id"
|