Web-Anwendung: Design-Tokens, Texte, Gesundheitsendpunkt

Design-Tokens aus docs/10-design-system.md als CSS-Variablen: Grundpalette,
die sechs Klassifizierungsfarben, Eckenradius durchgehend 2 px, keine Schatten
ausser dem Fokusring. Der Schwärzungsbalken mit dem einmaligen Durchwischen
respektiert prefers-reduced-motion. Vier Tests halten die Tokens gegen das
Dokument.

IBM Plex selbst gehostet als woff2, latin und latin-ext getrennt über
unicode-range, font-display: swap, immutable-Cache.

Alle Oberflächentexte in lib/i18n/de.ts. Ein Test durchsucht app/ und
components/ nach Umlauten im JSX und schlägt fehl, wenn dort deutscher Text
steht. Er hat beim ersten Lauf gleich einen Verstoss gefunden.

/api/health prüft Datenbank, Discord-Gateway und ClamAV. Die Gesamtbewertung
fällt nur auf "down", wenn die Datenbank weg ist: die anderen Dienste haben
eigene Healthchecks im Stack, und ein ausgefallener Virenscanner soll nicht
den Web-Container als tot markieren.

Strikte CSP mit Nonce, kein unsafe-inline für Skripte. Die erste Route liegt
bei 100 kB JavaScript nach Kompression, Budget sind 120 kB.
This commit is contained in:
Harlekin
2026-09-01 00:01:41 +02:00
parent 8f0644e053
commit ade977538d
38 changed files with 1343 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
import { describe, expect, it, vi } from 'vitest'
vi.mock('@/lib/db', () => ({
db: {
$queryRaw: vi.fn(async () => [{ '?column?': 1 }]),
serviceHeartbeat: { findUnique: vi.fn(async () => ({ service: 'worker', status: 'up', detail: null, at: new Date() })) },
},
}))
vi.mock('@/lib/env', () => ({
getEnv: () => ({ CLAMAV_SOCKET: '/var/run/clamav/clamd.sock' }),
}))
vi.mock('@/lib/health/clamav', () => ({ pingClamav: vi.fn(async () => true) }))
describe('collectHealth', () => {
it('meldet betriebsbereit, wenn alle drei Abhaengigkeiten antworten', async () => {
const { collectHealth } = await import('@/lib/health/check')
const report = await collectHealth()
expect(report.status).toBe('up')
expect(report.components.database.status).toBe('up')
expect(report.components.discordGateway.status).toBe('up')
expect(report.components.clamav.status).toBe('up')
})
it('bleibt nur eingeschraenkt, wenn allein die Virenpruefung ausfaellt', async () => {
const clamav = await import('@/lib/health/clamav')
vi.mocked(clamav.pingClamav).mockResolvedValueOnce(false)
const { collectHealth } = await import('@/lib/health/check')
const report = await collectHealth()
expect(report.status).toBe('degraded')
})
})