"""Boundary tests for pure WebSocket protocol helpers.""" from __future__ import annotations import pytest from nanobot.channels.websocket import ( _extract_data_url_mime, _is_valid_chat_id, _parse_envelope, ) def test_chat_id_validator_accepts_only_compact_capability_keys() -> None: valid = [ "a", "A-Z_09:chat-id", "x" * 64, ] invalid = [ "", "x" * 65, "../escape", "chat/id", "chat id", "chat\nid", None, 123, ] for value in valid: assert _is_valid_chat_id(value), value for value in invalid: assert not _is_valid_chat_id(value), repr(value) @pytest.mark.parametrize( ("raw", "expected_type"), [ ("plain text", None), ("{not json", None), ("[]", None), ("{}", None), ('{"type": 42}', None), ('{"type": "message", "content": "hi"}', "message"), (' {"type": "new_chat"} ', "new_chat"), ], ) def test_parse_envelope_only_accepts_typed_json_objects( raw: str, expected_type: str | None, ) -> None: parsed = _parse_envelope(raw) if expected_type is None: assert parsed is None else: assert parsed is not None assert parsed["type"] == expected_type @pytest.mark.parametrize( ("url", "expected"), [ ("data:image/png;base64,AAAA", "image/png"), ("data:IMAGE/JPEG;charset=utf-8;base64,AAAA", "image/jpeg"), ("data:video/webm;codecs=vp9;base64,AAAA", "video/webm"), ("data:image/svg+xml;base64,AAAA", "image/svg+xml"), ("data:image/png,AAAA", None), ("data:;base64,AAAA", None), ("https://example.invalid/image.png", None), ], ) def test_extract_data_url_mime_normalizes_only_base64_data_urls( url: str, expected: str | None, ) -> None: assert _extract_data_url_mime(url) == expected