From da5dccd4176b356ede11eef04cd3f87c67a7060f Mon Sep 17 00:00:00 2001 From: slhx agent Date: Mon, 25 May 2026 22:04:28 +0200 Subject: [PATCH] refactor(kanban): render test board payload with hemplate Replace the Kanban generated-slot unit test's inline raw HTML board payload with a hemplate-rendered view and DOM-aware assertion. req: html_safety/002 req: view/001 req: test/005 --- examples/kanban/src/lib.rs | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/examples/kanban/src/lib.rs b/examples/kanban/src/lib.rs index f5136af..7c9d597 100644 --- a/examples/kanban/src/lib.rs +++ b/examples/kanban/src/lib.rs @@ -4,17 +4,48 @@ pub mod ui {} #[cfg(test)] mod tests { use super::ui; - use slhx::{IntoEffect, SafeHtml}; + use hemplate::Hemplate; + use scraper::{Html, Selector}; + use slhx::{Effect, IntoEffect, Payload, SafeHtml}; use slhx_test::inspect; + #[derive(Hemplate)] + #[hemplate = "partials"] + struct BoardColumns { + columns: Vec, + } + // req: examples/001 req: codegen/002 req: list/003 #[test] fn kanban_board_updates_generated_slot() { fn render_board() -> impl IntoEffect { - ui::board::slots::board.html(SafeHtml::trusted("
")) + ui::board::slots::board.html(render_empty_board()) } - assert!(inspect(render_board()).has_slot(ui::board::slots::board)); + let effect = inspect(render_board()); + assert!(effect.has_slot(ui::board::slots::board)); + assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Html(_), .. }])); + } + + // req: html_safety/002 req: view/001 req: test/005 + #[test] + fn kanban_board_test_payload_is_rendered_by_a_hemplate_view() { + let html = render_empty_board(); + let document = Html::parse_fragment(html.as_str()); + assert_eq!(document.select(&selector(".columns")).count(), 1); + } + + fn render_empty_board() -> SafeHtml { + // req: html_safety/002 req: view/001 + SafeHtml::trusted( + BoardColumns { columns: Vec::new() } + .render() + .expect("kanban board test view renders"), + ) + } + + fn selector(value: &str) -> Selector { + Selector::parse(value).expect("test selector parses") } // req: examples/001 req: form/002 req: codegen/003