Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 1m1s
ev/deliver-messages bridges SX notification messages to the Scheme notify flow: each (id recipient body) is serialized to s-expr text, spliced as quoted data into the digest-flow program, delivered over an injected transport, and results unboxed. Integration suite drives all three derivations (reminders / booking-notify / reschedule) through delivery end to end; empty batch guarded (empty digest completes without suspending). 303/303 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
145 lines
4.8 KiB
Plaintext
145 lines
4.8 KiB
Plaintext
;; lib/events/tests/integration.sx — end-to-end pipeline: derive notification
|
|
;; messages (SX) -> deliver them through the durable notify flow (Scheme).
|
|
|
|
(define ev-it-pass 0)
|
|
(define ev-it-fail 0)
|
|
(define ev-it-failures (list))
|
|
|
|
(define
|
|
ev-it-check!
|
|
(fn
|
|
(name got expected)
|
|
(if
|
|
(= got expected)
|
|
(set! ev-it-pass (+ ev-it-pass 1))
|
|
(do
|
|
(set! ev-it-fail (+ ev-it-fail 1))
|
|
(append!
|
|
ev-it-failures
|
|
(str name "\n expected: " expected "\n got: " got))))))
|
|
|
|
(define ev-it-status (fn (outcome) (first outcome)))
|
|
(define ev-it-id (fn (outcome) (first (rest outcome))))
|
|
|
|
;; A store with a weekly class; nia + ola booked into the first occurrence.
|
|
(define
|
|
ev-it-setup
|
|
(fn
|
|
(b)
|
|
(let
|
|
((store (ev/schedule (ev/empty) (quote yoga) (ev-dt 2026 6 1 18 0) 60 {:freq :weekly :count 4 :byday (list 0 2)} 20)))
|
|
(let
|
|
((occ1 (ev-occ (quote yoga) (ev-dt 2026 6 1 18 0) 60)))
|
|
(do
|
|
(ev/book-occ! b store (quote nia) occ1)
|
|
(ev/book-occ! b store (quote ola) occ1)
|
|
store)))))
|
|
|
|
(define
|
|
ev-it-run-all!
|
|
(fn
|
|
()
|
|
(do
|
|
(let
|
|
((b (persist/open)))
|
|
(let
|
|
((store (ev-it-setup b)))
|
|
(let
|
|
((reminders (ev/agenda-reminders b store (ev-date 2026 6 1) (ev-date 2026 7 1) 60)))
|
|
(let
|
|
((msgs (map ev/reminder->msg reminders))
|
|
(outcomes
|
|
(ev/deliver-messages
|
|
(map ev/reminder->msg reminders)
|
|
ev-notify-ok-transport
|
|
3
|
|
20)))
|
|
(do
|
|
(ev-it-check!
|
|
"every booked attendee's reminder is delivered"
|
|
(map ev-it-status outcomes)
|
|
(list "delivered" "delivered"))
|
|
(ev-it-check!
|
|
"one delivery per derived reminder"
|
|
(len outcomes)
|
|
(len msgs))
|
|
(ev-it-check!
|
|
"delivered ids match the reminder idempotency keys"
|
|
(map ev-it-id outcomes)
|
|
(map (fn (r) (get r :id)) reminders)))))))
|
|
(let
|
|
((b (persist/open)))
|
|
(let
|
|
((store (ev-it-setup b)))
|
|
(let
|
|
((msgs (map ev/reminder->msg (ev/agenda-reminders b store (ev-date 2026 6 1) (ev-date 2026 7 1) 60))))
|
|
(ev-it-check!
|
|
"a permanently-failing transport reports failed deliveries"
|
|
(map
|
|
ev-it-status
|
|
(ev/deliver-messages
|
|
msgs
|
|
"(lambda (k p) (list (quote retry) (quote down)))"
|
|
2
|
|
20))
|
|
(list "failed" "failed")))))
|
|
(let
|
|
((b (persist/open)))
|
|
(do
|
|
(ev/book! b "occ" 1 (quote nia))
|
|
(ev/waitlist! b "occ" 1 (quote ola))
|
|
(ev/cancel-promote! b "occ" 1 (quote nia))
|
|
(let
|
|
((promoted (ev/notify-of-kind (ev/booking-notifications b "occ" (quote yoga)) :promoted)))
|
|
(let
|
|
((outcomes (ev/deliver-messages (map ev/booking-notify->msg promoted) ev-notify-ok-transport 3 12)))
|
|
(do
|
|
(ev-it-check!
|
|
"the waitlist-promotion notification is delivered"
|
|
(map ev-it-status outcomes)
|
|
(list "delivered"))
|
|
(ev-it-check!
|
|
"exactly one promotion was delivered"
|
|
(len outcomes)
|
|
1))))))
|
|
(let
|
|
((b (persist/open)))
|
|
(let
|
|
((ev (ev-event (quote yoga) (ev-dt 2026 6 1 18 0) 60 {:freq :daily :count 3} 20)))
|
|
(do
|
|
(ev/book-occ!
|
|
b
|
|
(ev/add-event (ev/empty) ev)
|
|
(quote nia)
|
|
(ev-occ
|
|
(quote yoga)
|
|
(ev-dt 2026 6 2 18 0)
|
|
60))
|
|
(let
|
|
((moved (ev-with-override ev (ev-dt 2026 6 2 18 0) (ev-dt 2026 6 2 20 0) 60)))
|
|
(let
|
|
((outcomes (ev/deliver-messages (map ev/reschedule-notify->msg (ev/reschedule-notifications b moved)) ev-notify-ok-transport 3 12)))
|
|
(ev-it-check!
|
|
"the reschedule notice is delivered to the booked attendee"
|
|
(map ev-it-status outcomes)
|
|
(list "delivered")))))))
|
|
(ev-it-check!
|
|
"delivering no messages yields no outcomes"
|
|
(ev/deliver-messages
|
|
(list)
|
|
ev-notify-ok-transport
|
|
3
|
|
12)
|
|
(list)))))
|
|
|
|
(define
|
|
ev-integration-tests-run!
|
|
(fn
|
|
()
|
|
(do
|
|
(set! ev-it-pass 0)
|
|
(set! ev-it-fail 0)
|
|
(set! ev-it-failures (list))
|
|
(ev-it-run-all!)
|
|
{:failures ev-it-failures :total (+ ev-it-pass ev-it-fail) :passed ev-it-pass :failed ev-it-fail})))
|