From 38fc197d4e9ec5d957578eb89903c6b3349b721c Mon Sep 17 00:00:00 2001 From: Masterluke77 <163446896+Masterluke77@users.noreply.github.com> Date: Sun, 12 Jul 2026 02:51:43 +0200 Subject: [PATCH] test(ux): add inventory workspace release gate --- .../verify-inventory-workspace-ux-1.44.0.mjs | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 tools/verify-inventory-workspace-ux-1.44.0.mjs diff --git a/tools/verify-inventory-workspace-ux-1.44.0.mjs b/tools/verify-inventory-workspace-ux-1.44.0.mjs new file mode 100644 index 0000000..bf37555 --- /dev/null +++ b/tools/verify-inventory-workspace-ux-1.44.0.mjs @@ -0,0 +1,104 @@ +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/inventory-workspace.js'); +const css = read('public/inventory-workspace.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) => { + for (const value of values) expect(source.includes(value), `${label}: ${value}`); +}; + +includesAll(html, [ + 'id="inventory"', + 'class="inventory-header"', + 'id="inv-add-location-btn"', + 'id="inv-stats"', + 'id="inv-locations"', + 'id="inv-detail"', + 'id="inv-back"', + 'id="inv-detail-title"', + 'id="inv-rename-btn"', + 'id="inv-move-btn"', + 'id="inv-detail-list"', +], 'Bestehender Lagerverwaltungsvertrag fehlt'); + +includesAll(runtime, [ + 'inventory-workspace.css?v=1.44.0', + 'inventory-workspace.js?v=1.44.0', + 'data-ux-inventory-workspace', + 'loadInventoryWorkspaceAssets()', +], 'Theme-Runtime bindet die Lager-UX nicht vollständig ein'); + +expect(pkg.scripts?.['verify:inventory-workspace'] === 'node tools/verify-inventory-workspace-ux-1.44.0.mjs', 'verify:inventory-workspace Script fehlt'); +expect(pkg.scripts?.['verify:all']?.includes('npm run verify:inventory-workspace'), 'verify:all enthält das Lager-UX-Gate nicht'); + +includesAll(js, [ + 'ux-inventory-overview', + 'ux-inventory-metrics', + 'data-ux-inventory-metric', + 'data-ux-inventory-next', + 'ux-inventory-toolbar', + 'data-ux-inventory-search', + 'data-ux-inventory-filter', + 'data-ux-inventory-sort', + 'ux-inventory-needs-attention', + 'ux-inventory-detail-toolbar', + 'data-ux-inventory-detail-search', + 'data-ux-inventory-select-all', + 'ux-inventory-selection-bar', + 'ux-inventory-more-actions', + 'inv-item-check', + 'MutationObserver', + 'requestAnimationFrame', + 'scrollIntoView', + 'aria-pressed', + 'ArrowLeft', + 'ArrowRight', +], 'Lager-UX-Vertrag fehlt'); + +includesAll(css, [ + '#inventory.ux-inventory-ready', + '.ux-inventory-overview', + '.ux-inventory-metrics', + '.ux-inventory-toolbar', + '.ux-inventory-filter-group', + '.ux-inventory-needs-attention', + '.ux-inventory-detail-toolbar', + '.ux-inventory-selection-bar', + '.ux-inventory-more-actions', + '@media (max-width: 700px)', + '@media (max-width: 470px)', + '@media (prefers-reduced-motion: reduce)', + ':focus-visible', + 'var(--', +], 'Lager-UX-CSS-Vertrag fehlt'); + +expect(!/\bfetch\s*\(/.test(js), 'Additive Lager-UX darf keine eigenen Netzwerkaufrufe ausführen'); +expect(!/\bapi\s*\(/.test(js), 'Additive Lager-UX darf die Vendoo-API nicht direkt aufrufen'); +expect(!/\.innerHTML\s*=/.test(js), 'Lager-UX darf keine innerHTML-Zuweisungen verwenden'); +expect(!/\.outerHTML\s*=/.test(js), 'Lager-UX darf keine outerHTML-Zuweisungen verwenden'); +expect(!/\.onclick\s*=/.test(js), 'Lager-UX darf keine onclick-Zuweisungen verwenden'); +expect(!/confirm\s*\(/.test(js), 'Gefährliche Lageraktionen müssen in der bestehenden geprüften Logik bleiben'); +expect(!/prompt\s*\(/.test(js), 'Eingaben für Lageränderungen müssen in der bestehenden geprüften Logik bleiben'); +expect(!/\b(?:DELETE|PATCH|POST|PUT)\b/.test(js), 'Lager-UX darf keine Schreiboperationen implementieren'); +expect(!/bulk-location/.test(js), 'Lager-UX darf die Bulk-Location-API nicht direkt verwenden'); +expect(!/loadInventory\s*\(/.test(js), 'Lager-UX darf den produktiven Ladevorgang nicht direkt auslösen'); +expect(!/showInventoryDetail\s*\(/.test(js), 'Lager-UX darf die produktive Detailfunktion nicht direkt aufrufen'); +expect(!/state\./.test(js), 'Additive Lager-UX darf den produktiven Vendoo-State nicht direkt verändern'); + +if (failures.length) { + console.error('Inventory Workspace UX Gate fehlgeschlagen:'); + for (const failure of failures) console.error(`- ${failure}`); + process.exit(1); +} + +console.log('Inventory Workspace UX Gate bestanden.'); \ No newline at end of file