use crate::brain::agent::BrainRebuild;
use crate::brain::prompt_builder::BrainLoader;
use std::time::{Duration, SystemTime};
use tempfile::TempDir;
fn t0() -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(1_000_000_000)
}
fn write_with_mtime(path: &std::path::Path, content: &str, mtime: SystemTime) {
std::fs::write(path, content).expect("write brain file");
std::fs::File::options()
.write(true)
.open(path)
.expect("open for mtime")
.set_modified(mtime)
.expect("set mtime");
}
#[test]
fn render_returns_seed_until_a_brain_file_changes() {
let dir = TempDir::new().unwrap();
let soul = dir.path().join("SOUL.md");
write_with_mtime(&soul, "--- SOUL.md ---\noriginal personality\n", t0());
let loader = BrainLoader::new(dir.path().to_path_buf());
let rebuild = BrainRebuild::new(
loader,
None,
true, false, "SEED-VERBATIM".to_string(),
);
assert_eq!(rebuild.render(), "SEED-VERBATIM");
assert_eq!(rebuild.render(), "SEED-VERBATIM", "still warm on repeat");
write_with_mtime(
&soul,
"--- SOUL.md ---\nEDITED_PERSONALITY_MARKER\n",
t0() + Duration::from_secs(60),
);
let rebuilt = rebuild.render();
assert_ne!(rebuilt, "SEED-VERBATIM", "stale seed must be dropped");
assert!(
rebuilt.contains("EDITED_PERSONALITY_MARKER"),
"rebuilt brain must reflect the on-disk edit, got:\n{rebuilt}"
);
}
#[test]
fn rebuild_is_cached_after_a_change_until_the_next_change() {
let dir = TempDir::new().unwrap();
let soul = dir.path().join("SOUL.md");
write_with_mtime(&soul, "--- SOUL.md ---\nv1\n", t0());
let loader = BrainLoader::new(dir.path().to_path_buf());
let rebuild = BrainRebuild::new(loader, None, true, false, "SEED".to_string());
write_with_mtime(
&soul,
"--- SOUL.md ---\nMARKER_V2\n",
t0() + Duration::from_secs(60),
);
let first = rebuild.render();
assert!(first.contains("MARKER_V2"));
assert_eq!(rebuild.render(), first, "no change → cached render reused");
}
#[test]
fn no_rebuild_handle_falls_back_to_static_brain() {
let dir = TempDir::new().unwrap();
let loader = BrainLoader::new(dir.path().to_path_buf());
let rebuild = BrainRebuild::new(loader, None, true, false, "ONLY-SEED".to_string());
assert_eq!(rebuild.render(), "ONLY-SEED");
}