#[slhx::surface] pub mod ui {} #[cfg(test)] mod tests { use super::ui::{board, board_card}; use hemplate::Hemplate; use scraper::{Html, Selector}; use slhx::{Effect, IntoEffect, Payload, RenderSlotExt}; use slhx_test::inspect; #[derive(Hemplate)] #[hemplate = "partials"] struct BoardColumns { columns: Vec, } #[allow(dead_code)] #[derive(Clone, Debug)] #[slhx::form("create_card")] struct CreateCard { title: String, column: String, } // req: examples/001 req: codegen/002 req: list/003 #[test] fn kanban_board_updates_generated_slot() { fn render_board() -> impl IntoEffect { board::slots::board.render(&empty_board()) } let effect = inspect(render_board()); assert!(effect.has_slot(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 = super::ui::render(&empty_board()); let document = Html::parse_fragment(html.as_str()); assert_eq!(document.select(&selector(".columns")).count(), 1); } fn empty_board() -> BoardColumns { // req: html_safety/002 req: view/001 BoardColumns { columns: Vec::new() } } fn selector(value: &str) -> Selector { Selector::parse(value).expect("test selector parses") } // req: examples/001 req: form/001 req: form/004 req: form/006 req: derive_handler/003 #[test] fn kanban_form_handler_is_checked_against_hemplate_form() { #[slhx::handler] fn create_card(_form: slhx::Form) -> impl IntoEffect { board::slots::notice.text("queued") } let effect = inspect(create_card(CreateCard::FORM)); assert!(effect.has_slot(board::slots::notice)); assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Text(_), .. }])); } // req: examples/001 req: form/002 req: codegen/003 #[test] fn kanban_template_exports_form_and_card_handles() { assert_ne!(board::handles::create_card.id(), board_card::handles::move_right.id()); assert_eq!(board::forms::create_card.field("title").resource, board::forms::create_card.id()); } }