功能实现: - 全选功能:跨分组保持选中状态,使用全局 Set 存储 - 验证码提取:支持 Graph API → IMAP 回退策略 - 自动轮询:新邮件通知、红点提示、连续错误自动停止 BUG 修复 (BUG-001 ~ BUG-008): - Toast 通知位置移至右下角 - 切换分组时保持全选状态 - 添加批量删除邮箱功能 - 验证码提取支持 IMAP 回退 - 修复轮询开关类型不一致 (boolean vs string) - 完善轮询通知内容与红点位置 - 轮询次数校验改为 0-100 (0 表示持续) - 复制按钮添加加载状态与反馈 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
238 lines
8.0 KiB
Python
238 lines
8.0 KiB
Python
"""
|
||
验证码提取 API 集成测试
|
||
|
||
测试验证码提取 API 的正确性,包括:
|
||
- API 成功提取验证码和链接
|
||
- API 错误处理(未找到、未登录、邮箱不存在)
|
||
- API 性能测试
|
||
- 设置 API 测试(轮询配置)
|
||
"""
|
||
|
||
import unittest
|
||
import sys
|
||
import os
|
||
import time
|
||
|
||
# 添加项目根目录到 Python 路径
|
||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||
|
||
|
||
class TestExtractVerificationAPI(unittest.TestCase):
|
||
"""验证码提取 API 集成测试类"""
|
||
|
||
def setUp(self):
|
||
"""测试前置准备"""
|
||
# TODO: 实现后取消注释
|
||
# from outlook_web.app import create_app
|
||
# self.app = create_app()
|
||
# self.client = self.app.test_client()
|
||
pass
|
||
|
||
def tearDown(self):
|
||
"""测试后清理"""
|
||
pass
|
||
|
||
# ==================== 验证码提取 API 测试 ====================
|
||
|
||
def test_api_extract_verification_success(self):
|
||
"""
|
||
测试用例 IT-001:API 成功提取验证码和链接
|
||
|
||
测试目的:验证 API 能正确返回验证码和链接
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# # 登录
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# # 调用 API
|
||
# response = self.client.get('/api/emails/test@example.com/extract-verification')
|
||
# data = response.get_json()
|
||
#
|
||
# # 验证响应
|
||
# self.assertEqual(response.status_code, 200)
|
||
# self.assertTrue(data['success'])
|
||
# self.assertIn('verification_code', data['data'])
|
||
# self.assertIn('links', data['data'])
|
||
# self.assertIn('formatted', data['data'])
|
||
|
||
self.assertTrue(True, "待实现:API 成功提取")
|
||
|
||
def test_api_extract_verification_not_found(self):
|
||
"""
|
||
测试用例 IT-002:API 未找到验证信息
|
||
|
||
测试目的:验证 API 能正确处理未找到验证信息的情况
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# response = self.client.get('/api/emails/empty@example.com/extract-verification')
|
||
# data = response.get_json()
|
||
#
|
||
# self.assertEqual(response.status_code, 404)
|
||
# self.assertFalse(data['success'])
|
||
# self.assertEqual(data['error'], "未找到验证信息")
|
||
# self.assertIn('trace_id', data)
|
||
|
||
self.assertTrue(True, "待实现:API 未找到验证信息")
|
||
|
||
def test_api_extract_verification_unauthorized(self):
|
||
"""
|
||
测试用例 IT-003:API 未登录访问
|
||
|
||
测试目的:验证 API 需要登录验证
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# response = self.client.get('/api/emails/test@example.com/extract-verification')
|
||
# self.assertIn(response.status_code, [302, 401])
|
||
|
||
self.assertTrue(True, "待实现:API 未登录访问")
|
||
|
||
def test_api_extract_verification_email_not_exist(self):
|
||
"""
|
||
测试用例 IT-004:API 邮箱不存在
|
||
|
||
测试目的:验证 API 能正确处理邮箱不存在的情况
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# response = self.client.get('/api/emails/notexist@example.com/extract-verification')
|
||
# data = response.get_json()
|
||
#
|
||
# self.assertEqual(response.status_code, 404)
|
||
# self.assertFalse(data['success'])
|
||
# self.assertIn('邮箱不存在', data['error'])
|
||
|
||
self.assertTrue(True, "待实现: 邮箱不存在")
|
||
|
||
def test_api_extract_verification_performance(self):
|
||
"""
|
||
测试用例 IT-005:API 性能测试
|
||
|
||
测试目的:验证 API 响应时间 < 2 秒
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# start_time = time.time()
|
||
#
|
||
# response = self.client.get('/api/emails/test@example.com/extract-verification')
|
||
#
|
||
# end_time = time.time()
|
||
# elapsed_time = (end_time - start_time) * 1000 # 转换为毫秒
|
||
#
|
||
# self.assertEqual(response.status_code, 200)
|
||
# self.assertLess(elapsed_time, 2000, f"API 响应时间过长: {elapsed_time}ms")
|
||
|
||
self.assertTrue(True, "待实现:API 性能测试")
|
||
|
||
# ==================== 设置 API 测试 ====================
|
||
|
||
def test_api_get_polling_settings(self):
|
||
"""
|
||
测试用例 IT-006:读取轮询配置
|
||
|
||
测试目的:验证 GET /api/settings 能正确返回轮询配置
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# response = self.client.get('/api/settings')
|
||
# data = response.get_json()
|
||
#
|
||
# self.assertEqual(response.status_code, 200)
|
||
# self.assertTrue(data['success'])
|
||
# self.assertIn('enable_auto_polling', data['settings'])
|
||
# self.assertIn('polling_interval', data['settings'])
|
||
# self.assertIn('polling_count', data['settings'])
|
||
|
||
self.assertTrue(True, "待实现:读取轮询配置")
|
||
|
||
def test_api_update_polling_settings(self):
|
||
"""
|
||
测试用例 IT-007:更新轮询配置
|
||
|
||
测试目的:验证 PUT /api/settings 能正确更新轮询配置
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# # 更新配置
|
||
# response = self.client.put('/api/settings',
|
||
# json={
|
||
# 'enable_auto_polling': True,
|
||
# 'polling_interval': 30,
|
||
# 'polling_count': 10
|
||
# },
|
||
# content_type='application/json'
|
||
# )
|
||
# data = response.get_json()
|
||
#
|
||
# self.assertEqual(response.status_code, 200)
|
||
# self.assertTrue(data['success'])
|
||
#
|
||
# # 验证更新成功
|
||
# response2 = self.client.get('/api/settings')
|
||
# data2 = response2.get_json()
|
||
#
|
||
# self.assertTrue(data2['settings']['enable_auto_polling'])
|
||
# self.assertEqual(data2['settings']['polling_interval'], 30)
|
||
# self.assertEqual(data2['settings']['polling_count'], 10)
|
||
|
||
self.assertTrue(True, "待实现:更新轮询配置")
|
||
|
||
def test_api_update_polling_interval_validation(self):
|
||
"""
|
||
测试用例 IT-008:轮询间隔参数验证
|
||
|
||
测试目的:验证轮询间隔参数验证(5-300 秒)
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# # 测试小于 5
|
||
# response1 = self.client.put('/api/settings',
|
||
# json={'polling_interval': 3},
|
||
# content_type='application/json'
|
||
# )
|
||
# self.assertEqual(response1.status_code, 400)
|
||
#
|
||
# # 测试大于 300
|
||
# response2 = self.client.put('/api/settings',
|
||
# json={'polling_interval': 500},
|
||
# content_type='application/json'
|
||
# )
|
||
# self.assertEqual(response2.status_code, 400)
|
||
|
||
self.assertTrue(True, "待实现:轮询间隔参数验证")
|
||
|
||
def test_api_update_polling_count_validation(self):
|
||
"""
|
||
测试用例 IT-009:轮询次数参数验证
|
||
|
||
测试目的:验证轮询次数参数验证(1-100 次)
|
||
"""
|
||
# TODO: 实现后取消注释
|
||
# self.client.post('/login', data={'password': 'admin123'})
|
||
#
|
||
# # 测试小于 1
|
||
# response1 = self.client.put('/api/settings',
|
||
# json={'polling_count': 0},
|
||
# content_type='application/json'
|
||
# )
|
||
# self.assertEqual(response1.status_code, 400)
|
||
#
|
||
# # 测试大于 100
|
||
# response2 = self.client.put('/api/settings',
|
||
# json={'polling_count': 150},
|
||
# content_type='application/json'
|
||
# )
|
||
# self.assertEqual(response2.status_code, 400)
|
||
|
||
self.assertTrue(True, "待实现:轮询次数参数验证")
|
||
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main()
|