ForcePilot/backend/test/unit/channels/adapters/test_masking_adapter.py

132 lines
3.6 KiB
Python
Raw Normal View History

"""yuxi.channels.adapters.masking_adapter 单元测试。
覆盖 ``MaskingAdapter`` ``mask_full`` / ``mask_partial`` /
``is_sensitive_key`` 方法使用 ``patch`` 替换 ``CryptoHelper``
不依赖真实加解密配置
"""
from __future__ import annotations
from unittest.mock import MagicMock, patch
import pytest
from yuxi.channels.adapters.masking_adapter import MaskingAdapter
pytestmark = pytest.mark.unit
def _make_helper() -> MagicMock:
"""构造 CryptoHelper 桩。"""
helper = MagicMock()
helper.mask_full = MagicMock(return_value="***")
helper.mask_partial = MagicMock(return_value="abcd***")
helper.is_sensitive_key = MagicMock(return_value=True)
return helper
@pytest.mark.unit
class TestMaskingAdapterConstruction:
def test_init_loads_crypto_helper(self):
# Arrange
helper = _make_helper()
# Act
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Assert
assert adapter._helper is helper
@pytest.mark.unit
class TestMaskingAdapterMaskFull:
def test_mask_full_delegates_to_helper(self):
# Arrange
helper = _make_helper()
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Act
result = adapter.mask_full("secret-value")
# Assert
helper.mask_full.assert_called_once_with("secret-value")
assert result == "***"
def test_mask_full_passes_any_value_type(self):
# Arrange
helper = _make_helper()
helper.mask_full.return_value = {"masked": True}
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Act
result = adapter.mask_full({"key": "value"})
# Assert
helper.mask_full.assert_called_once_with({"key": "value"})
assert result == {"masked": True}
@pytest.mark.unit
class TestMaskingAdapterMaskPartial:
def test_mask_partial_delegates_to_helper(self):
# Arrange
helper = _make_helper()
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Act
result = adapter.mask_partial("token-value")
# Assert
helper.mask_partial.assert_called_once_with("token-value")
assert result == "abcd***"
@pytest.mark.unit
class TestMaskingAdapterIsSensitiveKey:
def test_is_sensitive_key_delegates_to_helper(self):
# Arrange
helper = _make_helper()
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Act
result = adapter.is_sensitive_key("api_key")
# Assert
helper.is_sensitive_key.assert_called_once_with("api_key")
assert result is True
def test_is_sensitive_key_returns_false_for_non_sensitive(self):
# Arrange
helper = _make_helper()
helper.is_sensitive_key.return_value = False
with patch(
"yuxi.channels.adapters.masking_adapter.get_crypto_helper",
return_value=helper,
):
adapter = MaskingAdapter()
# Act
result = adapter.is_sensitive_key("display_name")
# Assert
assert result is False