Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 57s
order.sx — reserve -> await-payment -> fulfil as a flow-on-sx flow carrying only the order-id; the SX driver services each request by appending to the persist ledger. order-begin! creates+reserves and suspends at payment; order-settle! (webhook) resumes -> fulfils, idempotent on replay (:already-settled). order-flow-restart! simulates a process restart Scheme-side and the suspended order resumes with the ledger intact. Composes all three substrates: minikanren pricing -> flow lifecycle -> persist ledger. Total 153/153 across 9 suites. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68 lines
2.4 KiB
Plaintext
68 lines
2.4 KiB
Plaintext
;; lib/commerce/tests/order.sx — order lifecycle as a flow-on-sx flow.
|
|
;; Uses (commerce-test name got expected) provided by conformance.sh.
|
|
;; Builds the (expensive) flow env once; all assertions share it.
|
|
|
|
(define env (order-make-env))
|
|
(define b (persist/mem-backend))
|
|
(define q1 {:codes (list) :subtotal 1000 :discount 0 :total 1200 :tax 200})
|
|
|
|
;; --- happy path: begin suspends at payment ---
|
|
|
|
(define id1 (order-begin! env b "O1" 100 q1))
|
|
|
|
(commerce-test "begin-status-reserved" (order-status b "O1") :reserved)
|
|
(commerce-test "begin-waiting-payment" (order-flow-waiting env id1) "payment")
|
|
(commerce-test "begin-not-yet-paid" (order-paid b "O1") 0)
|
|
|
|
;; --- settle: payment webhook drives fulfilment ---
|
|
|
|
(define s1 (order-settle! env b id1 "O1" "ref-1" 102 1200))
|
|
|
|
(commerce-test "settle-result" s1 :settled)
|
|
(commerce-test "settle-status-fulfilled" (order-status b "O1") :fulfilled)
|
|
(commerce-test "settle-flow-done" (order-flow-status env id1) "done")
|
|
(commerce-test "settle-recon-ok" (order-recon b "O1") :ok)
|
|
(commerce-test "settle-event-count" (len (order-events b "O1")) 4)
|
|
|
|
;; --- webhook replay: a second settle is a no-op ---
|
|
|
|
(define s1b (order-settle! env b id1 "O1" "ref-1" 102 1200))
|
|
|
|
(commerce-test "replay-already-settled" s1b :already-settled)
|
|
(commerce-test
|
|
"replay-no-extra-events"
|
|
(len (order-events b "O1"))
|
|
4)
|
|
(commerce-test "replay-recon-still-ok" (order-recon b "O1") :ok)
|
|
|
|
;; --- a second order gets its own flow id and suspends independently ---
|
|
|
|
(define id2 (order-begin! env b "O2" 200 q1))
|
|
|
|
(commerce-test "second-distinct-id" (not (= id1 id2)) true)
|
|
(commerce-test
|
|
"second-waiting-payment"
|
|
(order-flow-waiting env id2)
|
|
"payment")
|
|
(commerce-test "first-unaffected" (order-status b "O1") :fulfilled)
|
|
|
|
;; --- durability: a suspended order survives a process restart ---
|
|
|
|
(define id3 (order-begin! env b "O3" 300 q1))
|
|
(commerce-test "pre-restart-waiting" (order-flow-waiting env id3) "payment")
|
|
|
|
(define _restart (order-flow-restart! env))
|
|
|
|
(commerce-test
|
|
"post-restart-still-waiting"
|
|
(order-flow-waiting env id3)
|
|
"payment")
|
|
(commerce-test "post-restart-ledger-intact" (order-status b "O3") :reserved)
|
|
|
|
(define s3 (order-settle! env b id3 "O3" "ref-3" 302 1200))
|
|
|
|
(commerce-test "post-restart-settled" s3 :settled)
|
|
(commerce-test "post-restart-status" (order-status b "O3") :fulfilled)
|
|
(commerce-test "post-restart-recon-ok" (order-recon b "O3") :ok)
|
|
(commerce-test "post-restart-flow-done" (order-flow-status env id3) "done")
|