MetaCore-startup/tests/test_pending_delete_feature.py
2025-10-11 09:24:06 +08:00

279 lines
9.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试待删除项目功能
"""
import sys
import os
import tempfile
import shutil
from datetime import datetime
# 添加MetaCore目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
metacore_dir = os.path.join(current_dir, '..', 'MetaCore')
sys.path.insert(0, metacore_dir)
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from data.project_manager import ProjectManager, Project
from ui.project_card import ProjectCard
from ui.styles import StyleSheet
class PendingDeleteTestWindow(QMainWindow):
"""待删除功能测试窗口"""
def __init__(self):
super().__init__()
self.setWindowTitle("待删除项目功能测试")
self.setGeometry(100, 100, 1000, 700)
# 应用深色主题样式
self.setStyleSheet(StyleSheet.get_main_style())
# 创建临时目录用于测试
self.temp_dir = tempfile.mkdtemp(prefix="metacore_test_")
# 创建测试项目
self.create_test_projects()
# 设置UI
self.setup_ui()
def create_test_projects(self):
"""创建测试项目"""
self.project_manager = ProjectManager()
# 创建一个真实的项目目录
self.test_project_dir = os.path.join(self.temp_dir, "测试项目")
os.makedirs(self.test_project_dir, exist_ok=True)
# 创建一些测试文件
with open(os.path.join(self.test_project_dir, "README.md"), 'w', encoding='utf-8') as f:
f.write("# 测试项目\n这是一个用于测试待删除功能的项目。")
# 创建测试项目
test_project = Project(
id=999,
title="测试项目",
date=datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
type="test",
image="🧪",
path=self.temp_dir,
project_dir=self.test_project_dir,
description="用于测试待删除功能的项目",
status="normal"
)
self.project_manager.projects.append(test_project)
self.test_project = test_project
def setup_ui(self):
"""设置用户界面"""
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QVBoxLayout(central_widget)
main_layout.setContentsMargins(20, 20, 20, 20)
main_layout.setSpacing(20)
# 标题
title_label = QLabel("待删除项目功能测试")
title_label.setStyleSheet("""
font-size: 24px;
font-weight: bold;
color: #ffffff;
margin-bottom: 10px;
""")
main_layout.addWidget(title_label)
# 说明文字
desc_label = QLabel(
"测试流程:\n"
"1. 点击「删除项目目录」按钮模拟项目目录被删除\n"
"2. 等待5秒系统会检测到项目目录不存在\n"
"3. 在弹出的对话框中点击「No」保留项目\n"
"4. 观察项目卡片变浅,菜单按钮变成叉号\n"
"5. 重要:系统不会再次弹窗提示(已修复)\n"
"6. 点击「恢复项目目录」按钮恢复项目目录\n"
"7. 🆕 系统会自动检测并恢复项目(无需点击)\n"
"8. 或者点击叉号按钮永久删除项目"
)
desc_label.setStyleSheet("""
font-size: 14px;
color: #cccccc;
margin-bottom: 20px;
padding: 15px;
background-color: rgba(60, 60, 60, 0.5);
border-radius: 8px;
""")
main_layout.addWidget(desc_label)
# 控制按钮
button_layout = QHBoxLayout()
self.delete_dir_btn = QPushButton("删除项目目录")
self.delete_dir_btn.setStyleSheet("""
QPushButton {
background-color: #ff6b6b;
color: white;
border: none;
padding: 10px 20px;
border-radius: 6px;
font-size: 14px;
font-weight: bold;
}
QPushButton:hover {
background-color: #ff5252;
}
""")
self.delete_dir_btn.clicked.connect(self.delete_project_directory)
button_layout.addWidget(self.delete_dir_btn)
self.restore_dir_btn = QPushButton("恢复项目目录")
self.restore_dir_btn.setStyleSheet("""
QPushButton {
background-color: #4caf50;
color: white;
border: none;
padding: 10px 20px;
border-radius: 6px;
font-size: 14px;
font-weight: bold;
}
QPushButton:hover {
background-color: #45a049;
}
""")
self.restore_dir_btn.clicked.connect(self.restore_project_directory)
self.restore_dir_btn.setEnabled(False)
button_layout.addWidget(self.restore_dir_btn)
button_layout.addStretch()
main_layout.addLayout(button_layout)
# 项目卡片容器
card_container = QWidget()
card_layout = QHBoxLayout(card_container)
card_layout.setContentsMargins(10, 10, 10, 10)
# 创建项目卡片
self.project_card = ProjectCard(self.test_project, self.project_manager, "grid")
card_layout.addWidget(self.project_card)
card_layout.addStretch()
main_layout.addWidget(card_container)
main_layout.addStretch()
# 状态显示
self.status_label = QLabel("状态:项目目录存在,项目状态正常")
self.status_label.setStyleSheet("""
font-size: 12px;
color: #4caf50;
padding: 10px;
background-color: rgba(76, 175, 80, 0.1);
border-radius: 6px;
border: 1px solid #4caf50;
""")
main_layout.addWidget(self.status_label)
# 连接项目管理器信号
self.project_manager.project_updated.connect(self.on_project_updated)
def delete_project_directory(self):
"""删除项目目录"""
if os.path.exists(self.test_project_dir):
shutil.rmtree(self.test_project_dir)
self.delete_dir_btn.setEnabled(False)
self.restore_dir_btn.setEnabled(True)
self.status_label.setText("状态:项目目录已删除,等待系统检测...")
self.status_label.setStyleSheet("""
font-size: 12px;
color: #ff9800;
padding: 10px;
background-color: rgba(255, 152, 0, 0.1);
border-radius: 6px;
border: 1px solid #ff9800;
""")
def restore_project_directory(self):
"""恢复项目目录"""
if not os.path.exists(self.test_project_dir):
os.makedirs(self.test_project_dir, exist_ok=True)
# 重新创建测试文件
with open(os.path.join(self.test_project_dir, "README.md"), 'w', encoding='utf-8') as f:
f.write("# 测试项目\n这是一个用于测试待删除功能的项目。\n\n项目目录已恢复!")
self.delete_dir_btn.setEnabled(True)
self.restore_dir_btn.setEnabled(False)
self.status_label.setText("状态:项目目录已恢复,等待系统自动检测恢复...")
self.status_label.setStyleSheet("""
font-size: 12px;
color: #4caf50;
padding: 10px;
background-color: rgba(76, 175, 80, 0.1);
border-radius: 6px;
border: 1px solid #4caf50;
""")
def on_project_updated(self, project: Project):
"""项目更新事件"""
if project.id == self.test_project.id:
self.test_project = project
self.project_card.project = project
self.project_card.update_display()
if project.status == 'pending_delete':
self.status_label.setText("状态:项目处于待删除状态(卡片变浅,显示叉号)")
self.status_label.setStyleSheet("""
font-size: 12px;
color: #f44336;
padding: 10px;
background-color: rgba(244, 67, 54, 0.1);
border-radius: 6px;
border: 1px solid #f44336;
""")
elif project.status == 'normal':
self.status_label.setText("状态:项目已恢复正常状态")
self.status_label.setStyleSheet("""
font-size: 12px;
color: #4caf50;
padding: 10px;
background-color: rgba(76, 175, 80, 0.1);
border-radius: 6px;
border: 1px solid #4caf50;
""")
def closeEvent(self, event):
"""窗口关闭事件"""
# 清理临时目录
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
event.accept()
def main():
"""主函数"""
app = QApplication(sys.argv)
# 设置应用程序信息
app.setApplicationName("待删除功能测试")
app.setApplicationVersion("1.0.0")
# 创建并显示测试窗口
window = PendingDeleteTestWindow()
window.show()
# 运行应用程序
sys.exit(app.exec_())
if __name__ == "__main__":
main()