mcp-feedback-enhanced/test_web_ui.py

239 lines
8.1 KiB
Python
Raw 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
"""
Test script for Interactive Feedback MCP Web UI
"""
import sys
import threading
import time
import socket
from pathlib import Path
def find_free_port():
"""Find a free port to use for testing"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0))
s.listen(1)
port = s.getsockname()[1]
return port
def test_web_ui(keep_running=False):
"""Test the Web UI functionality"""
print("🧪 測試 Interactive Feedback MCP Web UI")
print("=" * 50)
# Test import
try:
from web_ui import WebUIManager, launch_web_feedback_ui
print("✅ Web UI 模組匯入成功")
except ImportError as e:
print(f"❌ Web UI 模組匯入失敗: {e}")
return False, None
# Find free port
try:
free_port = find_free_port()
print(f"🔍 找到可用端口: {free_port}")
except Exception as e:
print(f"❌ 尋找可用端口失敗: {e}")
return False, None
# Test manager creation
try:
manager = WebUIManager(port=free_port)
print("✅ WebUIManager 創建成功")
except Exception as e:
print(f"❌ WebUIManager 創建失敗: {e}")
return False, None
# Test server start (with timeout)
server_started = False
try:
print("🚀 啟動 Web 服務器...")
def start_server():
try:
manager.start_server()
return True
except Exception as e:
print(f"服務器啟動錯誤: {e}")
return False
# Start server in thread
server_thread = threading.Thread(target=start_server)
server_thread.daemon = True
server_thread.start()
# Wait a moment and test if server is responsive
time.sleep(3)
# Test if port is listening
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(1)
result = s.connect_ex((manager.host, manager.port))
if result == 0:
server_started = True
print("✅ Web 服務器啟動成功")
print(f"🌐 服務器運行在: http://{manager.host}:{manager.port}")
else:
print(f"❌ 無法連接到服務器端口 {manager.port}")
except Exception as e:
print(f"❌ Web 服務器啟動失敗: {e}")
return False, None
if not server_started:
print("❌ 服務器未能正常啟動")
return False, None
# Test session creation
session_info = None
try:
project_dir = str(Path.cwd())
summary = "測試 Web UI 功能"
session_id = manager.create_session(project_dir, summary)
session_info = {
'manager': manager,
'session_id': session_id,
'url': f"http://{manager.host}:{manager.port}/session/{session_id}"
}
print(f"✅ 測試會話創建成功 (ID: {session_id[:8]}...)")
print(f"🔗 測試 URL: {session_info['url']}")
except Exception as e:
print(f"❌ 會話創建失敗: {e}")
return False, None
print("\n" + "=" * 50)
print("🎉 所有測試通過Web UI 準備就緒")
print("📝 注意事項:")
print(" - Web UI 會在 SSH remote 環境下自動啟用")
print(" - 本地環境會繼續使用 Qt GUI")
print(" - 支援即時命令執行和 WebSocket 通訊")
print(" - 提供現代化的深色主題界面")
return True, session_info
def test_environment_detection():
"""Test environment detection logic"""
print("🔍 測試環境檢測功能")
print("-" * 30)
try:
from server import is_ssh_session, can_use_gui
ssh_detected = is_ssh_session()
gui_available = can_use_gui()
print(f"SSH 環境檢測: {'' if ssh_detected else ''}")
print(f"GUI 可用性: {'' if gui_available else ''}")
if ssh_detected:
print("✅ 將使用 Web UI (適合 SSH remote 開發)")
else:
print("✅ 將使用 Qt GUI (本地環境)")
return True
except Exception as e:
print(f"❌ 環境檢測失敗: {e}")
return False
def test_mcp_integration():
"""Test MCP server integration"""
print("\n🔧 測試 MCP 整合功能")
print("-" * 30)
try:
from server import interactive_feedback
print("✅ MCP 工具函數可用")
# Test would require actual MCP call, so just verify import
print("✅ 準備接受來自 AI 助手的調用")
return True
except Exception as e:
print(f"❌ MCP 整合測試失敗: {e}")
return False
def interactive_demo(session_info):
"""Run interactive demo with the Web UI"""
print(f"\n🌐 Web UI 持久化運行模式")
print("=" * 50)
print(f"服務器地址: http://{session_info['manager'].host}:{session_info['manager'].port}")
print(f"測試會話: {session_info['url']}")
print("\n📖 操作指南:")
print(" 1. 在瀏覽器中開啟上面的測試 URL")
print(" 2. 嘗試以下功能:")
print(" - 點擊 '顯示命令區塊' 按鈕")
print(" - 輸入命令如 'echo Hello World' 並執行")
print(" - 在回饋區域輸入文字")
print(" - 使用 Ctrl+Enter 提交回饋")
print(" 3. 測試 WebSocket 即時通訊功能")
print("\n⌨️ 控制選項:")
print(" - 按 Enter 繼續運行")
print(" - 輸入 'q''quit' 停止服務器")
while True:
try:
user_input = input("\n>>> ").strip().lower()
if user_input in ['q', 'quit', 'exit']:
print("🛑 停止服務器...")
break
elif user_input == '':
print(f"🔄 服務器持續運行在: {session_info['url']}")
print(" 瀏覽器應該仍可正常訪問")
else:
print("❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出")
except KeyboardInterrupt:
print("\n🛑 收到中斷信號,停止服務器...")
break
print("✅ Web UI 測試完成")
if __name__ == "__main__":
print("Interactive Feedback MCP - Web UI 測試")
print("=" * 60)
# Check if user wants persistent mode
persistent_mode = len(sys.argv) > 1 and sys.argv[1] in ['--persistent', '-p', '--demo']
if not persistent_mode:
print("💡 提示: 使用 'python test_web_ui.py --persistent' 啟動持久化測試模式")
print()
# Test environment detection
env_test = test_environment_detection()
# Test MCP integration
mcp_test = test_mcp_integration()
# Test Web UI
web_test, session_info = test_web_ui()
print("\n" + "=" * 60)
if env_test and mcp_test and web_test:
print("🎊 所有測試完成!準備使用 Interactive Feedback MCP")
print("\n📖 使用方法:")
print(" 1. 在 Cursor/Cline 中配置此 MCP 服務器")
print(" 2. AI 助手會自動調用 interactive_feedback 工具")
print(" 3. 根據環境自動選擇 GUI 或 Web UI")
print(" 4. 提供回饋後繼續工作流程")
print("\n✨ Web UI 新功能:")
print(" - 支援 SSH remote 開發環境")
print(" - 現代化深色主題界面")
print(" - WebSocket 即時通訊")
print(" - 自動瀏覽器啟動")
print(" - 命令執行和即時輸出")
if persistent_mode and session_info:
interactive_demo(session_info)
else:
print("\n✅ 測試完成 - 系統已準備就緒!")
if session_info:
print(f"💡 您可以現在就在瀏覽器中測試: {session_info['url']}")
print(" (服務器會繼續運行一小段時間)")
time.sleep(10) # Keep running for a short time for immediate testing
else:
print("❌ 部分測試失敗,請檢查錯誤信息")
sys.exit(1)