174 lines
5.0 KiB
Python
Executable File
174 lines
5.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
SOP 功能测试脚本
|
||
用于验证 SOP 文件管理功能是否正常工作
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import sqlite3
|
||
|
||
# 添加 server 目录到路径
|
||
sys.path.insert(0, 'server')
|
||
|
||
def test_database_table():
|
||
"""测试数据库表是否创建成功"""
|
||
print("测试 1: 检查数据库表...")
|
||
|
||
db_path = 'server/data.db'
|
||
if not os.path.exists(db_path):
|
||
print(" ❌ 数据库文件不存在")
|
||
return False
|
||
|
||
conn = sqlite3.connect(db_path)
|
||
cursor = conn.cursor()
|
||
|
||
# 检查 sop_files 表是否存在
|
||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='sop_files'")
|
||
result = cursor.fetchone()
|
||
|
||
if result:
|
||
print(" ✅ sop_files 表已创建")
|
||
|
||
# 检查表结构
|
||
cursor.execute("PRAGMA table_info(sop_files)")
|
||
columns = cursor.fetchall()
|
||
print(f" ✅ 表结构包含 {len(columns)} 列:")
|
||
for col in columns:
|
||
print(f" - {col[1]} ({col[2]})")
|
||
|
||
conn.close()
|
||
return True
|
||
else:
|
||
print(" ❌ sop_files 表不存在")
|
||
conn.close()
|
||
return False
|
||
|
||
def test_sop_directory():
|
||
"""测试 SOP 文件存储目录"""
|
||
print("\n测试 2: 检查 SOP 文件目录...")
|
||
|
||
sop_dir = 'frontend/sop_files'
|
||
|
||
if os.path.exists(sop_dir):
|
||
print(f" ✅ 目录已存在: {sop_dir}")
|
||
|
||
# 检查目录权限
|
||
if os.access(sop_dir, os.W_OK):
|
||
print(" ✅ 目录可写")
|
||
else:
|
||
print(" ⚠️ 目录不可写,可能需要调整权限")
|
||
|
||
# 列出现有文件
|
||
files = os.listdir(sop_dir)
|
||
if files:
|
||
print(f" 📁 目录中已有 {len(files)} 个文件:")
|
||
for f in files[:5]: # 只显示前5个
|
||
print(f" - {f}")
|
||
else:
|
||
print(" 📁 目录为空")
|
||
|
||
return True
|
||
else:
|
||
print(f" ⚠️ 目录不存在: {sop_dir}")
|
||
print(" 💡 系统会在首次上传时自动创建")
|
||
return True
|
||
|
||
def test_api_routes():
|
||
"""测试 API 路由是否注册"""
|
||
print("\n测试 3: 检查 API 路由...")
|
||
|
||
try:
|
||
from app import app
|
||
|
||
# 获取所有路由
|
||
routes = []
|
||
for rule in app.url_map.iter_rules():
|
||
if 'sop' in rule.rule:
|
||
routes.append(f"{rule.rule} [{', '.join(rule.methods - {'HEAD', 'OPTIONS'})}]")
|
||
|
||
if routes:
|
||
print(" ✅ SOP API 路由已注册:")
|
||
for route in routes:
|
||
print(f" - {route}")
|
||
return True
|
||
else:
|
||
print(" ❌ 未找到 SOP API 路由")
|
||
return False
|
||
except Exception as e:
|
||
print(f" ❌ 导入失败: {e}")
|
||
return False
|
||
|
||
def test_frontend_files():
|
||
"""测试前端文件是否更新"""
|
||
print("\n测试 4: 检查前端文件...")
|
||
|
||
files_to_check = {
|
||
'frontend/js/api.js': ['listSopFiles', 'uploadSopFile', 'deleteSopFile'],
|
||
'frontend/js/components/upload.js': ['renderSop', 'bindSopEvents', 'loadSopList'],
|
||
'frontend/js/router.js': ['sop'],
|
||
'frontend/index.html': ['upload/sop']
|
||
}
|
||
|
||
all_ok = True
|
||
for filepath, keywords in files_to_check.items():
|
||
if not os.path.exists(filepath):
|
||
print(f" ❌ 文件不存在: {filepath}")
|
||
all_ok = False
|
||
continue
|
||
|
||
with open(filepath, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
missing = [kw for kw in keywords if kw not in content]
|
||
if missing:
|
||
print(f" ⚠️ {filepath} 缺少关键字: {', '.join(missing)}")
|
||
all_ok = False
|
||
else:
|
||
print(f" ✅ {filepath} 已更新")
|
||
|
||
return all_ok
|
||
|
||
def main():
|
||
"""运行所有测试"""
|
||
print("=" * 60)
|
||
print("SOP 功能测试")
|
||
print("=" * 60)
|
||
|
||
results = []
|
||
|
||
# 运行测试
|
||
results.append(("数据库表", test_database_table()))
|
||
results.append(("文件目录", test_sop_directory()))
|
||
results.append(("API 路由", test_api_routes()))
|
||
results.append(("前端文件", test_frontend_files()))
|
||
|
||
# 汇总结果
|
||
print("\n" + "=" * 60)
|
||
print("测试结果汇总")
|
||
print("=" * 60)
|
||
|
||
for name, result in results:
|
||
status = "✅ 通过" if result else "❌ 失败"
|
||
print(f"{name}: {status}")
|
||
|
||
all_passed = all(r[1] for r in results)
|
||
|
||
print("\n" + "=" * 60)
|
||
if all_passed:
|
||
print("🎉 所有测试通过!SOP 功能已准备就绪。")
|
||
print("\n下一步:")
|
||
print("1. 重启服务器")
|
||
print("2. 登录系统(使用管理员账号)")
|
||
print("3. 进入 '上传' → 'SOP' 菜单")
|
||
print("4. 尝试上传测试文件: sop_template_example.csv")
|
||
else:
|
||
print("⚠️ 部分测试未通过,请检查上述错误信息。")
|
||
print("=" * 60)
|
||
|
||
return 0 if all_passed else 1
|
||
|
||
if __name__ == '__main__':
|
||
sys.exit(main())
|