diff --git a/.agent/rules/rules.md b/.agent/rules/rules.md index 9a88d21..9fcca07 100755 --- a/.agent/rules/rules.md +++ b/.agent/rules/rules.md @@ -48,6 +48,11 @@ trigger: always_on - **Browser**: Allowed for documentation and safe browsing. No automated logins without permission. - **Terminal**: No `rm -rf`. Run tests (`pytest` etc.) after logic changes. +## 7. Mandatory Testing Policy 🧪 +**CRITICAL: No logic or UI fix is complete without a corresponding automated test.** +- If you fix a regression or implement a new UI feature, you **MUST** write or update a test in `tests/test_dom.js` or `test_logic.js`. +- Refactoring MUST include verifying that no click listeners drop out. This guarantees that features like modal toggles stay functional. + ## 7. Requirements-Konsistenz 📋 Alle umgesetzten Anforderungen müssen mit `REQUIREMENTS.md` übereinstimmen. 1. **Vor der Umsetzung prüfen**: Passt die neue Anforderung zu den bestehenden Requirements? diff --git a/build-bookmarklet.sh b/build-bookmarklet.sh index 0cc89f3..7c004e0 100755 --- a/build-bookmarklet.sh +++ b/build-bookmarklet.sh @@ -258,6 +258,14 @@ if [ $LOGIC_EXIT -ne 0 ]; then exit 1 fi +echo "=== Running DOM Interaction Tests ===" +node "$SCRIPT_DIR/tests/test_dom.js" +DOM_EXIT=$? +if [ $DOM_EXIT -ne 0 ]; then + echo "❌ DOM UI tests FAILED! Regressions detected." + exit 1 +fi + echo "=== Running Build Tests ===" python3 "$SCRIPT_DIR/test_build.py" TEST_EXIT=$? diff --git a/changelog.md b/changelog.md index 064c122..937741d 100755 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,7 @@ +## v1.4.17 +- 🐛 **Bugfix**: Regression behoben: Der "Persönliche Highlights" (Stern-Button) Dialog öffnet sich nun wieder korrekt. +- 🧪 **Testing**: Es wurde ein initialer UI-Testing-Hook (`test_dom.js` mit `jsdom`) in die Build-Pipeline integriert, um kritische DOM Event-Listener Regressionen (wie den Highlights-Button und die Alarmglocke) automatisch zu preventen. + ## v1.4.16 - ⚡ **Feature**: Ein Button "Lokalen Cache leeren" wurde zum Versionen-Menü hinzugefügt, um bei hartnäckigen lokalen Fehlern alle Caches und Sessions bereinigen zu können, ohne die Entwicklertools (F12) des Browsers bemühen zu müssen. diff --git a/debug_test.js b/debug_test.js new file mode 100755 index 0000000..29940ac --- /dev/null +++ b/debug_test.js @@ -0,0 +1,15 @@ +const fs = require('fs'); +const jsCode = fs.readFileSync('kantine.js', 'utf8').replace('(function () {', '').replace(/}\)\(\);$/, ''); +try { + const vm = require('vm'); + new vm.Script(jsCode); +} catch (e) { + console.error(e.message); + const lines = jsCode.split('\n'); + console.error("Around line", e.loc?.line); + if(e.loc?.line) { + console.log(lines[e.loc.line - 2]); + console.log(lines[e.loc.line - 1]); + console.log(lines[e.loc.line]); + } +} diff --git a/kantine.js b/kantine.js index 7ab5ec9..981ab57 100755 --- a/kantine.js +++ b/kantine.js @@ -281,6 +281,18 @@ const historyModal = document.getElementById('history-modal'); const btnHistoryClose = document.getElementById('btn-history-close'); + if (btnHighlights) { + btnHighlights.addEventListener('click', () => { + highlightsModal.classList.remove('hidden'); + }); + } + + if (btnHighlightsClose) { + btnHighlightsClose.addEventListener('click', () => { + highlightsModal.classList.add('hidden'); + }); + } + btnHistory.addEventListener('click', () => { if (!authToken) { loginModal.classList.remove('hidden'); diff --git a/syntax_check.js b/syntax_check.js new file mode 100755 index 0000000..d0883d4 --- /dev/null +++ b/syntax_check.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +const jsCode = fs.readFileSync('kantine.js', 'utf8') + .replace('(function () {', '') + .replace('})();', '') + .replace('if (window.__KANTINE_LOADED) return;', ''); +const testCode = ` + console.log("TEST"); +`; +const code = jsCode + '\n' + testCode; +try { + const vm = require('vm'); + new vm.Script(code); +} catch (e) { + if(e.stack) { + console.log("Syntax error at:", e.stack.split('\n').slice(0,3).join('\n')); + } +} diff --git a/tests/test_dom.js b/tests/test_dom.js index faacbf1..30502e9 100755 --- a/tests/test_dom.js +++ b/tests/test_dom.js @@ -1,7 +1,12 @@ const fs = require('fs'); +fs.writeFileSync('trace.log', ''); +function log(m) { fs.appendFileSync('trace.log', m + '\n'); } + +log("Initializing JSDOM..."); const jsdom = require('jsdom'); const { JSDOM } = jsdom; +log("Reading html..."); const html = ` @@ -15,35 +20,80 @@ const html = ` + + + +