MRobot/test_category_features.py
2025-11-25 20:45:10 +08:00

124 lines
4.1 KiB
Python

#!/usr/bin/env python3
"""
测试财务模块的分类功能完整流程
"""
import shutil
from pathlib import Path
from app.tools.finance_manager import FinanceManager, Transaction
# 清除旧数据
data_root = Path("assets/Finance_Data")
if data_root.exists():
shutil.rmtree(data_root)
print("=" * 60)
print("财务模块分类功能测试")
print("=" * 60)
# 初始化财务管理器
fm = FinanceManager()
# 测试1: 验证 admin 账户自动创建
print("\n[测试1] admin 账户自动创建")
accounts = fm.get_all_accounts()
print(f" 账户数量: {len(accounts)}")
assert len(accounts) == 1, "应该有1个账户"
admin_acc = accounts[0]
print(f" 账户名称: {admin_acc.name}")
assert admin_acc.name == "admin", "账户名称应该是 'admin'"
print(" ✓ 通过")
# 测试2: 验证默认分类
print("\n[测试2] 默认分类")
print(f" 分类数量: {len(admin_acc.categories)}")
print(f" 分类列表: {admin_acc.categories}")
assert len(admin_acc.categories) > 0, "应该有默认分类"
print(" ✓ 通过")
# 测试3: 添加新分类
print("\n[测试3] 添加新分类")
result = fm.add_category(admin_acc.id, "房租")
print(f" 添加 '房租' 分类: {'成功' if result else '失败'}")
assert result, "应该成功添加分类"
categories = fm.get_categories(admin_acc.id)
print(f" 分类数量: {len(categories)}")
assert "房租" in categories, "应该包含 '房租' 分类"
print(" ✓ 通过")
# 测试4: 创建带分类的交易记录
print("\n[测试4] 创建带分类的交易记录")
trans1 = Transaction(
date="2025-01-01",
amount=5000,
trader="工作所得",
notes="1月工资",
category="工资"
)
fm.add_transaction(admin_acc.id, trans1)
print(f" 交易1: {trans1.date} | {trans1.trader} | {trans1.category} | ¥{trans1.amount}")
trans2 = Transaction(
date="2025-01-05",
amount=-1500,
trader="房东",
notes="1月房租",
category="房租"
)
fm.add_transaction(admin_acc.id, trans2)
print(f" 交易2: {trans2.date} | {trans2.trader} | {trans2.category} | ¥{trans2.amount}")
# 重新加载以验证保存
fm.load_all_accounts()
admin_acc = fm.get_account(admin_acc.id)
print(f" 账户交易总数: {len(admin_acc.transactions)}")
assert len(admin_acc.transactions) == 2, "应该有2个交易"
print(" ✓ 通过")
# 测试5: 按分类查询
print("\n[测试5] 按分类查询")
results_salary = fm.query_transactions(admin_acc.id, category="工资")
print(f" '工salary' 分类的交易: {len(results_salary)}")
assert len(results_salary) == 1, "应该有1个工资交易"
assert results_salary[0].amount == 5000
results_rent = fm.query_transactions(admin_acc.id, category="房租")
print(f" '房租' 分类的交易: {len(results_rent)}")
assert len(results_rent) == 1, "应该有1个房租交易"
assert results_rent[0].amount == -1500
results_all = fm.query_transactions(admin_acc.id)
print(f" 全部分类的交易: {len(results_all)}")
assert len(results_all) == 2, "应该有2个交易"
print(" ✓ 通过")
# 测试6: 更新交易分类
print("\n[测试6] 更新交易分类")
fm.update_transaction(admin_acc.id, trans1.id, category="奖金")
fm.load_all_accounts()
admin_acc = fm.get_account(admin_acc.id)
updated_trans = fm.get_transaction(admin_acc.id, trans1.id)
print(f" 更新后的分类: {updated_trans.category}")
assert updated_trans.category == "奖金", "分类应该更新为 '奖金'"
print(" ✓ 通过")
# 测试7: CSV导出包含分类
print("\n[测试7] CSV导出包含分类")
csv_path = "/tmp/test_export.csv"
result = fm.export_to_csv(admin_acc.id, csv_path)
print(f" 导出结果: {'成功' if result else '失败'}")
assert result, "应该成功导出CSV"
# 验证CSV内容
with open(csv_path, 'r', encoding='utf-8-sig') as f:
lines = f.readlines()
print(f" CSV行数: {len(lines)}")
print(f" 标题行: {lines[0].strip()}")
assert "分类" in lines[0], "CSV应该包含 '分类'"
print(f" 数据行1: {lines[1].strip()}")
print(f" 数据行2: {lines[2].strip()}")
print(" ✓ 通过")
print("\n" + "=" * 60)
print("所有测试都通过了!✓")
print("=" * 60)