diff --git a/runner/src/analytics-inject.js b/runner/src/analytics-inject.js index bc92d3d..43fb3b2 100644 --- a/runner/src/analytics-inject.js +++ b/runner/src/analytics-inject.js @@ -17,20 +17,47 @@ export function scriptTag(analytics, baseUrl) { return ``; } +// Spannen, in denen Marker nichts zu suchen haben: Kommentare, script, style, textarea, template (ohne Verschachtelungs-Logik). +function findSpans(s) { + const spans = []; + const re = /', m.index + 4); + end = e < 0 ? s.length : e + 3; + kind = 'comment'; + } else { + const close = new RegExp(`${m[1]}\\s*>`, 'ig'); + close.lastIndex = m.index + m[0].length; + const c = close.exec(s); + end = c ? c.index + c[0].length : s.length; + if (m[1].toLowerCase() === 'script') kind = 'script'; + } + spans.push({ start: m.index, end, kind }); + re.lastIndex = end; + } + return spans; +} + // Arbeitet auf latin1-Zeichenketten (1 Byte = 1 Zeichen), damit beliebige Kodierungen byte-genau erhalten bleiben. export function injectIntoHtml(buf, tag) { let s = buf.toString('latin1'); - const old = /
'); + put(d, 'b.html', ''); + put(d, 'c.html', 'x
'); + put(d, 'd.html', ''); + await injectAnalytics(d, A(), { baseUrl: BASE }); + assert.equal(get(d, 'a.html'), `${TAG}`); + assert.equal(get(d, 'b.html'), `${TAG}`); + assert.equal(get(d, 'c.html'), `${TAG}x
`); + assert.equal(get(d, 'd.html'), `${TAG}`); +}); + +test('alter Tag im Kommentar wird nicht ersetzt; echter wird genau einmal eingesetzt', async () => { + const d = dir(); + const old = ''; + put(d, 'a.html', ``); + await injectAnalytics(d, A(), { baseUrl: BASE }); + assert.equal(get(d, 'a.html'), `${TAG}`); +}); + +test('5-MB-Grenze: genau 5 MB wird bearbeitet', async () => { + const d = dir(); + const b = Buffer.alloc(5 * 1024 * 1024, 0x20); b.write('', 0); + writeFileSync(join(d, 'g.html'), b); + await injectAnalytics(d, A(), { baseUrl: BASE }); + assert.ok(get(d, 'g.html').includes('data-wk-analytics')); +}); + +test('validateJob: Adresse nur Leerraum ⇒ leer, sonst getrimmt', () => { + const base = { sub: 'demo', repo: 'JUSN/demo', sha: 'abcdef1', branch: 'main' }; + const r = validateJob({ ...base, analytics: A({ privacy: { company: 'F', email: 'e@x.de', address: ' ' } }) }); + assert.equal(r.job.analytics.privacy.address, ''); + const r2 = validateJob({ ...base, analytics: A({ privacy: { company: 'F', email: 'e@x.de', address: ' Weg 1 ' } }) }); + assert.equal(r2.job.analytics.privacy.address, 'Weg 1'); +});