Kamixitong/tests/test_models.py
2025-11-11 21:39:12 +08:00

234 lines
7.0 KiB
Python

"""
数据模型测试用例
"""
import unittest
import tempfile
import os
from datetime import datetime, timedelta
from app import create_app, db
from app.models import Admin, Product, License, Device
class TestModels(unittest.TestCase):
"""数据模型测试"""
def setUp(self):
"""测试前准备"""
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
# 使用内存数据库
self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
db.create_all()
def tearDown(self):
"""测试后清理"""
db.session.remove()
db.drop_all()
self.app_context.pop()
def test_admin_model(self):
"""测试管理员模型"""
# 创建管理员
admin = Admin(
username='testadmin',
email='test@example.com',
role=1
)
admin.set_password('testpass123')
db.session.add(admin)
db.session.commit()
# 验证密码
self.assertTrue(admin.verify_password('testpass123'))
self.assertFalse(admin.verify_password('wrongpass'))
# 验证权限
self.assertTrue(admin.is_super_admin())
self.assertTrue(admin.is_active())
def test_product_model(self):
"""测试产品模型"""
# 创建产品
product = Product(
product_id='TEST_PRODUCT',
product_name='测试产品',
description='这是一个测试产品'
)
db.session.add(product)
db.session.commit()
# 验证产品
self.assertEqual(product.product_id, 'TEST_PRODUCT')
self.assertEqual(product.product_name, '测试产品')
self.assertTrue(product.is_enabled())
# 测试统计信息
stats = product.get_stats()
self.assertEqual(stats['total_licenses'], 0)
self.assertEqual(stats['active_licenses'], 0)
self.assertEqual(stats['total_devices'], 0)
def test_license_model(self):
"""测试卡密模型"""
# 先创建产品
product = Product(
product_id='TEST_PRODUCT',
product_name='测试产品'
)
db.session.add(product)
db.session.commit()
# 创建卡密
license_obj = License(
product_id='TEST_PRODUCT',
type=1,
valid_days=30,
status=0
)
db.session.add(license_obj)
db.session.commit()
# 验证卡密
self.assertIsNotNone(license_obj.license_key)
self.assertEqual(len(license_obj.license_key), 32)
self.assertTrue(license_obj.is_formal())
self.assertFalse(license_obj.is_trial())
self.assertTrue(license_obj.can_activate())
self.assertFalse(license_obj.is_expired())
# 测试激活
success, message = license_obj.activate('TEST_MACHINE_CODE', '1.0.0')
self.assertTrue(success)
self.assertEqual(message, '激活成功')
self.assertTrue(license_obj.is_active())
# 测试验证
success, message = license_obj.verify('TEST_MACHINE_CODE', '1.0.0')
self.assertTrue(success)
self.assertEqual(message, '验证通过')
# 测试设备不匹配
success, message = license_obj.verify('WRONG_MACHINE_CODE', '1.0.0')
self.assertFalse(success)
self.assertEqual(message, '设备不匹配')
def test_device_model(self):
"""测试设备模型"""
# 创建产品
product = Product(product_id='TEST_PRODUCT', product_name='测试产品')
db.session.add(product)
# 创建卡密
license_obj = License(
product_id='TEST_PRODUCT',
type=1,
valid_days=30
)
db.session.add(license_obj)
db.session.commit()
# 创建设备
device = Device(
machine_code='TEST_MACHINE_CODE',
license_id=license_obj.license_id,
product_id='TEST_PRODUCT',
software_version='1.0.0'
)
db.session.add(device)
db.session.commit()
# 验证设备
self.assertTrue(device.is_active())
self.assertTrue(device.is_online())
# 测试使用时间
uptime_days = device.get_uptime_days()
self.assertGreaterEqual(uptime_days, 0)
def test_license_batch_generation(self):
"""测试批量生成卡密"""
# 创建产品
product = Product(product_id='TEST_PRODUCT', product_name='测试产品')
db.session.add(product)
db.session.commit()
# 批量生成卡密
licenses = License.generate_batch(
product_id='TEST_PRODUCT',
count=5,
license_type=1,
valid_days=365
)
self.assertEqual(len(licenses), 5)
# 保存到数据库
db.session.add_all(licenses)
db.session.commit()
# 验证生成的卡密
for license_obj in licenses:
self.assertEqual(license_obj.product_id, 'TEST_PRODUCT')
self.assertEqual(license_obj.type, 1)
self.assertEqual(license_obj.valid_days, 365)
self.assertEqual(license_obj.status, 0)
self.assertIsNotNone(license_obj.license_key)
self.assertEqual(len(license_obj.license_key), 32)
def test_license_extension(self):
"""测试卡密延期"""
# 创建产品和卡密
product = Product(product_id='TEST_PRODUCT', product_name='测试产品')
db.session.add(product)
license_obj = License(
product_id='TEST_PRODUCT',
type=1,
valid_days=30,
status=1,
activate_time=datetime.utcnow()
)
db.session.add(license_obj)
db.session.commit()
original_expire_time = license_obj.expire_time
# 延期30天
success, message = license_obj.extend_validity(30)
self.assertTrue(success)
self.assertEqual(message, '延期成功')
# 验证延期后的时间
expected_expire_time = original_expire_time + timedelta(days=30)
self.assertEqual(license_obj.expire_time, expected_expire_time)
def test_trial_conversion(self):
"""测试试用转正式"""
# 创建产品和试用卡密
product = Product(product_id='TEST_PRODUCT', product_name='测试产品')
db.session.add(product)
license_obj = License(
product_id='TEST_PRODUCT',
type=0, # 试用
valid_days=7,
status=1,
activate_time=datetime.utcnow()
)
db.session.add(license_obj)
db.session.commit()
# 转为正式
success, message = license_obj.convert_to_formal(365)
self.assertTrue(success)
self.assertEqual(message, '转换成功')
# 验证转换结果
self.assertTrue(license_obj.is_formal())
self.assertFalse(license_obj.is_trial())
self.assertEqual(license_obj.valid_days, 365)
if __name__ == '__main__':
unittest.main()