TP2 Abschlussprüfung: Fragebogen und Bestellseite (veralteter Tab, Abo-Hinweis, Zurück aus Stripe)
- PUT /fragebogen: ein Tab mit veralteter Branche bekommt 409 EINSTELLUNG_VERALTET (die Branche wechselt nur die Vorlage), bestaetigt wird mit dem gespeicherten Stand vereinigt; die ungeprüften Vorlagenpreise können nicht mehr als geprüft gelten - GET /einstellungen liefert in off aboHinweis (aboMeldung, auch bei nicht lesbarem Abo); die Hinweiskarte zeigt ihn immer und hat „Neu laden“ - Bestellseite und Statuskarte laden bei pageshow (persisted) neu, wenn der Browser sie nach der Zahlungsseite aus dem bfcache holt - renderBestellen zeichnet „Ändern“ und „Zum Schritt“ nur mit zumSchritt; nach einem 409 bekommt die Meldung den Fokus - Zusammenfassung nennt „Kleinunternehmer: ja/nein“ Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2fc48df915
commit
5f99f08a39
8 files changed
+314
-39
No files matched your search
@@ -329,6 +329,7 @@ test('abo gibt es nur in off; offen und bestellung nur in off und ordered (R110)
|
||||
setzeZustand(zustand)
|
||||
const { body } = await send('GET', einstellungenUrl(), { cookie })
|
||||
assert.equal(body.abo, null, zustand)
|
||||
assert.equal(body.aboHinweis, null, `${zustand}: den Abo-Hinweis gibt es nur in off`)
|
||||
assert.equal(body.offen, null, zustand)
|
||||
assert.equal(body.bestellung, null, zustand)
|
||||
}
|
||||
@@ -340,6 +341,7 @@ test('abo gibt es nur in off; offen und bestellung nur in off und ordered (R110)
|
||||
assert.notEqual(body.offen, null, zustand)
|
||||
assert.notEqual(body.bestellung, null, zustand)
|
||||
assert.equal(body.abo === null, zustand === 'ordered', `${zustand}: das Abo liest die Route nur in off`)
|
||||
assert.equal(body.aboHinweis, null, `${zustand}: mit laufendem Abo (off) und in ordered kein Hinweis`)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -406,6 +408,7 @@ test('off mit bestellbarem Entwurf und laufendem Wartungs-Abo: abo { ok: true },
|
||||
setzeZustand('off')
|
||||
const { body } = await send('GET', einstellungenUrl(), { cookie })
|
||||
assert.deepEqual(body.abo, { ok: true })
|
||||
assert.equal(body.aboHinweis, null, 'laeuft das Abo, gibt es keinen Hinweis')
|
||||
assert.deepEqual(body.offen, [])
|
||||
assert.deepEqual(body.bestellung, JSON.parse(JSON.stringify(await bestellungAnsicht(T))))
|
||||
assert.equal(body.bestellung.consent.knopf, T.consent.knopf, 'der Knopf zeigt genau den Registertext')
|
||||
@@ -454,6 +457,7 @@ test('Abo ohne laufendes Wartungs-Abo (nur Hosting, oder gar keins): abo { ok: f
|
||||
const { body } = await send('GET', einstellungenUrl(), { cookie })
|
||||
assert.equal(body.state, 'off', name)
|
||||
assert.deepEqual(body.abo, { ok: false, grund: 'kein_abo' }, name)
|
||||
assert.equal(body.aboHinweis, text, `${name}: B2, der Hinweis ist derselbe Text aus aboMeldung`)
|
||||
assert.deepEqual(body.offen, [{ schritt: 'bestellen', text }], name)
|
||||
}
|
||||
})
|
||||
@@ -463,12 +467,14 @@ test('Abo mit vorgemerkter Kündigung: grund gekuendigt; past_due: grund nicht_a
|
||||
wartung({ cancelAtPeriodEnd: true })
|
||||
let body = (await send('GET', einstellungenUrl(), { cookie })).body
|
||||
assert.deepEqual(body.abo, { ok: false, grund: 'gekuendigt' })
|
||||
assert.equal(body.aboHinweis, aboMeldung(T, 'gekuendigt'))
|
||||
assert.deepEqual(body.offen, [{ schritt: 'bestellen', text: aboMeldung(T, 'gekuendigt') }])
|
||||
assert.equal(body.offen[0].text, 'Dein Wartungs-Abo ist gekündigt. Für den Terminplaner brauchst du ein laufendes Abo.')
|
||||
|
||||
wartung({ status: 'past_due' })
|
||||
body = (await send('GET', einstellungenUrl(), { cookie })).body
|
||||
assert.deepEqual(body.abo, { ok: false, grund: 'nicht_aktiv' })
|
||||
assert.equal(body.aboHinweis, aboMeldung(T, 'nicht_aktiv'))
|
||||
assert.deepEqual(body.offen, [{ schritt: 'bestellen', text: aboMeldung(T, 'nicht_aktiv') }])
|
||||
})
|
||||
|
||||
@@ -478,6 +484,8 @@ test('Lesefehler beim Abo: GET bleibt 200, abo null und der offene Punkt "nicht
|
||||
const res = await send('GET', einstellungenUrl(), { cookie })
|
||||
assert.equal(res.status, 200)
|
||||
assert.equal(res.body.abo, null)
|
||||
assert.equal(res.body.aboHinweis, aboMeldung(T, 'unbekannt'), 'B2: auch ohne lesbares Abo bekommt der Kunde einen Text, nie eine leere Karte')
|
||||
assert.equal(res.body.aboHinweis, 'Das Abo konnte gerade nicht geprüft werden.')
|
||||
assert.deepEqual(res.body.offen, [{ schritt: 'bestellen', text: aboMeldung(T, 'unbekannt') }])
|
||||
assert.equal(res.body.offen[0].text, 'Das Abo konnte gerade nicht geprüft werden.')
|
||||
assert.ok(!JSON.stringify(res.body).includes('geheimer'))
|
||||
@@ -1374,8 +1382,17 @@ const beispielFragebogen = (over = {}) => ({
|
||||
...over,
|
||||
})
|
||||
|
||||
/**
|
||||
* Bestellbarer Stand, aber noch kein Schritt bestätigt und noch keine Branche gewählt (B1): PUT vereinigt bestaetigt mit dem gespeicherten Stand und
|
||||
* lässt einen Wechsel der gespeicherten Branche nicht zu. Die Tests, die einen beliebigen Fragebogen per PUT ablegen, gehen von diesem Stand aus.
|
||||
*/
|
||||
function standOhneBestaetigung({ branche = 'salon' } = {}) {
|
||||
const stand = bestellbarerStand({ now: JETZT })
|
||||
return { ...stand, fragebogen: { ...stand.fragebogen, branche, bestaetigt: [] } }
|
||||
}
|
||||
|
||||
test('PUT fragebogen speichert nur den Fragebogen: version und einstellung der Einstellung bleiben, updatedAt/updatedBy ändern sich, Antwort { fragebogen, offen }', async () => {
|
||||
setzeZustand('off')
|
||||
setzeZustand('off', { stand: standOhneBestaetigung() })
|
||||
const vorher = termineConfigDoc()
|
||||
const res = await putFragebogen(beispielFragebogen())
|
||||
assert.equal(res.status, 200, JSON.stringify(res.body))
|
||||
@@ -1394,7 +1411,7 @@ test('PUT fragebogen speichert nur den Fragebogen: version und einstellung der E
|
||||
})
|
||||
|
||||
test('PUT fragebogen: bereinigt die Eingabe wie normalisiereFragebogen (Reihenfolge, Doppelte, Fremdes, Steuerzeichen) und ersetzt den ganzen Fragebogen', async () => {
|
||||
setzeZustand('off')
|
||||
setzeZustand('off', { stand: standOhneBestaetigung() })
|
||||
const res = await putFragebogen({
|
||||
branche: 'salon',
|
||||
bestaetigt: ['website', 'branche', 'branche', 'unbekannt'],
|
||||
@@ -1459,7 +1476,7 @@ test('PUT fragebogen ohne Einstellung => 409 keine_einstellung, nichts angelegt
|
||||
for (const zustand of ZUSTAENDE) {
|
||||
const erwartet = { keins: '409 keine_einstellung', off: '200', ordered: '409 gesperrt', setup: '409 gesperrt', active: '200', disabled: '409 abgeschaltet' }[zustand]
|
||||
test(`PUT fragebogen: Zustand ${zustand} => ${erwartet}`, async () => {
|
||||
setzeZustand(zustand)
|
||||
setzeZustand(zustand, { stand: standOhneBestaetigung() })
|
||||
const vorher = dokumente()
|
||||
const res = await putFragebogen(beispielFragebogen())
|
||||
if (erwartet === '200') {
|
||||
@@ -1504,7 +1521,8 @@ test('PUT fragebogen: in off nur mit laufendem Wartungs-Abo (409 kein_abo, 503 b
|
||||
})
|
||||
|
||||
test('PUT fragebogen: offen ist die Bestellprüfung des gespeicherten Stands (nur in off), null in active', async () => {
|
||||
const stand = setzeZustand('off')
|
||||
const stand = bestellbarerStand({ now: JETZT })
|
||||
setzeZustand('off', { stand: standOhneBestaetigung() })
|
||||
const unvollstaendig = await putFragebogen(beispielFragebogen())
|
||||
assert.equal(unvollstaendig.status, 200)
|
||||
const erwartet = bestellpruefung({ einstellung: stand.einstellung, fragebogen: unvollstaendig.body.fragebogen, feature: T, abo: { ok: true } })
|
||||
@@ -1523,13 +1541,66 @@ test('PUT fragebogen: offen ist die Bestellprüfung des gespeicherten Stands (nu
|
||||
assert.equal((await putFragebogen(beispielFragebogen())).body.offen, null)
|
||||
})
|
||||
|
||||
test('PUT fragebogen: Branche gesundheit lässt sich speichern, das Gate (offen) blockt sie aber', async () => {
|
||||
setzeZustand('off')
|
||||
test('PUT fragebogen: Branche gesundheit lässt sich speichern, solange noch keine Branche gespeichert ist; das Gate (offen) blockt sie aber', async () => {
|
||||
setzeZustand('off', { stand: standOhneBestaetigung({ branche: null }) })
|
||||
const res = await putFragebogen({ ...bestellbarerStand({ now: JETZT }).fragebogen, branche: 'gesundheit' })
|
||||
assert.equal(res.status, 200, JSON.stringify(res.body))
|
||||
assert.ok(res.body.offen.some((p) => p.schritt === 'branche'))
|
||||
})
|
||||
|
||||
test('B1: ein veralteter Tab (Branche inzwischen gewechselt) bekommt 409 EINSTELLUNG_VERALTET; Branche, Bestätigungen und Preise des neuen Stands bleiben', async () => {
|
||||
setzeZustand('off')
|
||||
const tabA = (await send('GET', einstellungenUrl(), { cookie })).body // Tab A zeigt Branche salon, alle Schritte bestätigt, Preise geprüft
|
||||
assert.equal(tabA.fragebogen.branche, 'salon')
|
||||
assert.equal(tabA.fragebogen.preiseGeprueft, true)
|
||||
|
||||
// Tab B wechselt die Branche: Vorlage ersetzt, Fragebogen beginnt neu (Bestätigungen und Preisprüfung weg)
|
||||
const tabB = await vorlage({ branche: 'kosmetik', ersetzen: true, version: tabA.version })
|
||||
assert.equal(tabB.status, 201, JSON.stringify(tabB.body))
|
||||
const nachB = termineConfigDoc()
|
||||
|
||||
// Tab A drückt „Weiter“: PUT mit dem alten Stand
|
||||
const res = await putFragebogen(tabA.fragebogen)
|
||||
assert.equal(res.status, 409, JSON.stringify(res.body))
|
||||
assert.equal(res.body.code, 'EINSTELLUNG_VERALTET')
|
||||
assert.match(res.body.error, /Bitte neu laden/)
|
||||
assert.equal(termineConfigDoc().fragebogen, nachB.fragebogen, 'der gespeicherte Fragebogen bleibt byte-gleich')
|
||||
const gespeichert = gespeicherterFragebogen()
|
||||
assert.deepEqual([gespeichert.branche, gespeichert.bestaetigt, gespeichert.preiseGeprueft], ['kosmetik', [], false])
|
||||
const gate = (await send('GET', einstellungenUrl(), { cookie })).body
|
||||
assert.ok(gate.offen.some((p) => p.schritt === 'leistungen'), 'die ungeprüften Vorlagenpreise gelten nicht als geprüft')
|
||||
})
|
||||
|
||||
test('B1: bestaetigt ist die Vereinigung aus gespeichertem und gesendetem Stand; die übrigen Felder ersetzt der PUT wie bisher', async () => {
|
||||
const stand = standOhneBestaetigung()
|
||||
stand.fragebogen.bestaetigt = ['branche', 'wer', 'leistungen'] // Tab B hat schon weiter bestätigt
|
||||
setzeZustand('off', { stand })
|
||||
|
||||
// Tab A kennt nur branche und wer und bestätigt zeiten; seine Preisangabe und sein Einbau gelten (PUT ersetzt den Rest)
|
||||
const res = await putFragebogen(beispielFragebogen({ bestaetigt: ['branche', 'wer', 'zeiten'], preiseGeprueft: false }))
|
||||
assert.equal(res.status, 200, JSON.stringify(res.body))
|
||||
assert.deepEqual(res.body.fragebogen.bestaetigt, ['branche', 'wer', 'leistungen', 'zeiten'], 'nichts geht verloren, in der Reihenfolge der Schritte')
|
||||
assert.equal(res.body.fragebogen.preiseGeprueft, false)
|
||||
assert.deepEqual(gespeicherterFragebogen(), res.body.fragebogen)
|
||||
|
||||
// ohne gespeicherte Bestätigungen oder mit einer Eingabe ohne bestaetigt: nur die Vereinigung zählt
|
||||
const leer = await putFragebogen({ ...beispielFragebogen(), bestaetigt: undefined })
|
||||
assert.equal(leer.status, 200)
|
||||
assert.deepEqual(leer.body.fragebogen.bestaetigt, ['branche', 'wer', 'leistungen', 'zeiten'])
|
||||
})
|
||||
|
||||
test('B1: dieselbe Branche geht durch; eine andere als die gespeicherte (auch null) ist 409, solange eine gespeichert ist', async () => {
|
||||
setzeZustand('off', { stand: standOhneBestaetigung() })
|
||||
assert.equal((await putFragebogen(beispielFragebogen({ branche: 'salon' }))).status, 200)
|
||||
const vorher = dokumente()
|
||||
for (const branche of ['kosmetik', 'gesundheit', null]) {
|
||||
const res = await putFragebogen(beispielFragebogen({ branche }))
|
||||
assert.equal(res.status, 409, String(branche))
|
||||
assert.equal(res.body.code, 'EINSTELLUNG_VERALTET')
|
||||
}
|
||||
assert.equal(dokumente(), vorher, 'nichts geändert')
|
||||
})
|
||||
|
||||
// ---------------------------------------------------------------- PUT: Kundenansicht
|
||||
|
||||
for (const zustand of ZUSTAENDE) {
|
||||
@@ -1553,7 +1624,7 @@ for (const zustand of ZUSTAENDE) {
|
||||
}
|
||||
|
||||
test('PUT fragebogen am Router: dieselbe Anfrage mit der Sitzung des Kunden selbst geht durch (der Router sperrt nur die Kundenansicht)', async () => {
|
||||
setzeZustand('off')
|
||||
setzeZustand('off', { stand: standOhneBestaetigung() })
|
||||
const res = await sendDirekt('PUT', FRAGEBOGEN_URL, { cookie, body: { projectId: 'p1', fragebogen: beispielFragebogen() } })
|
||||
assert.equal(res.status, 200, JSON.stringify(res.body))
|
||||
assert.deepEqual(gespeicherterFragebogen(), beispielFragebogen())
|
||||
|
||||
Reference in new issue
Block a user