;; lib/host/tests/handler.sx — host JSON envelope + request-reading helpers.

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

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

;; ── host/ok ────────────────────────────────────────────────────────
(host-hd-test "ok status 200" (dream-status (host/ok "x")) 200)
(host-hd-test
  "ok content-type sx"
  (dream-resp-header (host/ok "x") "content-type")
  "text/sx; charset=utf-8")
(host-hd-test
  "ok envelope ok:true"
  (contains? (dream-resp-body (host/ok "x")) ":ok true")
  true)
(host-hd-test
  "ok envelope carries data"
  (contains? (dream-resp-body (host/ok "hi")) ":data \"hi\"")
  true)

;; ── host/ok-status ─────────────────────────────────────────────────
(host-hd-test "ok-status custom" (dream-status (host/ok-status 201 "y")) 201)
(host-hd-test
  "ok-status data"
  (contains? (dream-resp-body (host/ok-status 201 "y")) ":data \"y\"")
  true)

;; ── host/error ─────────────────────────────────────────────────────
(host-hd-test "error status" (dream-status (host/error 404 "nope")) 404)
(host-hd-test
  "error ok:false"
  (contains? (dream-resp-body (host/error 404 "nope")) ":ok false")
  true)
(host-hd-test
  "error message"
  (contains? (dream-resp-body (host/error 404 "nope")) ":error \"nope\"")
  true)
(host-hd-test
  "error content-type sx"
  (dream-resp-header (host/error 500 "boom") "content-type")
  "text/sx; charset=utf-8")

;; ── host/sx-status ─────────────────────────────────────────────────
(host-hd-test
  "sx-status arbitrary status"
  (dream-status (host/sx-status 418 {:a 1}))
  418)
(host-hd-test
  "sx-status serializes body"
  (contains? (dream-resp-body (host/sx-status 200 {:a 1})) ":a 1")
  true)

;; ── host/query-int ─────────────────────────────────────────────────
(define
  host-hd-req
  (fn (target) (dream-request "GET" target {} "")))

(host-hd-test
  "query-int present"
  (host/query-int (host-hd-req "/x?limit=5") "limit" 10)
  5)
(host-hd-test
  "query-int absent -> fallback"
  (host/query-int (host-hd-req "/x") "limit" 10)
  10)

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