"""Tests for the message-type normalization parser (Task 1.6). The parser must be total — it never raises on weird input — because every incoming WeChat record runs through it during a scrape, and one malformed type code must not abort the whole pull. Unknown codes pass through as ``"unknown"`` so the message is still ingested (and recoverable via ``raw_json``); only the ``-2`` date-divider code maps to ``"divider"``, which the scraper uses as its drop signal. """ from __future__ import annotations import pytest from app.scraper.parsers import normalize_wechat_type @pytest.mark.parametrize( "raw,expected", [ # Documented codes. (1, "text"), (-2, "divider"), # Phase-0 unknown codes — pass through as "unknown", never dropped. (3, "unknown"), # image (34, "unknown"), # voice (49, "unknown"), # file / link / transfer (10000, "unknown"), # Stringified ints (the upstream API may send either form). ("1", "text"), ("-2", "divider"), ("34", "unknown"), ], ) def test_normalize_wechat_type_maps_known_and_unknown(raw, expected): assert normalize_wechat_type(raw) == expected def test_normalize_wechat_type_never_raises(): """Whatever we throw at it, it returns a string — never raises.""" for raw in (None, "", "junk", "1.5", [], {}, object(), float("nan")): out = normalize_wechat_type(raw) assert isinstance(out, str) assert out == "unknown"