Files
Webklar-Kundenbereich/test/analyseLegal.test.js
T
ClaudeandClaude Opus 5.5 07a4e153bf Datenschutzerklärung Stand 17.10.2026: Abschnitt 4a Reichweitenmessung auf webklar.com, PDF neu
- Abschnitt 4: eigene Website-Analyse auf webklar.com statt "keine Analyse-Werkzeuge", Eintrag wk-consent.
- Abschnitt 4a: Rolle (WEBklar selbst Verantwortlicher), Daten ohne und mit Einwilligung, Rechtsgrundlagen,
  Widerruf, Fristen, Verweis auf webklar.com/datenschutz-analyse.html.
- Abschnitt 5: Kontaktformular-Anfragen gehen seit 17.10.2026 auch per Mail an das eigene Postfach.
- Abschnitt 13: Einwilligung nur für die erweiterte Reichweitenmessung.
- Archiv: Banner-Fassung eigen 2026-10-17 und Kopie der Zusatzseite von webklar.com.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 18:34:06 +00:00

90 lines
4.5 KiB
JavaScript

import { test, after } from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { fileURLToPath } from 'node:url'
import express, { Router } from 'express'
import { useTestEnv } from './support/testEnv.js'
useTestEnv({ appwriteUrl: 'http://127.0.0.1:1', stripeUrl: 'http://127.0.0.1:1' })
const { config } = await import('../server/config.js')
const { startTestApp } = await import('./support/testApp.js')
const { analyseLegalRouter, legalPaths, legalPdfFiles, legalPdfAttachments } = await import('../server/services/analyseLegal.js')
const core = await import('../analytics/client/core.js')
const root = (rel) => new URL(`../${rel}`, import.meta.url)
const V = '2026-10-02'
// wie in server/index.js: erst die Router für Adressen ohne Fassung, dann express.static
const rechtliches = Router()
rechtliches.use(analyseLegalRouter())
rechtliches.use(express.static(fileURLToPath(new URL('../public/rechtliches/', import.meta.url))))
const app = await startTestApp({ '/rechtliches': rechtliches })
after(() => app.close())
const fetchBytes = async (path) => {
const r = await fetch(app.url + path)
return { status: r.status, body: Buffer.from(await r.arrayBuffer()) }
}
test('legalPaths und legalPdfFiles nennen feste Adressen und Dateinamen', () => {
assert.deepEqual(legalPaths(V), {
avv: `/rechtliches/avv-website-analyse-${V}.html`,
lb: `/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`,
})
const f = legalPdfFiles(V)
assert.equal(f.avv.filename, `AVV-Website-Analyse-${V}.pdf`)
assert.equal(f.lb.filename, `Leistungsbeschreibung-Website-Analyse-${V}.pdf`)
assert.throws(() => legalPaths('../x'))
})
test('Adressen ohne Fassung liefern die Bytes der Fassung aus config.analyse.avvVersion', async () => {
assert.equal(config.analyse.avvVersion, V)
const a = await fetchBytes('/rechtliches/avv-website-analyse.html')
assert.equal(a.status, 200)
assert.deepEqual(a.body, readFileSync(root(`public/rechtliches/avv-website-analyse-${V}.html`)))
const l = await fetchBytes('/rechtliches/leistungsbeschreibung-website-analyse.html')
assert.equal(l.status, 200)
assert.deepEqual(l.body, readFileSync(root(`public/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`)))
})
test('versionierte Adresse 200, unbekannte Fassung 404', async () => {
assert.equal((await fetchBytes(`/rechtliches/avv-website-analyse-${V}.html`)).status, 200)
assert.equal((await fetchBytes(`/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`)).status, 200)
assert.equal((await fetchBytes('/rechtliches/avv-website-analyse-2026-01-01.html')).status, 404)
})
test('PDFs: beginnen mit %PDF, > 20 KB, Anhänge mit richtigen Dateinamen', async () => {
const att = await legalPdfAttachments(V)
assert.equal(att.length, 2)
assert.deepEqual(att.map((a) => a.filename), [`AVV-Website-Analyse-${V}.pdf`, `Leistungsbeschreibung-Website-Analyse-${V}.pdf`])
for (const a of att) {
assert.equal(a.contentType, 'application/pdf')
assert.equal(a.content.subarray(0, 4).toString(), '%PDF')
assert.ok(a.content.length > 20 * 1024)
}
await assert.rejects(legalPdfAttachments('2026-01-01'))
})
test('Banner-Archiv: Text und aria-label wortgleich zu core.js, README nennt BANNER_VERSION', () => {
const md = readFileSync(root(`docs/rechtliches/archiv/banner-${V}.md`), 'utf8')
assert.ok(md.includes(core.BANNER_TEXT))
assert.ok(md.includes(core.BANNER_ARIA))
assert.equal(core.BANNER_VERSION, V)
assert.ok(md.includes('BANNER_VERSION'))
assert.ok(readFileSync(root('docs/rechtliches/archiv/README.md'), 'utf8').includes('BANNER_VERSION'))
assert.deepEqual(
readFileSync(root(`docs/rechtliches/archiv/datenschutz-analyse-${V}.html`)),
readFileSync(root('runner/src/templates/datenschutz-analyse.html'))
)
})
test('Banner-Archiv eigene Website: Sie-Fassung wortgleich zu core.js, README nennt BANNER_VERSION_EIGEN', () => {
const v = core.BANNER_VERSION_EIGEN
const md = readFileSync(root(`docs/rechtliches/archiv/banner-eigen-${v}.md`), 'utf8')
assert.ok(md.includes(core.BANNER_TEXT_EIGEN))
assert.ok(md.includes(`BANNER_VERSION_EIGEN\`: ${v}`))
const readme = readFileSync(root('docs/rechtliches/archiv/README.md'), 'utf8')
assert.ok(readme.includes('BANNER_VERSION_EIGEN') && readme.includes(`datenschutz-analyse-webklar-com-${v}.html`))
const seite = readFileSync(root(`docs/rechtliches/archiv/datenschutz-analyse-webklar-com-${v}.html`), 'utf8')
assert.ok(seite.includes(`Stand ${v.slice(8, 10)}.${v.slice(5, 7)}.${v.slice(0, 4)}`), 'Stand der Zusatzseite = Fassung')
})