Kamixitong/tests/test_validator.py
2025-11-16 19:56:14 +08:00

130 lines
4.5 KiB
Python

"""
验证器测试用例
"""
import unittest
import json
import tempfile
import os
from datetime import datetime
from auth_validator import AuthValidator, MachineCodeGenerator, AuthCache
class TestMachineCodeGenerator(unittest.TestCase):
"""机器码生成器测试"""
def test_generate_machine_code(self):
"""测试机器码生成"""
generator = MachineCodeGenerator()
machine_code = generator.generate()
# 检查长度
self.assertEqual(len(machine_code), 32)
# 检查字符集(应该是十六进制字符)
import re
pattern = r'^[A-F0-9]+$'
self.assertTrue(re.match(pattern, machine_code))
# 测试多次生成的一致性(在短时间内)
machine_code2 = generator.generate()
self.assertEqual(machine_code, machine_code2)
class TestAuthCache(unittest.TestCase):
"""授权缓存测试"""
def setUp(self):
"""测试前准备"""
self.temp_file = tempfile.NamedTemporaryFile(delete=False)
self.temp_file.close()
self.cache = AuthCache(self.temp_file.name)
def tearDown(self):
"""测试后清理"""
if os.path.exists(self.temp_file.name):
os.unlink(self.temp_file.name)
def test_cache_operations(self):
"""测试缓存操作"""
software_id = "TEST_SOFTWARE"
auth_info = {
"license_key": "TEST123456789",
"type": 1,
"expire_time": "2024-12-31T23:59:59",
"machine_code": "ABCDEF1234567890"
}
# 测试保存
self.cache.set_auth_info(software_id, auth_info)
# 测试读取
cached_info = self.cache.get_auth_info(software_id)
self.assertIsNotNone(cached_info)
self.assertEqual(cached_info["license_key"], auth_info["license_key"])
# 测试清除
self.cache.clear_cache(software_id)
cached_info = self.cache.get_auth_info(software_id)
self.assertIsNone(cached_info)
class TestAuthValidator(unittest.TestCase):
"""验证器测试"""
def setUp(self):
"""测试前准备"""
self.software_id = "TEST_SOFTWARE_ID"
self.validator = AuthValidator(
software_id=self.software_id,
api_url="http://127.0.0.1:5000/api/v1", # 使用本地测试URL
timeout=1 # 快速超时
)
def test_license_format_validation(self):
"""测试卡密格式验证"""
# 有效卡密
self.assertTrue(self.validator._validate_license_key("ABCD1234567890EFGH"))
self.assertTrue(self.validator._validate_license_key("TRIAL_ABCD123456"))
# 无效卡密
self.assertFalse(self.validator._validate_license_key(""))
self.assertFalse(self.validator._validate_license_key("short"))
self.assertFalse(self.validator._validate_license_key("abcd1234")) # 小写
self.assertFalse(self.validator._validate_license_key("ABCD@1234")) # 特殊字符
def test_software_version_validation(self):
"""测试软件版本验证"""
# 有效版本
self.assertTrue(self.validator._validate_software_version("1.0.0"))
self.assertTrue(self.validator._validate_software_version("10.20.30"))
# 无效版本
self.assertFalse(self.validator._validate_software_version("1.0"))
self.assertFalse(self.validator._validate_software_version("v1.0.0"))
self.assertFalse(self.validator._validate_software_version("1.0.0.0"))
def test_machine_code_validation(self):
"""测试机器码验证"""
# 有效机器码
self.assertTrue(self.validator._validate_machine_code("ABCDEF1234567890ABCDEF1234567890"))
self.assertTrue(self.validator._validate_machine_code("0123456789ABCDEF0123456789ABCDEF"))
# 无效机器码
self.assertFalse(self.validator._validate_machine_code(""))
self.assertFalse(self.validator._validate_machine_code("short"))
self.assertFalse(self.validator._validate_machine_code("abcdef1234567890abcdef1234567890")) # 小写
def test_account_locking(self):
"""测试账号锁定机制"""
# 初始状态不应该被锁定
self.assertFalse(self.validator._is_locked())
# 锁定账号
self.validator._lock_account(minutes=1)
self.assertTrue(self.validator._is_locked())
# 获取锁定消息
message = self.validator._get_lock_message()
self.assertIn("请等待", message)
self.assertIn("分钟", message)
if __name__ == '__main__':
unittest.main()