Shop Review A M9: Mindestbetrag 0,50 EUR (Stripe) und Sitzungsende direkt vor dem Stripe-Aufruf nachfuehren

berechne lehnt Gesamtbetraege unter 0,50 EUR mit dem Code mindestbetrag und einem Kaeufertext ab. legeBestellungAn schiebt expires_at um die seit Beginn vergangenen ganzen Sekunden (Warten auf Sperren) weiter und fuehrt ablaufAt auf denselben Wert nach, damit Stripes 30-Minuten-Minimum sicher bleibt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 09:35:17 +00:00
1 parent cb6291410d
commit d4b9e6a5b9
5 files changed
+55 -4

No files matched your search

+19
View File
@@ -25,6 +25,7 @@ after(async () => {
useTestEnv({ appwriteUrl: aw.url, stripeUrl: st.url })
const { config } = await import('../server/config.js')
const { withLocks } = await import('../server/services/keyedLock.js')
const { deleteDocument } = await import('../server/services/appwriteAdmin.js')
const K = await import('../server/services/shop/kontext.js')
const B = await import('../server/services/shop/bestellungen.js')
@@ -138,6 +139,24 @@ test('pruefeRueckUrl: eigene Hosts und Portal ja, fremde, http, Zugangsdaten nei
assert.equal(B.pruefeRueckUrl('http://www.brot.example/', ctx), 'http://127.0.0.1:4000/shop/' + SITE_KEY)
})
test('M9: Wartezeit auf die Bestandssperre verkuerzt die Sitzungsdauer nicht - expires_at und ablaufAt werden vor dem Stripe-Aufruf nachgefuehrt', async () => {
const ctx = await aufbau()
let los
const gehalten = new Promise((r) => (los = r))
const sperre = withLocks([`shop-bestand:${FEATURE}`], () => gehalten)
const lauf = B.legeBestellungAn(ctx, eingabe(), { now: T0 })
await new Promise((r) => setTimeout(r, 2100))
los()
await sperre
await lauf
const [call] = sessionCalls()
const ende = Number(call.body.expires_at)
const grundwert = Math.ceil(T0.getTime() / 1000) + 30 * 60 + 30
assert.ok(ende >= grundwert + 2, `expires_at ${ende} soll mindestens 2 s nach ${grundwert} liegen`)
assert.ok(ende <= grundwert + 6)
assert.equal(new Date(orders()[0].ablaufAt).getTime(), ende * 1000, 'ablaufAt = Ende der Stripe-Sitzung')
})
test('Normalfall: Bestellung offen, Stripe-Kasse auf dem Haendlerkonto mit allen Parametern', async () => {
const ctx = await aufbau()
const r = await B.legeBestellungAn(ctx, eingabe(), { now: T0 })