import React, { useState } from 'react'; import { Plus, Search, Play, Copy, Trash2, Zap, MessageSquare, Mic, AlertTriangle, ClipboardCheck, X } from 'lucide-react'; import { Button, Input, Card, Badge, Dialog } from '../components/UI'; import { mockAutoTestAssistants, mockAssistants } from '../services/mockData'; import { AutoTestAssistant, TestType, TestMethod } from '../types'; export const AutoTestPage: React.FC = () => { const [testAssistants, setTestAssistants] = useState(mockAutoTestAssistants); const [searchTerm, setSearchTerm] = useState(''); const [selectedId, setSelectedId] = useState(null); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [deleteId, setDeleteId] = useState(null); const [copySuccess, setCopySuccess] = useState(false); const filteredTests = testAssistants.filter(t => t.name.toLowerCase().includes(searchTerm.toLowerCase()) ); const selectedTest = testAssistants.find(t => t.id === selectedId) || null; const handleCreate = () => { const newId = crypto.randomUUID(); const newTest: AutoTestAssistant = { id: newId, name: '新测试任务', type: TestType.FIXED, method: TestMethod.TEXT, targetAssistantId: mockAssistants[0]?.id || '', fixedWorkflowSteps: [], intelligentPrompt: '', createdAt: new Date().toISOString().split('T')[0], }; setTestAssistants([newTest, ...testAssistants]); setSelectedId(newId); }; const handleCopy = (e: React.MouseEvent, test: AutoTestAssistant) => { e.stopPropagation(); const newId = crypto.randomUUID(); const newTest: AutoTestAssistant = { ...test, id: newId, name: `${test.name} (复制)`, createdAt: new Date().toISOString().split('T')[0], }; setTestAssistants([newTest, ...testAssistants]); setSelectedId(newId); }; const updateTest = (field: keyof AutoTestAssistant, value: any) => { if (!selectedId) return; setTestAssistants(prev => prev.map(t => t.id === selectedId ? { ...t, [field]: value } : t)); }; const handleDeleteClick = (e: React.MouseEvent, id: string) => { e.stopPropagation(); setDeleteId(id); setIsDeleteModalOpen(true); }; const confirmDelete = () => { if (deleteId) { setTestAssistants(prev => prev.filter(t => t.id !== deleteId)); if (selectedId === deleteId) setSelectedId(null); setIsDeleteModalOpen(false); setDeleteId(null); } }; const handleCopyId = (id: string) => { navigator.clipboard.writeText(id); setCopySuccess(true); setTimeout(() => setCopySuccess(false), 2000); }; return (
{/* Left List */}

测试助手列表

setSearchTerm(e.target.value)} />
{filteredTests.map(test => (
setSelectedId(test.id)} className={`group relative flex flex-col p-4 rounded-xl border transition-all cursor-pointer ${ selectedId === test.id ? 'bg-primary/10 border-primary/40 shadow-[0_0_15px_rgba(6,182,212,0.15)]' : 'bg-card/30 border-white/5 hover:bg-white/5 hover:border-white/10' }`} >
{test.name}
{test.type === TestType.FIXED ? '固定' : '智能'}
创建于: {test.createdAt}
{/* Hover Actions Toolbar */}
))} {filteredTests.length === 0 && (
未找到测试助手
)}
{/* Right Config Panel */}
{selectedTest ? (
updateTest('name', e.target.value)} className="font-bold bg-white/5 border-white/10 focus:border-primary/50 text-base" />
{/* Basic Config */}
{/* Test Logic Type */}
updateTest('type', TestType.FIXED)} >
固定流程

按照预设的消息序列依次发送给目标小助手,验证其回复是否符合预期。

updateTest('type', TestType.INTELLIGENT)} >
智能提示词

由 AI 扮演用户,根据设定的角色和场景与目标小助手进行动态对话。

{/* Content Config */} {selectedTest.type === TestType.FIXED ? (
{selectedTest.fixedWorkflowSteps.map((step, idx) => (
{idx + 1}
{ const newSteps = [...selectedTest.fixedWorkflowSteps]; newSteps[idx] = e.target.value; updateTest('fixedWorkflowSteps', newSteps); }} placeholder="输入用户消息..." />
))}
) : (