Funktionen neu: Bestätigung als Overlay der Zurück-Geste, Erfolgsmeldung, Rückkehr nach dem Wechsel

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 18:11:36 +00:00
1 parent f30e72ebbb
commit 36890c6734
2 files changed
+150 -17

No files matched your search

+94
View File
@@ -2,6 +2,7 @@ import { test } from 'node:test'
import assert from 'node:assert/strict'
import { installFakeDom } from './support/fakeDom.js'
import { zeigeFunktionen, vergissMerker } from '../public/neu/ansicht-funktionen.js'
import { merkeMeldung } from '../public/neu/funktion-einschalten.js'
import { daten, projekt, feature } from './support/knFunktionenDaten.js'
const JETZT = () => new Date('2026-10-20T10:00:00Z')
@@ -198,3 +199,96 @@ test('Meine mit zwei Websites zeigt den Websitenamen in der zweiten Zeile, mit e
await zwei.zeige(MEINE)
assert.match(fx.text(fx.finde(zwei.wurzel, 'li[data-fn]')), /News-Pinnwand.*Bäckerei.*Aktiv/)
}))
/* ---------------------------------------------------------------- Teil 2: Overlay, Erfolgsmeldung, Wechsel --- */
test('Bestätigung als Overlay: Zurück-Geste bringt die Liste ohne neuen Abruf zurück, Abbrechen ebenso', mit(async (fx) => {
const u = umgebung(fx)
await u.zeige(ENTDECKEN)
const geladen = () => u.aufrufe.filter(([m, p]) => m === 'GET' && p === '/api/funktionen').length
await fx.klick(fx.finde(u.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]'))
assert.match(fx.text(u.wurzel), /News-Pinnwand einschalten/)
assert.equal(fx.alle(u.wurzel, 'section[data-fn]').length, 0)
u.overlay() // Zurück-Geste des Browsers (der Router ruft schliesse)
assert.equal(fx.alle(u.wurzel, 'section[data-fn]').length, 6)
await fx.klick(fx.finde(u.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]'))
await fx.klick(fx.finde(u.wurzel, '[data-aktion="abbrechen"]'))
assert.equal(fx.alle(u.wurzel, 'section[data-fn]').length, 6)
assert.deepEqual([geladen(), u.gegangen], [1, []])
}))
test('Overlay: eine ältere Seite zeichnet nach einem neuen Aufruf nichts mehr; die Rechnungszeile und eine gezeigte Meldung bleiben', mit(async (fx) => {
const u = umgebung(fx)
u.rechnungen = [{ id: 'r1', number: 'RE-1', balance: 20, portalUrl: null }]
await u.zeige(ENTDECKEN)
await fx.klick(fx.finde(u.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]'))
const schliesse = u.overlay
await u.zeige(ENTDECKEN) // ein neuer Aufruf (z. B. Router) ersetzt die Anzeige
const vorher = fx.text(u.wurzel)
schliesse() // das alte Overlay meldet sich spät
assert.equal(fx.text(u.wurzel), vorher)
const v = umgebung(fx)
v.rechnungen = [{ id: 'r1', number: 'RE-1', balance: 20, portalUrl: null }]
await v.zeige(ENTDECKEN)
merkeMeldung('Eine Meldung')
await v.zeige(ENTDECKEN)
const aufrufe = v.aufrufe.length
await fx.klick(fx.finde(v.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]'))
v.overlay()
assert.ok(fx.finde(v.wurzel, '.kn-rechnung-offen'))
assert.equal(fx.text(fx.finde(v.wurzel, '[role="status"]')), 'Eine Meldung') // nach dem Schließen noch da, aber nicht neu gemerkt
assert.equal(v.aufrufe.length, aufrufe) // auch kein neuer Abruf der Rechnungen
await v.zeige(ENTDECKEN)
assert.equal(fx.finde(v.wurzel, '[role="status"]'), null)
}))
test('Erfolg: Meldung merken, ersetzend zu Meine, Meldung genau einmal', mit(async (fx) => {
const u = umgebung(fx)
await u.zeige(ENTDECKEN)
await fx.klick(fx.finde(u.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]'))
await fx.klick(fx.finde(u.wurzel, '[data-aktion="einschalten"]'))
assert.deepEqual(u.aufrufe.filter(([m]) => m === 'POST'), [['POST', '/api/funktionen/news/einschalten']])
assert.deepEqual(u.gegangen, [['#funktionen', { ersetzen: true }]])
u.d = daten({ projekte: [projekt('p1', 'Bäckerei Sonnenschein', { news: feature('setup', { ticketWoid: '100301' }) })] })
await u.zeige(MEINE) // so ruft der Router danach auf
assert.equal(fx.text(fx.finde(u.wurzel, '[role="status"]')), 'News-Pinnwand ist eingeschaltet. Die Einrichtung läuft jetzt. Ticket #100301.')
await u.zeige(MEINE)
assert.equal(fx.finde(u.wurzel, '[role="status"]'), null)
}))
test('wechselFunktion (V11): öffnet den Ablauf der Funktion, einmal, nur mit Wartungs-Abo', mit(async (fx) => {
const aboMit = (key) => ({ subscription: { wechselFunktion: { key, projectId: 'p1' } } })
const abgefragt = (u) => u.aufrufe.some(([, p]) => p === '/api/abo')
let u = umgebung(fx, { abo: aboMit('news') })
await u.zeige(MEINE)
assert.ok(fx.finde(u.wurzel, 'section.kn-fn-einschalten[data-key="news"]')) // Bestätigung, kein Sprung
assert.deepEqual(u.gegangen, [])
await u.zeige(MEINE) // zweiter Aufruf: nicht noch einmal in die Funktion
assert.deepEqual(u.gegangen, [['#entdecken', { ersetzen: true }]])
vergissMerker()
u = umgebung(fx, { abo: aboMit('termine') }); await u.zeige(MEINE)
assert.deepEqual(u.gegangen, [['#termine?projekt=p1']]) // Fragebogen zuerst
vergissMerker()
u = umgebung(fx, { d: daten({ abo: { produkt: 'hosting' } }), abo: aboMit('news') }); await u.zeige(MEINE)
assert.equal(abgefragt(u), false)
vergissMerker()
for (const abo of [aboMit('gibtsnicht'), new Error('weg')]) {
u = umgebung(fx, { abo }); await u.zeige(MEINE)
assert.deepEqual(u.gegangen, [['#entdecken', { ersetzen: true }]]) // ungültig oder Fehler: wie ohne Wechsel
}
}))
test('wechselFunktion: nicht, wenn die Website die Funktion schon hat, die Website fehlt oder die Funktion nicht verfügbar ist', mit(async (fx) => {
const abo = { subscription: { wechselFunktion: { key: 'news', projectId: 'p1' } } }
const faelle = [
daten({ projekte: [projekt('p1', 'B', { news: feature('active') })] }), // hat sie schon: die Liste erscheint
daten({ projekte: [projekt('p9', 'Anders')] }), // Website nicht (mehr) da
daten({ katalogEdit: { news: { verfuegbar: false } } }), // C9
]
for (const d of faelle) {
vergissMerker()
const u = umgebung(fx, { d, abo })
await u.zeige(ENTDECKEN)
assert.equal(fx.finde(u.wurzel, 'section.kn-fn-einschalten'), null)
assert.deepEqual(u.gegangen, [])
}
}))