Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 42s
CI / test-go-edu-search (push) Successful in 34s
CI / test-python-klausur (push) Failing after 2m51s
CI / test-python-agent-core (push) Successful in 21s
CI / test-nodejs-website (push) Successful in 29s
sed replacement left orphaned hostname references in story page and empty lines in getApiBase functions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
83 lines
2.7 KiB
TypeScript
83 lines
2.7 KiB
TypeScript
import type { CoverageData } from '../types'
|
|
|
|
export function CoverageChart({ data }: { data: CoverageData[] }) {
|
|
if (data.length === 0) {
|
|
return (
|
|
<div className="text-center py-8 text-slate-400">
|
|
Keine Coverage-Daten verfuegbar
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const sortedData = [...data].sort((a, b) => b.coverage_percent - a.coverage_percent)
|
|
|
|
return (
|
|
<div className="space-y-3">
|
|
{sortedData.map((item) => (
|
|
<div key={item.service}>
|
|
<div className="flex items-center justify-between text-sm mb-1">
|
|
<span className="text-slate-600 truncate max-w-[200px]">{item.display_name}</span>
|
|
<span
|
|
className={`font-medium ${
|
|
item.coverage_percent >= 80 ? 'text-emerald-600' : item.coverage_percent >= 60 ? 'text-amber-600' : 'text-red-600'
|
|
}`}
|
|
>
|
|
{item.coverage_percent.toFixed(1)}%
|
|
</span>
|
|
</div>
|
|
<div className="h-2 bg-slate-100 rounded-full overflow-hidden">
|
|
<div
|
|
className={`h-full rounded-full transition-all ${
|
|
item.coverage_percent >= 80 ? 'bg-emerald-500' : item.coverage_percent >= 60 ? 'bg-amber-500' : 'bg-red-500'
|
|
}`}
|
|
style={{ width: `${item.coverage_percent}%` }}
|
|
/>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export function FrameworkDistribution({ data }: { data: Record<string, number> }) {
|
|
const total = Object.values(data).reduce((a, b) => a + b, 0)
|
|
if (total === 0) return null
|
|
|
|
const frameworkLabels: Record<string, string> = {
|
|
go_test: 'Go Tests',
|
|
pytest: 'Python (pytest)',
|
|
jest: 'Jest (TS)',
|
|
vitest: 'Vitest (SDK)',
|
|
playwright: 'Playwright (E2E)',
|
|
bqas_golden: 'BQAS Golden',
|
|
bqas_rag: 'BQAS RAG',
|
|
bqas_synthetic: 'BQAS Synthetic',
|
|
}
|
|
|
|
const frameworkColors: Record<string, string> = {
|
|
go_test: 'bg-cyan-500',
|
|
pytest: 'bg-yellow-500',
|
|
jest: 'bg-blue-500',
|
|
vitest: 'bg-orange-500',
|
|
playwright: 'bg-purple-500',
|
|
bqas_golden: 'bg-emerald-500',
|
|
bqas_rag: 'bg-teal-500',
|
|
bqas_synthetic: 'bg-amber-500',
|
|
}
|
|
|
|
return (
|
|
<div className="space-y-3">
|
|
{Object.entries(data)
|
|
.sort((a, b) => b[1] - a[1])
|
|
.map(([framework, count]) => (
|
|
<div key={framework} className="flex items-center gap-3">
|
|
<div className={`w-3 h-3 rounded-full ${frameworkColors[framework] || 'bg-slate-400'}`} />
|
|
<span className="text-sm text-slate-600 flex-1">{frameworkLabels[framework] || framework}</span>
|
|
<span className="text-sm font-medium text-slate-900">{count}</span>
|
|
<span className="text-xs text-slate-400">({((count / total) * 100).toFixed(0)}%)</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
)
|
|
}
|