Shop J2: Widerruf der Bestellung Webshop (Einrichtung) im öffentlichen Widerrufsformular und in abo.js, Tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 09:20:39 +00:00
1 parent 9283ff42c1
commit dbb2042983
3 files changed
+45 -5

No files matched your search

+38
View File
@@ -1007,6 +1007,43 @@ test('widerruf_termine_mails: K04 nennt „Terminplaner (Einrichtung)“, T09 de
}
})
test('widerruf_shop: Webshop (Einrichtung) rechnet mit der eigenen Frist, K04 und T09 nennen Webshop, Preis und Projekt, nichts wird automatisch geändert', async () => {
const shopAt = daysAgo(3)
seedBezahlt({ projectId: 'pn1', projektName: 'Bäckerei News', featureKey: 'news', orderedAt: daysAgo(20), state: 'active' })
seedBezahlt({ projectId: 'pt1', projektName: 'Studio Termine', featureKey: 'termine', orderedAt: daysAgo(2) })
seedBezahlt({ projectId: 'ps1', projektName: 'Bäckerei Shop', featureKey: 'shop', orderedAt: shopAt })
try {
await resetSubH({ units: 0 })
const before = st.calls.length
assert.equal((await withdraw({ order: 'shop', customerNumber: 'KD-9' })).status, 200)
const kunde = k04()
assert.match(kunde.subject, /WEBklar Webshop$/)
assert.match(kunde.text, /Widerruf der Bestellung „Webshop \(Einrichtung\)“/)
assert.match(kunde.text, /Wir prüfen Ihren Widerruf/)
assert.doesNotMatch(kunde.text, /Es erfolgen keine weiteren Abbuchungen/)
const team = t09().text
assert.match(team, /RECHTZEITIG/)
assert.doesNotMatch(team, /NACH Fristende/)
assert.match(team, /Webshop \(Einrichtung\)/)
assert.ok(team.includes(`Widerruf einer Funktion (${config.features.shop.label.name}, ${config.features.shop.priceLabel} einmalig)`), team)
assert.match(team, /299 €/)
assert.ok(team.includes(fmtDate(withdrawalDeadline(shopAt).endsAt)), 'Fristende des Webshops')
assert.match(team, /Bäckerei Shop: in Einrichtung/)
assert.doesNotMatch(team, /Bäckerei News|Studio Termine/, 'andere Funktionen gehören nicht zu dieser Wahl')
assert.match(team, /NICHTS automatisch geändert/)
assert.equal(st.calls.length, before, 'kein Stripe-Aufruf')
assert.equal(aw.docs('portalFeatures').get('f_ps1_shop').state, 'setup', 'nichts automatisch geändert')
// ohne bezahlten Webshop: ungeprüft, die Antwort bleibt 200
await raeumeBezahlt('f_ps1_shop')
await resetSubH({ units: 0 })
assert.equal((await withdraw({ order: 'shop' })).status, 200)
assert.match(t09().text, /ungeprüft \(keine bezahlte Funktion gefunden\)/)
} finally {
await raeumeBezahlt('f_pn1_news', 'f_pt1_termine', 'f_ps1_shop')
}
})
test('widerruf_anker_vertragAt: Zustimmung zur bezahlten Sitzung früher als das überschriebene orderedAt - Frist aus vertragAt; je Funktion gefiltert', async () => {
await resetSubH({ units: 0 })
// Terminplaner: Klick vor 13 Tagen, orderedAt (Neubestellung) vor 1 Tag; eine News vor 2 Tagen bestellt (kein Einfluss)
@@ -1279,6 +1316,7 @@ test('widerrufen_html_radio: Radioknöpfe order', () => {
assert.match(src, /name="order" value="zusatzspeicher"[^>]*> E-Mail-Zusatzspeicher/)
assert.match(src, /name="order" value="funktion"[^>]*> Funktion \(z\. B\. News-Pinnwand\)/)
assert.match(src, /name="order" value="termine"[^>]*data-text="Terminplaner \(Einrichtung\)"[^>]*> Terminplaner \(Einrichtung\)<\/label>/)
assert.match(src, /name="order" value="shop"[^>]*data-text="Webshop \(Einrichtung\)"[^>]*> Webshop \(Einrichtung\)<\/label>/)
assert.doesNotMatch(src, /value="WEBklar Wartungs-Abo" disabled/)
assert.match(src, /fields: \['order', 'name', 'customerNumber', 'email'\]/)
})