"""Tests for yuxi.agents.backends.sandbox.paths uid sanitize behavior. 服务账号 uid 格式 ``svc:channel:{channel_type}:{account_id}`` 含冒号, paths.py._sanitize_uid 必须将其转义为文件系统安全的路径组件,且与 docker/sandbox_provisioner/app.py 中的转义规则保持一致,确保宿主机 路径与容器挂载路径映射一致。 """ from __future__ import annotations import pytest from yuxi.agents.backends.sandbox.paths import _sanitize_uid def test_sanitize_uid_passes_through_safe_chars() -> None: assert _sanitize_uid("user-1_2") == "user-1_2" assert _sanitize_uid("abcDEF123") == "abcDEF123" def test_sanitize_uid_escapes_colons_in_service_account_uid() -> None: # 服务账号 uid: svc:channel:{channel_type}:{account_id} assert _sanitize_uid("svc:channel:wechat_woc:acc-1") == "svc_channel_wechat_woc_acc-1" assert _sanitize_uid("svc:channel:feishu:host_1_bridge_2") == "svc_channel_feishu_host_1_bridge_2" def test_sanitize_uid_escapes_unsafe_chars_to_underscore() -> None: assert _sanitize_uid("user/name") == "user_name" assert _sanitize_uid("user name") == "user_name" assert _sanitize_uid("user;rm") == "user_rm" assert _sanitize_uid("user.name") == "user_name" # 路径穿越尝试被转义后不再包含 ..(每个非法字符独立替换为 _) assert _sanitize_uid("../user") == "___user" assert _sanitize_uid("..") == "__" def test_sanitize_uid_rejects_empty_or_whitespace() -> None: for value in ["", " ", None]: with pytest.raises(ValueError): _sanitize_uid(value) # type: ignore[arg-type] def test_sanitize_uid_strips_surrounding_whitespace() -> None: assert _sanitize_uid(" user-1 ") == "user-1"