45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
"""公共日志与请求上下文测试。"""
|
|
|
|
from django.test import SimpleTestCase
|
|
from django.urls import reverse
|
|
|
|
from .logging import request_id_context, sanitize_summary
|
|
|
|
|
|
class LoggingTests(SimpleTestCase):
|
|
"""验证敏感摘要递归脱敏,且统计字段不会被误删。"""
|
|
|
|
def test_nested_sensitive_values_are_masked(self):
|
|
result = sanitize_summary(
|
|
{
|
|
"access_token": "secret",
|
|
"nested": {"password": "secret", "token_count": 12},
|
|
"items": [{"api-key": "secret"}],
|
|
}
|
|
)
|
|
self.assertEqual(result["access_token"], "***")
|
|
self.assertEqual(result["nested"]["password"], "***")
|
|
self.assertEqual(result["nested"]["token_count"], 12)
|
|
self.assertEqual(result["items"][0]["api-key"], "***")
|
|
|
|
|
|
class RequestContextMiddlewareTests(SimpleTestCase):
|
|
"""验证入站关联标识的复用、非法值替换和请求结束后的上下文清理。"""
|
|
|
|
def test_valid_request_id_is_returned(self):
|
|
response = self.client.get(
|
|
reverse("accounts:login"),
|
|
headers={"X-Request-ID": "request-123"},
|
|
)
|
|
self.assertEqual(response.headers["X-Request-ID"], "request-123")
|
|
self.assertEqual(request_id_context.get(), "-")
|
|
|
|
def test_invalid_request_id_is_replaced(self):
|
|
response = self.client.get(
|
|
reverse("accounts:login"),
|
|
headers={"X-Request-ID": "invalid value"},
|
|
)
|
|
generated = response.headers["X-Request-ID"]
|
|
self.assertNotEqual(generated, "invalid value")
|
|
self.assertEqual(len(generated), 32)
|