test(ux): Settings-Control-Center-Vertrag ergänzen
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
const root = process.cwd();
|
||||
const read = relative => fs.readFileSync(path.join(root, relative), 'utf8');
|
||||
const js = read('public/settings-control-center.js');
|
||||
const css = read('public/settings-control-center.css');
|
||||
const runtime = read('public/design-system/theme-runtime.js');
|
||||
const html = read('public/index.html');
|
||||
const pkg = JSON.parse(read('package.json'));
|
||||
|
||||
const failures = [];
|
||||
const expect = (condition, message) => { if (!condition) failures.push(message); };
|
||||
const includesAll = (source, values, label) => values.forEach(value => expect(source.includes(value), `${label}: ${value}`));
|
||||
|
||||
includesAll(html, [
|
||||
'id="settings"', 'class="settings-hero"', 'class="settings-shell"', 'class="settings-nav"',
|
||||
'data-settings-panel="general"', 'data-settings-panel="appearance"', 'data-settings-panel="ai"',
|
||||
'data-settings-panel="marketplaces"', 'data-settings-panel="flux"',
|
||||
'id="settings-ai-status-text"', 'id="settings-flux-status-text"',
|
||||
'id="etsy-status-badge"', 'id="ebay-status-badge"', 'id="save-settings-btn"'
|
||||
], 'Bestehender Einstellungen-Vertrag fehlt');
|
||||
|
||||
includesAll(runtime, [
|
||||
'settings-control-center.css?v=1.44.0',
|
||||
'settings-control-center.js?v=1.44.0',
|
||||
'data-ux-settings-control-center',
|
||||
'loadSettingsControlCenterAssets()'
|
||||
], 'Theme-Runtime bindet das Settings-Control-Center nicht vollständig ein');
|
||||
|
||||
expect(pkg.scripts?.['verify:settings-control-center'] === 'node tools/verify-settings-control-center-ux-1.44.0.mjs', 'verify:settings-control-center Script fehlt');
|
||||
expect(pkg.scripts?.['verify:all']?.includes('npm run verify:settings-control-center'), 'verify:all enthält das Settings-Gate nicht');
|
||||
|
||||
includesAll(js, [
|
||||
'ux-settings-control-center-ready', 'ux-settings-command', 'ux-settings-search-input',
|
||||
'ux-settings-search-result', 'ux-settings-health', 'ux-settings-health-card',
|
||||
'ux-settings-category-grid', 'ux-settings-category-card', 'ux-settings-advanced',
|
||||
'data-ux-settings-category', 'data-ux-settings-health',
|
||||
'settings-ai-status-text', 'settings-flux-status-text', 'etsy-status-badge', 'ebay-status-badge',
|
||||
'MutationObserver', 'requestAnimationFrame', 'scrollIntoView', 'aria-live', 'aria-pressed',
|
||||
'localStorage', 'prefers-reduced-motion'
|
||||
], 'Settings-Control-Center-JS-Vertrag fehlt');
|
||||
|
||||
includesAll(css, [
|
||||
'#settings.ux-settings-control-center-ready', '.ux-settings-command', '.ux-settings-search',
|
||||
'.ux-settings-health-card', '.ux-settings-category-grid', '.ux-settings-category-card',
|
||||
'.ux-settings-advanced', '.ux-settings-search-hit', '.settings-savebar',
|
||||
'@media (max-width:1100px)', '@media (max-width:780px)', '@media (max-width:520px)',
|
||||
'@media (prefers-reduced-motion:reduce)', ':focus-visible', 'var(--'
|
||||
], 'Settings-Control-Center-CSS-Vertrag fehlt');
|
||||
|
||||
expect(!/\bfetch\s*\(/.test(js), 'Additive Settings-UX darf keine eigenen Netzwerkaufrufe ausführen');
|
||||
expect(!/\bapi\s*\(/.test(js), 'Additive Settings-UX darf die Vendoo-API nicht direkt aufrufen');
|
||||
expect(!/\.innerHTML\s*=/.test(js), 'Settings-UX darf keine innerHTML-Zuweisungen verwenden');
|
||||
expect(!/\.outerHTML\s*=/.test(js), 'Settings-UX darf keine outerHTML-Zuweisungen verwenden');
|
||||
expect(!/\.onclick\s*=/.test(js), 'Settings-UX darf keine onclick-Zuweisungen verwenden');
|
||||
expect(!/confirm\s*\(/.test(js), 'Gefährliche Aktionen müssen in der bestehenden geprüften Logik bleiben');
|
||||
expect(!/\b(?:DELETE|PATCH|POST|PUT)\b/.test(js), 'Settings-UX darf keine Schreiboperationen implementieren');
|
||||
expect(!/saveSettings\s*\(/.test(js), 'Settings-UX darf Einstellungen nicht selbst speichern');
|
||||
expect(!/testLocalImageProvider\s*\(/.test(js), 'Settings-UX darf FLUX-Tests nicht selbst ausführen');
|
||||
expect(!/setInterval\s*\(/.test(js), 'Settings-UX darf keinen eigenen Polling-Zyklus starten');
|
||||
expect(!/state\.[a-zA-Z]/.test(js), 'Additive Settings-UX darf produktiven App-State nicht direkt verändern');
|
||||
|
||||
if (failures.length) {
|
||||
console.error('Settings Control Center UX Gate fehlgeschlagen:');
|
||||
failures.forEach(failure => console.error(`- ${failure}`));
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('Settings Control Center UX Gate bestanden.');
|
||||
Reference in New Issue
Block a user