#![allow(unsafe_code)]
use std::sync::Arc;
use lunaris::{ConsolidatorPipelineHandle, NoopConsolidator};
use lunaris_consolidate::Consolidator;
use parking_lot::Mutex;
static ENV_GUARD: Mutex<()> = Mutex::new(());
fn with_clean_env<F: FnOnce()>(f: F) {
let guard = ENV_GUARD.lock();
unsafe { std::env::remove_var("LUNARIS_CONSOLIDATOR_BACKEND") };
f();
unsafe { std::env::remove_var("LUNARIS_CONSOLIDATOR_BACKEND") };
drop(guard);
}
#[test]
fn default_backend_is_actr() {
with_clean_env(|| {
let backend = ConsolidatorPipelineHandle::backend_from_env()
.expect("unset env resolves Ok(ActRConsolidator)");
assert_eq!(
backend.debug_name(),
"ActRConsolidator",
"default (env unset) MUST resolve to ActRConsolidator per CONSOL-V1-01"
);
});
}
#[test]
fn env_noop_opts_out() {
with_clean_env(|| {
unsafe { std::env::set_var("LUNARIS_CONSOLIDATOR_BACKEND", "noop") };
let backend = ConsolidatorPipelineHandle::backend_from_env()
.expect("noop env value resolves Ok(NoopConsolidator)");
assert_eq!(
backend.debug_name(),
"NoopConsolidator",
"operator opt-out via env var MUST pin NoopConsolidator"
);
});
}
#[test]
fn scope_filter_intact_after_flip() {
with_clean_env(|| {
let backend =
ConsolidatorPipelineHandle::backend_from_env().expect("default backend resolves");
let h = ConsolidatorPipelineHandle::new(false, backend);
h.enable_for_scope("helios:fs/");
assert_eq!(
h.scope_prefix(),
Some("helios:fs/".to_string()),
"enable_for_scope still installs the prefix after the default flip"
);
});
}
#[test]
fn set_consolidator_code_override_still_works() {
with_clean_env(|| {
let backend =
ConsolidatorPipelineHandle::backend_from_env().expect("default backend resolves");
let h = ConsolidatorPipelineHandle::new(false, backend);
assert_eq!(
h.snapshot_consolidator().unwrap().debug_name(),
"ActRConsolidator",
"default seat is ActRConsolidator before override"
);
h.set_consolidator(Arc::new(NoopConsolidator) as Arc<dyn Consolidator>);
assert_eq!(
h.snapshot_consolidator().unwrap().debug_name(),
"NoopConsolidator",
"set_consolidator(Arc::new(NoopConsolidator)) pins the noop backend"
);
});
}
#[test]
fn env_unknown_value_fails_fast() {
with_clean_env(|| {
unsafe { std::env::set_var("LUNARIS_CONSOLIDATOR_BACKEND", "ollama") };
let result = ConsolidatorPipelineHandle::backend_from_env();
let err = match result {
Ok(_) => panic!("unknown backend values MUST NOT silently fall back"),
Err(e) => e,
};
let msg = format!("{err}");
assert!(
msg.contains("LUNARIS_CONSOLIDATOR_BACKEND"),
"error must name the env var; got: {msg}"
);
assert!(
msg.contains("ollama") || msg.contains("actr") || msg.contains("noop"),
"error must be descriptive; got: {msg}"
);
});
}