Files
outlookEmailPlus/tests/test_gptmail_error_handling.py
T
胡绍康andClaude Opus 4.6 f7a8817970 style: 使用 Black 和 isort 格式化代码
- 使用 Black 格式化 47 个 Python 文件
- 使用 isort 修复 import 排序
- 修复 Code Quality CI/CD 检查失败问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 13:12:16 +08:00

158 lines
6.4 KiB
Python

import unittest
from unittest.mock import MagicMock, patch
import requests
from outlook_web.services import gptmail
class TestGPTMailErrorHandling(unittest.TestCase):
"""测试 GPTMail 服务的错误处理"""
def test_gptmail_request_no_api_key(self):
"""测试 API Key 未配置的情况"""
with patch("outlook_web.services.gptmail.get_gptmail_api_key", return_value=""):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "CONFIG_ERROR")
self.assertIn("未配置", result["error"])
def test_gptmail_request_401_unauthorized(self):
"""测试 API Key 无效的情况"""
mock_response = MagicMock()
mock_response.status_code = 401
with patch(
"outlook_web.services.gptmail.get_gptmail_api_key",
return_value="invalid_key",
):
with patch("requests.get", return_value=mock_response):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "AUTH_ERROR")
self.assertIn("无效", result["error"])
def test_gptmail_request_timeout(self):
"""测试请求超时的情况"""
with patch("outlook_web.services.gptmail.get_gptmail_api_key", return_value="test_key"):
with patch("requests.get", side_effect=requests.exceptions.Timeout()):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "TIMEOUT_ERROR")
self.assertIn("超时", result["error"])
def test_gptmail_request_connection_error(self):
"""测试网络连接失败的情况"""
with patch("outlook_web.services.gptmail.get_gptmail_api_key", return_value="test_key"):
with patch(
"requests.get",
side_effect=requests.exceptions.ConnectionError("Connection refused"),
):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "CONNECTION_ERROR")
self.assertIn("连接", result["error"])
def test_gptmail_request_500_server_error(self):
"""测试服务器错误的情况"""
mock_response = MagicMock()
mock_response.status_code = 500
with patch("outlook_web.services.gptmail.get_gptmail_api_key", return_value="test_key"):
with patch("requests.get", return_value=mock_response):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "SERVER_ERROR")
self.assertIn("不可用", result["error"])
def test_gptmail_request_429_rate_limit(self):
"""测试请求频率超限的情况"""
mock_response = MagicMock()
mock_response.status_code = 429
with patch("outlook_web.services.gptmail.get_gptmail_api_key", return_value="test_key"):
with patch("requests.get", return_value=mock_response):
result = gptmail.gptmail_request("GET", "/api/test")
self.assertFalse(result["success"])
self.assertEqual(result["error_type"], "RATE_LIMIT_ERROR")
self.assertIn("频率超限", result["error"])
def test_generate_temp_email_success(self):
"""测试成功生成临时邮箱"""
mock_result = {"success": True, "data": {"email": "test@example.com"}}
with patch("outlook_web.services.gptmail.gptmail_request", return_value=mock_result):
email, error = gptmail.generate_temp_email()
self.assertEqual(email, "test@example.com")
self.assertIsNone(error)
def test_generate_temp_email_api_key_not_configured(self):
"""测试 API Key 未配置时生成临时邮箱"""
mock_result = {
"success": False,
"error": "GPTMail API Key 未配置",
"error_type": "CONFIG_ERROR",
"details": "请在系统设置中配置 GPTMail API Key",
}
with patch("outlook_web.services.gptmail.gptmail_request", return_value=mock_result):
email, error = gptmail.generate_temp_email()
self.assertIsNone(email)
self.assertIn("未配置", error)
self.assertIn("系统设置", error)
def test_generate_temp_email_timeout(self):
"""测试请求超时时生成临时邮箱"""
mock_result = {
"success": False,
"error": "API 请求超时",
"error_type": "TIMEOUT_ERROR",
"details": "请求超过 30 秒未响应,请检查网络连接或稍后重试",
}
with patch("outlook_web.services.gptmail.gptmail_request", return_value=mock_result):
email, error = gptmail.generate_temp_email()
self.assertIsNone(email)
self.assertIn("超时", error)
self.assertIn("30 秒", error)
def test_generate_temp_email_missing_email_field(self):
"""测试 API 返回数据缺少 email 字段"""
mock_result = {"success": True, "data": {}} # 缺少 email 字段
with patch("outlook_web.services.gptmail.gptmail_request", return_value=mock_result):
email, error = gptmail.generate_temp_email()
self.assertIsNone(email)
self.assertIn("格式错误", error)
self.assertIn("email", error)
def test_generate_temp_email_with_prefix_and_domain(self):
"""测试使用 prefix 和 domain 生成临时邮箱"""
mock_result = {"success": True, "data": {"email": "custom@example.com"}}
with patch("outlook_web.services.gptmail.gptmail_request", return_value=mock_result) as mock_request:
email, error = gptmail.generate_temp_email(prefix="custom", domain="example.com")
self.assertEqual(email, "custom@example.com")
self.assertIsNone(error)
# 验证调用参数
mock_request.assert_called_once()
call_args = mock_request.call_args
self.assertEqual(call_args[0][0], "POST")
self.assertEqual(call_args[1]["json_data"], {"prefix": "custom", "domain": "example.com"})
if __name__ == "__main__":
unittest.main()