test: add log center integration tests
All checks were successful
Build and Deploy Backend / build-and-deploy (push) Successful in 2m0s

This commit is contained in:
zyc 2026-01-30 13:18:56 +08:00
parent d908558f01
commit 416be408fd

163
tests.py
View File

@ -785,3 +785,166 @@ class AuthSeparationTests(APITestCase):
url = '/api/admin/device-types/' url = '/api/admin/device-types/'
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
# ==================== Log Center 集成测试 ====================
class LogCenterIntegrationTests(TestCase):
"""Log Center 错误上报集成测试"""
def test_report_to_log_center_function_exists(self):
"""测试 report_to_log_center 函数存在"""
from utils.exceptions import report_to_log_center
self.assertTrue(callable(report_to_log_center))
def test_report_to_log_center_with_exception(self):
"""测试上报异常到 Log Center"""
from utils.exceptions import report_to_log_center
from unittest.mock import patch, MagicMock
# 创建测试异常
try:
raise ValueError("Test error message")
except ValueError as e:
test_exc = e
# Mock context
mock_request = MagicMock()
mock_request.path = '/api/test/'
mock_request.method = 'GET'
context = {'request': mock_request, 'view': 'TestView'}
# Mock requests.post
with patch('utils.exceptions.requests.post') as mock_post:
with patch('utils.exceptions.LOG_CENTER_ENABLED', True):
report_to_log_center(test_exc, context)
# 等待线程执行(测试中同步执行更可靠)
import time
time.sleep(0.5)
def test_report_payload_structure(self):
"""测试上报 payload 结构正确"""
from utils.exceptions import report_to_log_center
from unittest.mock import patch, MagicMock
import json
captured_payload = None
def capture_post(url, json=None, timeout=None):
nonlocal captured_payload
captured_payload = json
return MagicMock(status_code=200)
try:
raise TypeError("Type mismatch error")
except TypeError as e:
test_exc = e
mock_request = MagicMock()
mock_request.path = '/api/users/me/'
mock_request.method = 'POST'
context = {'request': mock_request, 'view': 'UserView'}
with patch('utils.exceptions.requests.post', side_effect=capture_post):
with patch('utils.exceptions.LOG_CENTER_ENABLED', True):
with patch('utils.exceptions.threading.Thread') as mock_thread:
# 直接调用 target 函数而不是启动线程
mock_thread_instance = MagicMock()
def run_target(*args, **kwargs):
target = kwargs.get('target') or args[0]
target()
mock_thread.side_effect = lambda *args, **kwargs: MagicMock(
start=lambda: run_target(*args, **kwargs),
daemon=True
)
report_to_log_center(test_exc, context)
# 验证 payload 结构
if captured_payload:
self.assertEqual(captured_payload['project_id'], 'rtc_backend')
self.assertEqual(captured_payload['level'], 'ERROR')
self.assertEqual(captured_payload['error']['type'], 'TypeError')
self.assertEqual(captured_payload['error']['message'], 'Type mismatch error')
self.assertIn('stack_trace', captured_payload['error'])
self.assertEqual(captured_payload['context']['url'], '/api/users/me/')
self.assertEqual(captured_payload['context']['method'], 'POST')
def test_report_disabled_when_flag_off(self):
"""测试关闭开关时不上报"""
from utils.exceptions import report_to_log_center
from unittest.mock import patch, MagicMock
try:
raise Exception("Should not be reported")
except Exception as e:
test_exc = e
with patch('utils.exceptions.requests.post') as mock_post:
with patch('utils.exceptions.LOG_CENTER_ENABLED', False):
report_to_log_center(test_exc, {})
# 应该不调用 requests.post
mock_post.assert_not_called()
def test_report_silent_failure(self):
"""测试上报失败不抛异常"""
from utils.exceptions import report_to_log_center
from unittest.mock import patch, MagicMock
try:
raise Exception("Test exception")
except Exception as e:
test_exc = e
with patch('utils.exceptions.requests.post', side_effect=Exception("Network error")):
with patch('utils.exceptions.LOG_CENTER_ENABLED', True):
# 不应抛出异常
try:
report_to_log_center(test_exc, {})
except Exception:
self.fail("report_to_log_center should not raise exceptions")
class ExceptionHandlerIntegrationTests(APITestCase):
"""异常处理器集成测试 - 验证异常时触发 Log Center 上报"""
def test_exception_triggers_log_center_report(self):
"""测试异常触发 Log Center 上报"""
from utils.exceptions import custom_exception_handler
from unittest.mock import patch, MagicMock
# 创建异常
test_exc = ValueError("Database connection failed")
# Mock context
mock_request = MagicMock()
mock_request.path = '/api/test/'
mock_request.method = 'GET'
context = {'request': mock_request, 'view': MagicMock()}
with patch('utils.exceptions.report_to_log_center') as mock_report:
# 调用异常处理器
custom_exception_handler(test_exc, context)
# 验证调用了上报函数
mock_report.assert_called_once()
call_args = mock_report.call_args
self.assertEqual(call_args[0][0], test_exc)
def test_business_exception_not_reported(self):
"""测试业务异常不上报到 Log Center"""
from utils.exceptions import custom_exception_handler, BusinessException
from unittest.mock import patch, MagicMock
# 创建业务异常
biz_exc = BusinessException(code=100, message="用户不存在")
context = {'request': MagicMock(), 'view': MagicMock()}
with patch('utils.exceptions.report_to_log_center') as mock_report:
custom_exception_handler(biz_exc, context)
# 业务异常不应触发上报
mock_report.assert_not_called()