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:
@@ -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() {
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user