import { test } from 'node:test' import assert from 'node:assert/strict' import { readFileSync, statSync } from 'node:fs' import vm from 'node:vm' // Statische Pruefung des Einbau-Skripts public/embed/unterkunft.js (Task 16; Muster test/shopEmbedStatic.test.js). const QUELLE = readFileSync(new URL('../public/embed/unterkunft.js', import.meta.url), 'utf8') const OHNE_KOMMENTARE = QUELLE.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^|\s)\/\/.*$/gm, '$1') test('gueltiges JavaScript, unter 40 KB, IIFE mit use strict', () => { assert.doesNotThrow(() => new vm.Script(QUELLE, { filename: 'unterkunft.js' })) assert.ok(statSync(new URL('../public/embed/unterkunft.js', import.meta.url)).size < 40 * 1024) assert.match(OHNE_KOMMENTARE, /^\s*\(function \(\) \{\s*'use strict'/) }) test('kein innerHTML, outerHTML, insertAdjacentHTML, document.write, eval, new Function', () => { assert.doesNotMatch(OHNE_KOMMENTARE, /innerHTML|outerHTML|insertAdjacentHTML|document\.write|\beval\s*\(|new Function/) }) test('API-Pfad, Praefix .wku-, Style-Id, kein Storage, keine Cookies, keine Fremdadressen', () => { assert.ok(OHNE_KOMMENTARE.includes('/api/public/unterkunft/v1/')) assert.ok(OHNE_KOMMENTARE.includes('wku-style')) assert.match(OHNE_KOMMENTARE, /\.wku-root/) assert.doesNotMatch(OHNE_KOMMENTARE, /localStorage|sessionStorage|document\.cookie|https?:\/\//) }) test('Pflichttexte und Honeypot', () => { for (const t of ['Anfragen gerne per Telefon oder E-Mail.', 'Bitte wählen Sie Anreise und Abreise im Kalender.', 'Anfrage senden', 'kontakt_url', 'formToken']) assert.ok(QUELLE.includes(t), t) assert.match(QUELLE, /Danke! Ihre Anfrage/) }) // F1 (Abschluss): kein @layer (Seitenregeln wuerden gewinnen), jede Regel unter .wku-root, Reset der Formularelemente. test('CSS-Isolation: kein @layer, jeder Selektor beginnt mit .wku-root, all:revert fuer Elemente, Fenster +600 Tage', () => { assert.doesNotMatch(OHNE_KOMMENTARE, /@layer/) const m = QUELLE.match(/var CSS = \[([\s\S]*?)\]\.join\(''\)/) assert.ok(m) const css = [...m[1].matchAll(/'((?:[^'\\]|\\.)*)'/g)].map((x) => x[1]).join('') const flach = css.replace(/@(container|media|supports)[^{]*\{/g, '') const regeln = [...flach.matchAll(/([^{}]+)\{[^{}]*\}/g)].map((x) => x[1]) assert.ok(regeln.length > 40) for (const sel of regeln) for (const teil of sel.split(/,(?![^(]*\))/)) assert.match(teil.trim(), /^\.wku-root(?![\w-])/, teil) assert.match(css, /\.wku-root :is\(button,input,select,textarea[^)]*\)\{all:revert/) assert.match(css, /\.wku-root\{[^}]*width:100%/) assert.ok(OHNE_KOMMENTARE.includes('plusTage(von, 600)')) })