;; lib/host/tests/router.sx — host app assembly: health endpoint, group mounting,
;; 404 fallback.

(define host-rt-pass 0)
(define host-rt-fail 0)
(define host-rt-fails (list))

(define
  host-rt-test
  (fn
    (name actual expected)
    (if
      (= actual expected)
      (set! host-rt-pass (+ host-rt-pass 1))
      (begin
        (set! host-rt-fail (+ host-rt-fail 1))
        (append! host-rt-fails {:name name :actual actual :expected expected})))))

(define
  host-rt-req
  (fn (method target) (dream-request method target {} "")))

;; An app built from one domain group of two routes.
(define
  host-rt-app
  (host/make-app
    (list
      (list
        (dream-get "/ping" (fn (req) (host/ok "pong")))
        (dream-get "/widgets/:id" (fn (req) (host/ok (dream-param req "id"))))))))

;; ── health ─────────────────────────────────────────────────────────
(host-rt-test
  "health status 200"
  (dream-status (host-rt-app (host-rt-req "GET" "/health")))
  200)
(host-rt-test
  "health body healthy"
  (contains?
    (dream-resp-body (host-rt-app (host-rt-req "GET" "/health")))
    "healthy")
  true)

;; ── group routes mounted ───────────────────────────────────────────
(host-rt-test
  "group route ping"
  (contains?
    (dream-resp-body (host-rt-app (host-rt-req "GET" "/ping")))
    "pong")
  true)
(host-rt-test
  "group path param"
  (contains?
    (dream-resp-body (host-rt-app (host-rt-req "GET" "/widgets/42")))
    ":data \"42\"")
  true)

;; ── fallback ───────────────────────────────────────────────────────
(host-rt-test
  "unknown path 404"
  (dream-status (host-rt-app (host-rt-req "GET" "/nope")))
  404)
(host-rt-test
  "wrong method 405"
  (dream-status (host-rt-app (host-rt-req "POST" "/ping")))
  405)

(define
  host-rt-tests-run!
  (fn
    ()
    {:total (+ host-rt-pass host-rt-fail)
     :passed host-rt-pass
     :failed host-rt-fail
     :fails host-rt-fails}))
