fix: Befunde aus Sicherheits- und Korrektheitsreview der Bienenpatenschaft
Docker Image bauen und veroeffentlichen / typecheck (push) Successful in 2m57s
Docker Image bauen und veroeffentlichen / lint (push) Successful in 3m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 1m22s
Docker Image bauen und veroeffentlichen / typecheck (push) Successful in 2m57s
Docker Image bauen und veroeffentlichen / lint (push) Successful in 3m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 1m22s
- Oeffentliche Kuendigung: exakte Identifikation, Limits je Vertrag und Adresse, Bestaetigung nur an die Kontoadresse mit Ruecknahme-Link (HMAC) - Vorschau: Body-Grenze beim Lesen, Parallelitaets- und Minutenlimit, Cache - Rabatte gelten nicht fuer Patenschaftspositionen - Abo aktiv erst nach bestaetigter Zahlung, offene Abschluesse zaehlen zum Kontingent und werden nach 24 h aufgeraeumt, Sitzung 58 Minuten - Konto-Loeschung nur ohne laufendes Abo, Urkunden-Dateien werden entfernt - Abo-Lieferungen mit Zahlungszeile (DHL-Marke moeglich) - Shop zeigt freien Bestand nach Abo-Reservierung - Storno/volle Erstattung widerruft die Patenschaft (Status WIDERRUFEN) - Umsatzsteuer der Patenschaft per VAT_RATE_PERCENT_PATENSCHAFT (19 %) - Digitale Bestellungen archivieren sich, Kalendertage in Europe/Berlin, Monatsenden begrenzt, Datenauskunft um Patenschaften ergaenzt Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
f227aeb8f9
commit
515fca1c16
97 files changed
+2979
-254
No files matched your search
@@ -104,6 +104,7 @@ describe("checkout.session.completed (Abo)", () => {
|
||||
id: "cs_1",
|
||||
mode: "subscription",
|
||||
subscription: "sub_stripe",
|
||||
payment_status: "paid",
|
||||
metadata: { sponsorshipSubscriptionId: "sub_local" },
|
||||
})
|
||||
);
|
||||
@@ -118,6 +119,32 @@ describe("checkout.session.completed (Abo)", () => {
|
||||
});
|
||||
});
|
||||
|
||||
test("verzoegerte Zahlart (SEPA, noch unbezahlt): verknuepft, aber aktiviert erst mit invoice.paid", async () => {
|
||||
m.db.sponsorshipSubscription.findUnique
|
||||
.mockResolvedValueOnce({ ...LOCAL, status: "AUSSTEHEND", stripeSubscriptionId: null })
|
||||
.mockResolvedValueOnce(null)
|
||||
.mockResolvedValueOnce({ ...LOCAL, status: "AUSSTEHEND", stripeSubscriptionId: null })
|
||||
.mockResolvedValueOnce({ ...LOCAL, status: "AUSSTEHEND" });
|
||||
|
||||
await handleSubscriptionEvent(
|
||||
event("checkout.session.completed", {
|
||||
id: "cs_1",
|
||||
mode: "subscription",
|
||||
subscription: "sub_stripe",
|
||||
payment_status: "unpaid",
|
||||
metadata: { sponsorshipSubscriptionId: "sub_local" },
|
||||
})
|
||||
);
|
||||
|
||||
expect(m.db.sponsorshipSubscription.updateMany).toHaveBeenCalledWith({
|
||||
where: { id: "sub_local", stripeSubscriptionId: null },
|
||||
data: { stripeSubscriptionId: "sub_stripe" },
|
||||
});
|
||||
expect(m.db.sponsorshipSubscription.updateMany).not.toHaveBeenCalledWith(
|
||||
expect.objectContaining({ data: expect.objectContaining({ status: "AKTIV" }) })
|
||||
);
|
||||
});
|
||||
|
||||
test("laesst Einmal-Checkouts unberuehrt", async () => {
|
||||
await handleSubscriptionEvent(event("checkout.session.completed", { id: "cs_1", mode: "payment", metadata: { orderId: "o1" } }));
|
||||
expect(m.db.sponsorshipSubscription.findUnique).not.toHaveBeenCalled();
|
||||
|
||||
Reference in new issue
Block a user