use super::*;
fn cache() -> (CacheManager, tempfile::TempDir) {
let dir = tempfile::tempdir().expect("temp dir");
(CacheManager::with_dir(dir.path().to_path_buf()), dir)
}
#[test]
fn a_terminals_last_answer_is_kept_per_terminal() {
use crate::config::ThemeMode;
let (cache, _keep) = cache();
assert_eq!(cache.terminal_mode("WezTerm"), None);
cache.remember_terminal_mode("WezTerm", ThemeMode::Light);
cache.remember_terminal_mode("tmux", ThemeMode::Dark);
assert_eq!(cache.terminal_mode("WezTerm"), Some(ThemeMode::Light));
assert_eq!(cache.terminal_mode("tmux"), Some(ThemeMode::Dark));
cache.remember_terminal_mode("WezTerm", ThemeMode::Dark);
assert_eq!(cache.terminal_mode("WezTerm"), Some(ThemeMode::Dark));
assert_eq!(cache.terminal_mode("tmux"), Some(ThemeMode::Dark));
assert_eq!(cache.terminal_mode(""), None);
}
#[test]
fn a_recent_whose_directory_is_gone_is_forgotten() {
let (cache, _keep) = cache();
let scratch = tempfile::tempdir().expect("scratch");
let dataset = scratch.path().join("people.csv");
std::fs::write(&dataset, b"a,b\n1,2\n").expect("write");
let dataset = crate::canonical::canonicalize(&dataset).expect("canonicalize");
cache.push_recent(&dataset);
assert!(cache.load_recents().iter().any(|p| p == &dataset));
let elsewhere = tempfile::tempdir().expect("elsewhere");
let survivor = elsewhere.path().join("still-here.csv");
std::fs::write(&survivor, b"a\n1\n").expect("write");
drop(scratch);
cache.push_recent(&survivor);
let recents = cache.load_recents();
assert!(
!recents.iter().any(|p| p == &dataset),
"the dead path should be gone; got {recents:?}"
);
assert!(
recents
.iter()
.any(|p| p.file_name() == survivor.file_name()),
"the live path should remain; got {recents:?}"
);
}
#[test]
fn a_deleted_file_in_a_directory_that_still_exists_is_kept() {
let (cache, _keep) = cache();
let scratch = tempfile::tempdir().expect("scratch");
let dataset = scratch.path().join("nightly.parquet");
std::fs::write(&dataset, b"x").expect("write");
let dataset = crate::canonical::canonicalize(&dataset).expect("canonicalize");
cache.push_recent(&dataset);
std::fs::remove_file(&dataset).expect("remove");
let other = scratch.path().join("other.csv");
std::fs::write(&other, b"a\n1\n").expect("write");
cache.push_recent(&other);
assert!(
cache.load_recents().iter().any(|p| p == &dataset),
"a missing file in a live directory should stay"
);
}
#[test]
fn a_remote_recent_is_never_stated_let_alone_dropped() {
let (cache, _keep) = cache();
let scratch = tempfile::tempdir().expect("scratch");
let local = scratch.path().join("local.csv");
std::fs::write(&local, b"a\n1\n").expect("write");
for url in [
"s3://bucket/warehouse/events.parquet",
"gs://bucket/data.csv",
"https://example.com/data.csv",
] {
cache.push_recent(std::path::Path::new(url));
}
cache.push_recent(&local);
let recents = cache.load_recents();
for url in [
"s3://bucket/warehouse/events.parquet",
"gs://bucket/data.csv",
"https://example.com/data.csv",
] {
assert!(
recents.iter().any(|p| p.to_string_lossy() == url),
"{url} should have survived; got {recents:?}"
);
}
}