;; lib/host/tests/page.sx — the host's interactive-SX-page capability (Phase 5.1). ;; A defcomp component tree (with keyword attributes + nesting) renders to correct ;; HTML through host/page / render-page, served by a host route. This is the ;; capability the legacy editor (and any future island UI) needs — proven on a ;; small component so it's not editor-specific. (define host-pg-pass 0) (define host-pg-fail 0) (define host-pg-fails (list)) (define host-pg-test (fn (name actual expected) (if (= actual expected) (set! host-pg-pass (+ host-pg-pass 1)) (begin (set! host-pg-fail (+ host-pg-fail 1)) (append! host-pg-fails {:name name :actual actual :expected expected}))))) ;; A component with keyword attributes (the case bare render-to-html mangles) and ;; a nested component (expansion must recurse). (defcomp ~pg-badge (&key (label :as string)) (span :class "badge" :data-kind "tag" label)) (defcomp ~pg-card (&key (title :as string)) (div :class "card" (h2 :class "card-title" title) (~pg-badge :label "new"))) (define host-pg-req (fn (target) (dream-request "GET" target {} ""))) (define host-pg-app (host/make-app (list (list (host/page-route "/card" (quote (~pg-card :title "Hello"))))))) (define host-pg-body (dream-resp-body (host-pg-app (host-pg-req "/card")))) (host-pg-test "page 200" (dream-status (host-pg-app (host-pg-req "/card"))) 200) (host-pg-test "page is html" (contains? (dream-resp-header (host-pg-app (host-pg-req "/card")) "content-type") "text/html") true) ;; attributes survive (the whole point) — class on the outer div (host-pg-test "outer div class attr" (contains? host-pg-body "class=\"card\"") true) ;; nested component expanded + its attrs survive (host-pg-test "nested component expanded" (contains? host-pg-body "class=\"badge\"") true) (host-pg-test "nested data attr" (contains? host-pg-body "data-kind=\"tag\"") true) ;; keyword param values rendered as text content, not attrs (host-pg-test "title text rendered" (contains? host-pg-body "Hello") true) (host-pg-test "badge label text rendered" (contains? host-pg-body ">new<") true) ;; NOT mangled — the keyword ":class" must not leak as text content (host-pg-test "no mangled keyword text" (contains? host-pg-body ">classcard") false) (define host-pg-tests-run! (fn () {:total (+ host-pg-pass host-pg-fail) :passed host-pg-pass :failed host-pg-fail :fails host-pg-fails}))