use axum::http::StatusCode;
use lean_ctx::core::compact_directive::TestClock;
use super::compact_session_tests::{
arm, carried, carries, conversation, fresh_session, isolated_env, spawn_upstream, turn,
untouched,
};
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[serial_test::serial(cache_telemetry)]
async fn ttl_expired_directive_no_longer_reaches_its_session() {
let _iso = isolated_env();
let upstream = spawn_upstream().await;
let a = fresh_session("ttl");
carried(&upstream, &a).await;
let summary = "SUMMARY-TTL-EXPIRES";
arm(Some(&a), summary).await;
let body = conversation(&a);
assert_eq!(turn(&upstream, Some(&a), &body).await, StatusCode::OK);
assert!(
carries(&upstream.last(), summary),
"control: armed and applied"
);
let _later = TestClock::past_ttl();
assert_eq!(turn(&upstream, Some(&a), &body).await, StatusCode::OK);
let expired = upstream.last();
assert!(
!carries(&expired, summary) && untouched(&expired),
"an expired directive must not apply: {}",
expired.body
);
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[serial_test::serial(cache_telemetry)]
async fn min_interval_rearm_keeps_one_summary_then_replaces_after_it() {
let _iso = isolated_env();
let upstream = spawn_upstream().await;
let a = fresh_session("rearm");
carried(&upstream, &a).await;
let (first, quick, later) = (
"SUMMARY-REARM-FIRST",
"SUMMARY-REARM-TOO-SOON",
"SUMMARY-REARM-AFTER-INTERVAL",
);
arm(Some(&a), first).await;
let body = conversation(&a);
assert_eq!(turn(&upstream, Some(&a), &body).await, StatusCode::OK);
assert!(
carries(&upstream.last(), first),
"control: armed and applied"
);
arm(Some(&a), quick).await;
assert_eq!(turn(&upstream, Some(&a), &body).await, StatusCode::OK);
let soon = upstream.last();
assert!(
carries(&soon, first) || carries(&soon, quick),
"still compacted: {}",
soon.body
);
assert!(
soon.body.matches(first).count() <= 1 && soon.body.matches(quick).count() <= 1,
"never stacked: {}",
soon.body
);
let _clock = TestClock::past_min_interval();
carried(&upstream, &a).await;
arm(Some(&a), later).await;
assert_eq!(turn(&upstream, Some(&a), &body).await, StatusCode::OK);
let replaced = upstream.last();
assert!(carries(&replaced, later), "re-armed: {}", replaced.body);
assert!(
!carries(&replaced, first) && !carries(&replaced, quick),
"the old summary is gone: {}",
replaced.body
);
}