huskies: merge 1126 story Gateway event aggregator with per-session scope filters (Timmy=All, Sally=single sled)
This commit is contained in:
@@ -155,4 +155,123 @@ mod tests {
|
||||
let ctx = assemble_prompt_context("room-empty");
|
||||
assert!(ctx.is_empty(), "must be empty with no events; got: {ctx}");
|
||||
}
|
||||
|
||||
/// AC 4: two sleds each fire one transition; a session scoped `All` sees
|
||||
/// both events; a session scoped `Sleds([sled-A])` sees only sled-A's event.
|
||||
///
|
||||
/// Simulates the gateway aggregate view by directly calling
|
||||
/// `append_event_log_entry` with two distinct sled IDs, then asserting
|
||||
/// scope-filtered assembly behaves correctly.
|
||||
#[test]
|
||||
fn scope_filter_all_sees_both_sleds_filter_sees_one() {
|
||||
crate::crdt_state::init_for_test();
|
||||
|
||||
let sled_a = "aaaaaaaaaaaaaaaa";
|
||||
let sled_b = "bbbbbbbbbbbbbbbb";
|
||||
|
||||
// Each sled fires one pipeline transition.
|
||||
crate::crdt_state::append_event_log_entry(
|
||||
sled_a,
|
||||
1_000_000.0,
|
||||
"10_story_alpha",
|
||||
"1_backlog",
|
||||
"2_current",
|
||||
"DepsMet",
|
||||
);
|
||||
crate::crdt_state::append_event_log_entry(
|
||||
sled_b,
|
||||
1_000_001.0,
|
||||
"20_story_beta",
|
||||
"2_current",
|
||||
"3_qa",
|
||||
"AgentCompleted",
|
||||
);
|
||||
|
||||
// Set up a session scoped to ALL sleds.
|
||||
crate::crdt_state::write_llm_session("room-scope-all", "Timmy", "all");
|
||||
// Set up a session scoped to sled-A only.
|
||||
let sled_a_scope = format!("sleds:{sled_a}");
|
||||
crate::crdt_state::write_llm_session("room-scope-sled-a", "Sally", &sled_a_scope);
|
||||
|
||||
// All-scope session: both events must appear.
|
||||
let ctx_all = assemble_prompt_context("room-scope-all");
|
||||
assert!(
|
||||
ctx_all.contains("10_story_alpha"),
|
||||
"All scope must contain sled-A event; got: {ctx_all}"
|
||||
);
|
||||
assert!(
|
||||
ctx_all.contains("20_story_beta"),
|
||||
"All scope must contain sled-B event; got: {ctx_all}"
|
||||
);
|
||||
|
||||
// Sled-A-only session: only sled-A's event visible.
|
||||
let ctx_a = assemble_prompt_context("room-scope-sled-a");
|
||||
assert!(
|
||||
ctx_a.contains("10_story_alpha"),
|
||||
"Sleds filter must contain sled-A event; got: {ctx_a}"
|
||||
);
|
||||
assert!(
|
||||
!ctx_a.contains("20_story_beta"),
|
||||
"Sleds filter must NOT contain sled-B event; got: {ctx_a}"
|
||||
);
|
||||
|
||||
// Second call on both sessions: nothing new (high-water advanced).
|
||||
let ctx_all2 = assemble_prompt_context("room-scope-all");
|
||||
assert!(
|
||||
ctx_all2.is_empty(),
|
||||
"All scope second call must be empty; got: {ctx_all2}"
|
||||
);
|
||||
let ctx_a2 = assemble_prompt_context("room-scope-sled-a");
|
||||
assert!(
|
||||
ctx_a2.is_empty(),
|
||||
"Sleds filter second call must be empty; got: {ctx_a2}"
|
||||
);
|
||||
}
|
||||
|
||||
/// Newly-added sled events appear in an All-scope session without
|
||||
/// restarting (AC 5 runtime pickup).
|
||||
#[test]
|
||||
fn scope_filter_all_picks_up_new_sled_at_runtime() {
|
||||
crate::crdt_state::init_for_test();
|
||||
|
||||
let sled_a = "cccccccccccccccc";
|
||||
let sled_new = "dddddddddddddddd";
|
||||
|
||||
// Only sled-A exists initially.
|
||||
crate::crdt_state::append_event_log_entry(
|
||||
sled_a,
|
||||
2_000_000.0,
|
||||
"30_story_first",
|
||||
"1_backlog",
|
||||
"2_current",
|
||||
"DepsMet",
|
||||
);
|
||||
crate::crdt_state::write_llm_session("room-runtime-pickup", "Timmy", "all");
|
||||
|
||||
let ctx1 = assemble_prompt_context("room-runtime-pickup");
|
||||
assert!(
|
||||
ctx1.contains("30_story_first"),
|
||||
"first event must appear; got: {ctx1}"
|
||||
);
|
||||
|
||||
// sled_new is adopted at runtime — its event is appended without restart.
|
||||
crate::crdt_state::append_event_log_entry(
|
||||
sled_new,
|
||||
2_000_001.0,
|
||||
"40_story_second",
|
||||
"2_current",
|
||||
"3_qa",
|
||||
"AgentCompleted",
|
||||
);
|
||||
|
||||
let ctx2 = assemble_prompt_context("room-runtime-pickup");
|
||||
assert!(
|
||||
ctx2.contains("40_story_second"),
|
||||
"newly adopted sled event must appear; got: {ctx2}"
|
||||
);
|
||||
assert!(
|
||||
!ctx2.contains("30_story_first"),
|
||||
"old event must not reappear; got: {ctx2}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user