test(v0): exercise checked form handler path

Use #[slhx::form] in the v0 example tests and add a checked form-handler smoke test, with a typed() helper for generated form ids so examples do not rebuild ids by hand.

req: form/001

req: form/004

req: form/006

req: derive_handler/003
This commit is contained in:
slhx agent
2026-05-25 23:52:10 +02:00
parent 21716882ab
commit 11f710d276
2 changed files with 22 additions and 0 deletions
+15
View File
@@ -15,6 +15,7 @@ mod tests {
}
#[derive(Clone, Debug)]
#[slhx::form("new_todo")]
struct TodoInput {
title: String,
}
@@ -55,6 +56,20 @@ mod tests {
assert!(matches!(effect.ops(), [Effect::Put { .. }]));
}
// req: examples/001 req: form/001 req: form/004 req: form/006 req: derive_handler/003
#[test]
fn form_handler_is_checked_against_hemplate_form() {
#[slhx::handler]
fn add_todo(_form: slhx::Form<TodoInput>) -> impl IntoEffect {
ui::slots::todo_list.text("queued")
}
let effect = inspect(add_todo(ui::forms::new_todo.typed::<TodoInput>()));
assert!(effect.has_slot(ui::slots::todo_list));
assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Text(_), .. }]));
}
// req: examples/001 req: progressive_disclosure/001 req: build/001 req: build/005 req: codegen/002
#[test]
fn todos_append_keyed_rows_from_form_input() {
+7
View File
@@ -881,6 +881,13 @@ impl<T> Form<T> {
self.id
}
pub const fn typed<U>(self) -> Form<U> {
Form {
id: self.id,
_marker: PhantomData,
}
}
pub fn field(self, name: impl Into<String>) -> ResourceRef {
ResourceRef::scoped(self.id, ScopeKey::Field(name.into()))
}