'use client' import type { ServiceTestInfo } from '../types' export interface ServiceProgress { current_file: string files_done: number files_total: number passed: number failed: number status: string } export function ServiceTestCard({ service, onRun, isRunning, progress, }: { service: ServiceTestInfo onRun: (service: string) => void isRunning: boolean progress?: ServiceProgress }) { const passRate = service.total_tests > 0 ? (service.passed_tests / service.total_tests) * 100 : 0 const getLanguageIcon = (lang: string) => { switch (lang) { case 'go': return '🐹' case 'python': return '🐍' case 'typescript': return '📘' case 'mixed': return '🔀' default: return '📦' } } const getStatusColor = (status: string) => { switch (status) { case 'passed': return 'bg-emerald-100 text-emerald-700' case 'failed': return 'bg-red-100 text-red-700' case 'running': return 'bg-blue-100 text-blue-700' default: return 'bg-slate-100 text-slate-700' } } return (
{getLanguageIcon(service.language)}

{service.display_name}

{service.port ? `Port ${service.port}` : 'Library'} • {service.language}

{service.status === 'passed' ? 'Bestanden' : service.status === 'failed' ? 'Fehler' : 'Ausstehend'}
Pass Rate {passRate.toFixed(0)}%
= 80 ? 'bg-emerald-500' : passRate >= 60 ? 'bg-amber-500' : 'bg-red-500' }`} style={{ width: `${passRate}%` }} />

{service.total_tests}

Tests

{service.passed_tests}

Bestanden

{service.failed_tests}

Fehler

{service.coverage_percent && (
Coverage = 70 ? 'text-emerald-600' : 'text-amber-600'}`}> {service.coverage_percent.toFixed(1)}%
)} {/* Progress-Anzeige wenn Tests laufen */} {isRunning && progress && progress.status === 'running' && (
{progress.current_file || 'Starte...'} {progress.files_done}/{progress.files_total} Dateien
0 ? (progress.files_done / progress.files_total) * 100 : 0}%` }} />
{progress.passed} bestanden {progress.failed} fehler
)}
) }