Öffnungszeiten: Behalten nur ohne Abo anbieten (kein_abo)

Behalten (30 €) gab es bei jedem inklusive false. nicht_aktiv und gekuendigt heißen aber,
dass das Wartungs-Abo läuft (Server: 409 Abo läuft wieder). Jetzt gilt an allen fünf Stellen
(Kachel, Karte, Behalten-Seite, Weg aus der Kachel, Abgeschaltet-Karte) dasselbe Prädikat:
inklusive false UND grund kein_abo; sonst „Abo läuft wieder“ ohne Bezahlknopf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 05:41:24 +00:00
1 parent 7bb918390a
commit cee44d6852
5 files changed
+166 -20

No files matched your search

+41
View File
@@ -211,6 +211,47 @@ test('aboEndeAt: Behalten-Hinweis mit Datum', async () => {
assert.doesNotMatch(nurText(kaputt), /bis NaN|Invalid|undefined/)
})
// Fix Runde 1: Behalten (30 €) gibt es nur ohne Abo (inklusive false UND grund kein_abo). nicht_aktiv und gekuendigt heissen, dass das Abo läuft (R20/R25).
test('aboEndeAt bei laufendem Abo (nicht_aktiv, gekuendigt): „Abo läuft wieder“, nie ein Bezahlknopf', async () => {
for (const grund of ['nicht_aktiv', 'gekuendigt']) {
for (const state of ['active', 'setup']) {
const k = kachel((await render([projekt('p1', state, { aboEndeAt: '2026-10-01T10:00:00.000Z', einbau: 'angestossen' }, { zeitenLeer: false })], { zeiten: ANGEBOT(false, grund) })).html)
const was = `${grund}/${state}`
assert.match(nurText(k), /Dein Wartungs-Abo läuft wieder – Öffnungszeiten live ist darin enthalten\./, was)
assert.deepEqual(knoepfe(k), ['Zeiten bearbeiten'], was)
assert.doesNotMatch(nurText(k), /ist beendet|behalte die Funktion|für einmalig|Für 30 €|30 €/, was)
assert.doesNotMatch(k, /data-zeiten-weg/, was)
}
}
// unbekannter Grund oder kein Grund (false, null): nicht auf Verdacht bezahlen lassen
for (const grund of [null, 'unbekannt']) {
const k = kachel((await render([projekt('p1', 'active', { aboEndeAt: '2026-10-01T10:00:00.000Z' }, { zeitenLeer: false })], { zeiten: ANGEBOT(false, grund) })).html)
assert.deepEqual(knoepfe(k), ['Zeiten bearbeiten'], String(grund))
assert.doesNotMatch(nurText(k), /Für 30 €|behalte die Funktion/, String(grund))
}
// Gegenprobe: ohne Abo (kein_abo) bleibt es beim Angebot
const ohne = kachel((await render([projekt('p1', 'active', { aboEndeAt: '2026-10-01T10:00:00.000Z' }, { zeitenLeer: false })], { zeiten: ANGEBOT(false, 'kein_abo') })).html)
assert.deepEqual(knoepfe(ohne), ['Zeiten bearbeiten', 'Für 30 € behalten'])
})
test('disabled abo_ende mit Daten bei laufendem Abo (nicht_aktiv, gekuendigt): kein „Für 30 € wieder einschalten“, stattdessen „Abo läuft wieder“', async () => {
const feature = { disabledReason: 'abo_ende', disabledAt: '2026-10-04T10:00:00.000Z', loeschungAm: '2999-01-01' }
for (const grund of ['nicht_aktiv', 'gekuendigt']) {
const k = kachel((await render([projekt('p1', 'disabled', feature, { zeitenLeer: false })], { zeiten: ANGEBOT(false, grund) })).html)
assert.doesNotMatch(k, /Für 30 €|data-zeiten-weg|<button/, grund)
assert.match(nurText(k), /Dein Wartungs-Abo läuft wieder – wir schalten Öffnungszeiten live automatisch wieder ein/, grund)
assert.match(nurText(k), /Deine Eingaben bleiben bis 01\.01\.2999 gespeichert/, grund)
}
for (const grund of [null, 'unbekannt']) {
const k = kachel((await render([projekt('p1', 'disabled', feature, { zeitenLeer: false })], { zeiten: ANGEBOT(false, grund) })).html)
assert.doesNotMatch(k, /Für 30 €|<button/, String(grund))
assert.match(nurText(k), /Gerade nicht prüfbar/, String(grund))
}
// Gegenprobe: kein_abo bietet es an
const ohne = kachel((await render([projekt('p1', 'disabled', feature, { zeitenLeer: false })], { zeiten: ANGEBOT(false, 'kein_abo') })).html)
assert.deepEqual(knoepfe(ohne), ['Für 30 € wieder einschalten'])
})
test('ordered: „Zahlung wird bestätigt …“', async () => {
const k = kachel((await render([projekt('p1', 'ordered', { unlockedBy: null })], { zeiten: ANGEBOT(false, 'kein_abo') })).html)
assert.match(k, /fn-pill fn-pill-setup">Zahlung offen</)