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)]
|
#[derive(Clone, Debug)]
|
||||||
|
#[slhx::form("new_todo")]
|
||||||
struct TodoInput {
|
struct TodoInput {
|
||||||
title: String,
|
title: String,
|
||||||
}
|
}
|
||||||
@@ -55,6 +56,20 @@ mod tests {
|
|||||||
assert!(matches!(effect.ops(), [Effect::Put { .. }]));
|
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
|
// req: examples/001 req: progressive_disclosure/001 req: build/001 req: build/005 req: codegen/002
|
||||||
#[test]
|
#[test]
|
||||||
fn todos_append_keyed_rows_from_form_input() {
|
fn todos_append_keyed_rows_from_form_input() {
|
||||||
|
|||||||
@@ -881,6 +881,13 @@ impl<T> Form<T> {
|
|||||||
self.id
|
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 {
|
pub fn field(self, name: impl Into<String>) -> ResourceRef {
|
||||||
ResourceRef::scoped(self.id, ScopeKey::Field(name.into()))
|
ResourceRef::scoped(self.id, ScopeKey::Field(name.into()))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user