/* * Pruefungen der Benutzerfelder: laeuft mit `npm test` im Verzeichnis server/. * * Der eigentliche Zweck ist der letzte Block: die Liste der Farbwelten steht * zweimal - hier in userFields.js (das Backend weist Unbekanntes ab) und in * src/types.ts (das Frontend baut daraus die Auswahl). Laufen die beiden * auseinander, faellt es sonst niemandem auf: das Auswahlfeld zeigt ein Design * an, das Speichern schlaegt fehl, und die Oberflaeche bleibt beim alten * Aussehen. */ import { readFileSync } from 'node:fs'; const { normalizeTheme, normalizeThemeMode, normalizeColor, THEMES, THEME_MODES } = await import( '../src/userFields.js' ); let failures = 0; function check(name, condition, detail = '') { if (condition) { console.log(` ok ${name}${detail ? ` - ${detail}` : ''}`); } else { console.log(` FAIL ${name}${detail ? ` - ${detail}` : ''}`); failures += 1; } } console.log('\nFarbwelt'); check('Bekanntes Design', normalizeTheme('pixel').value === 'pixel'); check('Gross geschrieben', normalizeTheme('Outdoor').value === 'outdoor'); check('Mit Leerzeichen', normalizeTheme(' perinco ').value === 'perinco'); check('Leer wird null', normalizeTheme('').value === null); check('null bleibt null', normalizeTheme(null).value === null); check('Unbekanntes wird abgewiesen', Boolean(normalizeTheme('barbie').error)); check( 'Die Fehlermeldung nennt die erlaubten Werte', (normalizeTheme('barbie').error ?? '').includes('outdoor') ); console.log('\nModus'); check('hell', normalizeThemeMode('light').value === 'light'); check('dunkel', normalizeThemeMode('dark').value === 'dark'); check('Leer heisst "folgt dem System"', normalizeThemeMode('').value === null); check('Unbekanntes wird abgewiesen', Boolean(normalizeThemeMode('auto').error)); console.log('\nFarbe (unveraendert, als Regressionsschutz)'); check('Hex wird angenommen', normalizeColor('#6BA04A').value === '#6ba04a'); check('Kurzform wird abgewiesen', Boolean(normalizeColor('#fff').error)); console.log('\nBackend und Frontend kennen dieselben Designs'); const types = readFileSync(new URL('../../src/types.ts', import.meta.url), 'utf8'); const match = /export const THEME_PALETTES = \[([^\]]*)\]/.exec(types); check('THEME_PALETTES in src/types.ts gefunden', Boolean(match)); if (match) { const frontend = [...match[1].matchAll(/'([^']+)'/g)].map((entry) => entry[1]); check( 'Beide Listen sind gleich', JSON.stringify(frontend) === JSON.stringify(THEMES), `Frontend ${JSON.stringify(frontend)} / Backend ${JSON.stringify(THEMES)}` ); } check('Es gibt genau zwei Modi', THEME_MODES.length === 2); console.log( failures === 0 ? '\nAlle Pruefungen bestanden.' : `\n${failures} Pruefung(en) fehlgeschlagen.` ); process.exit(failures === 0 ? 0 : 1);