use crate::live::LiveComponent;
use serde_json::json;
#[derive(Default)]
struct Chat {
sent: usize,
cleared: usize,
withdrawn: usize,
}
#[crate::live_component]
impl Chat {
#[live_event]
fn send(&mut self) {
self.sent += 1;
}
#[live_event]
fn clear(&mut self) {
self.cleared += 1;
}
#[live_event]
async fn withdraw(&mut self, _payload: serde_json::Value) {
self.withdrawn += 1;
}
pub fn render(&self) -> String {
format!(
"<div id=\"chat\">{} {} {}</div>",
self.sent, self.cleared, self.withdrawn
)
}
}
impl Chat {
fn counts(&self) -> (usize, usize, usize) {
(self.sent, self.cleared, self.withdrawn)
}
}
#[tokio::test]
async fn only_the_explicit_event_field_selects_one_handler() {
let mut chat = Chat::default();
chat.handle_event(json!({"rullst_event": "send", "message": "clear"}))
.await;
assert_eq!(chat.counts(), (1, 0, 0));
chat.handle_event(json!({"send": "", "message": "clear"}))
.await;
chat.handle_event(json!({"a": "withdraw", "b": "withdraw", "withdraw": "x"}))
.await;
assert_eq!(chat.counts(), (1, 0, 0));
chat.handle_event(json!({"action": "withdraw"})).await;
chat.handle_event(json!({"event": "clear", "send": "send"}))
.await;
assert_eq!(chat.counts(), (1, 1, 1));
chat.handle_event(json!({"rullst_event": 1, "send": "send"}))
.await;
chat.handle_event(json!({"rullst_event": "unknown", "clear": "clear"}))
.await;
chat.handle_event(json!(["send", "clear"])).await;
assert_eq!(chat.counts(), (1, 1, 1));
assert_eq!(LiveComponent::render(&chat), "<div id=\"chat\">1 1 1</div>");
}