use std::sync::Arc;
use khive_pack_brain::BrainPack;
use khive_pack_kg::KgPack;
use khive_runtime::{DispatchHook, KhiveRuntime, VerbRegistryBuilder};
use serde_json::json;
#[tokio::test]
async fn brain_pack_dispatch_hook_records_real_dispatch_events() {
let rt = KhiveRuntime::memory().expect("in-memory runtime");
let brain = Arc::new(BrainPack::new(rt.clone()));
let baseline = brain.snapshot();
let mut builder = VerbRegistryBuilder::new();
builder.register(KgPack::new(rt));
let hook: Arc<dyn DispatchHook> = brain.clone();
builder.with_dispatch_hook(hook);
let registry = builder.build().expect("registry builds");
let _ = registry
.dispatch(
"create",
json!({
"kind": "entity",
"name": "HookProbe",
"entity_kind": "concept"
}),
)
.await
.expect("create entity must succeed");
let after = brain.snapshot();
assert_eq!(
after.total_events,
baseline.total_events + 1,
"#158 regression: total_events did not advance after a successful KG \
verb dispatch. Hook is wired (audit) but evidently no event reached \
the fold. baseline={}, after={}",
baseline.total_events,
after.total_events,
);
for i in 0..2 {
let _ = registry
.dispatch(
"create",
json!({
"kind": "entity",
"name": format!("HookProbe{i}"),
"entity_kind": "concept"
}),
)
.await
.expect("subsequent create must succeed");
}
let final_state = brain.snapshot();
assert_eq!(
final_state.total_events,
baseline.total_events + 3,
"hook must fire once per successful dispatch: expected {}+3 events, got {}",
baseline.total_events,
final_state.total_events,
);
}
#[tokio::test]
async fn brain_pack_hook_does_not_fire_on_unknown_verb() {
let rt = KhiveRuntime::memory().expect("in-memory runtime");
let brain = Arc::new(BrainPack::new(rt.clone()));
let baseline = brain.snapshot();
let mut builder = VerbRegistryBuilder::new();
builder.register(KgPack::new(rt));
let hook: Arc<dyn DispatchHook> = brain.clone();
builder.with_dispatch_hook(hook);
let registry = builder.build().expect("registry builds");
let _ = registry.dispatch("frobnicate_nonexistent", json!({})).await;
let after = brain.snapshot();
assert_eq!(
after.parameters.len(),
baseline.parameters.len(),
"unknown verb must NOT change brain state — got {} params, baseline had {}",
after.parameters.len(),
baseline.parameters.len()
);
}