#[slhx::surface] pub mod ui {} #[cfg(test)] mod tests { use super::ui; 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(render_empty_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 #[test] fn kanban_template_exports_form_and_card_handles() { assert_ne!(ui::board::handles::create_card.id().id, ui::board::handles::move_right.id().id); assert_eq!(ui::board::forms::create_card.field("title").resource, ui::board::forms::create_card.id()); } }