Analyse: Portal-Kachel und Auswertung
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
fc937b0d1e
commit
5a6fbc7328
6 files changed
+483
-4
No files matched your search
@@ -0,0 +1,59 @@
|
||||
import { test } from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { contrastOk } from '../analytics/client/core.js'
|
||||
import { bannerColor, chartModel, countryName, flagEmoji, niceMax, shortDay, barRows, refLabel } from '../public/analyse-view.js'
|
||||
|
||||
test('contrast und bannerColor stimmen mit core.js ueberein', () => {
|
||||
for (const c of ['#000000', '#ffffff', '#1d4ed8', '#047857', '#b91c1c', '#7c3aed', '#c2410c', '#ffcc00', '#9d3dfe', 'x', '#12']) {
|
||||
const { contrastOk: portal } = { contrastOk: bannerColor(c) !== '#111111' || c.toLowerCase() === '#111111' }
|
||||
assert.equal(portal, contrastOk(c) || c.toLowerCase() === '#111111', c)
|
||||
}
|
||||
assert.equal(bannerColor('#ffcc00'), '#111111')
|
||||
assert.equal(bannerColor('#1D4ED8'), '#1d4ed8')
|
||||
assert.equal(bannerColor('nonsense'), '#111111')
|
||||
})
|
||||
|
||||
test('Land und Flagge', () => {
|
||||
assert.equal(countryName('DE'), 'Deutschland')
|
||||
assert.equal(countryName(''), 'Unbekannt')
|
||||
assert.equal(flagEmoji('de'), '🇩🇪')
|
||||
assert.equal(flagEmoji(''), '')
|
||||
assert.equal(flagEmoji('<b>'), '')
|
||||
assert.equal(refLabel(''), 'Direkt')
|
||||
})
|
||||
|
||||
test('Diagramm-Skalierung', () => {
|
||||
assert.equal(niceMax(0), 1)
|
||||
assert.equal(niceMax(7), 10)
|
||||
assert.equal(niceMax(130), 200)
|
||||
assert.equal(shortDay('2026-10-01'), '01.10.')
|
||||
const series = Array.from({ length: 30 }, (_, i) => ({ day: `2026-09-${String(i + 1).padStart(2, '0')}`, pv: i }))
|
||||
const m = chartModel(series)
|
||||
assert.equal(m.points.length, 30)
|
||||
assert.equal(m.top, 50)
|
||||
assert.ok(m.points[0].x < m.points[29].x)
|
||||
assert.ok(m.points.every((p) => p.x >= m.pad.l && p.x <= m.width - m.pad.r && p.y >= m.pad.t && p.y <= m.height - m.pad.b))
|
||||
assert.ok(m.xLabels.length <= 7 && m.xLabels.length >= 2)
|
||||
assert.equal(chartModel([]).points.length, 0)
|
||||
assert.equal(chartModel([{ day: '2026-10-01', pv: 3 }]).points.length, 1)
|
||||
})
|
||||
|
||||
test('Balkenzeilen', () => {
|
||||
assert.deepEqual(barRows([{ key: 'a', count: 4 }, { key: 'b', count: 2 }], (k) => k.toUpperCase()), [
|
||||
{ key: 'a', label: 'A', count: 4, pct: 100 },
|
||||
{ key: 'b', label: 'B', count: 2, pct: 50 },
|
||||
])
|
||||
assert.deepEqual(barRows(undefined, String), [])
|
||||
})
|
||||
|
||||
test('Portal: Analyse-Ansicht ist verdrahtet', () => {
|
||||
const app = readFileSync(new URL('../public/app.js', import.meta.url), 'utf8')
|
||||
const html = readFileSync(new URL('../public/dashboard.html', import.meta.url), 'utf8')
|
||||
assert.match(app, /analyse: 'analyse'/)
|
||||
assert.match(app, /APP_PARENT = \{ news: 'funktionen', analyse: 'funktionen'/)
|
||||
assert.match(html, /id="view-analyse"/)
|
||||
assert.match(html, /id="analyse-body"/)
|
||||
const fn = readFileSync(new URL('../public/funktionen.js', import.meta.url), 'utf8')
|
||||
assert.doesNotMatch(fn.slice(fn.indexOf('Analyse ---')), /\bconfirm\(/)
|
||||
})
|
||||
Reference in new issue
Block a user