use super::*;
fn settings(entry: Option<serde_json::Value>) -> (tempfile::TempDir, PathBuf) {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("settings.json");
let body = match entry {
Some(value) => serde_json::json!({ "statusLine": value }),
None => serde_json::json!({ "outputStyle": "trusty-mpm" }),
};
std::fs::write(&path, serde_json::to_string_pretty(&body).unwrap()).expect("seed");
(dir, path)
}
#[test]
fn a_tier_with_no_entry_is_reported_missing() {
let (_dir, path) = settings(None);
assert_eq!(tier_state(&path), TierState::Missing);
let absent = std::path::Path::new("/definitely/not/here/settings.json");
assert_eq!(tier_state(absent), TierState::Missing);
}
#[test]
fn a_tier_with_a_stale_command_is_reported_stale() {
let (_dir, path) = settings(Some(serde_json::json!({
"type": "command",
"command": "/definitely/not/here/tm statusline",
"padding": 0
})));
assert_eq!(tier_state(&path), TierState::Stale);
}
fn live_statusline_command() -> String {
"/bin/sh statusline".to_string()
}
#[test]
fn a_tier_with_a_live_command_is_reported_wired() {
let (_dir, path) = settings(Some(serde_json::json!({
"type": "command",
"command": live_statusline_command(),
"padding": 0
})));
assert_eq!(tier_state(&path), TierState::Wired);
}
fn tier(state: TierState) -> (PathBuf, TierState) {
(PathBuf::from("/tmp/example/.claude/settings.json"), state)
}
#[test]
fn a_wired_machine_with_rows_is_ok() {
let check = build_statusline_check(&[tier(TierState::Wired)], Ok(12), true);
assert_eq!(check.status, CheckStatus::Ok);
assert!(check.message.contains("12 row(s)"), "{}", check.message);
}
#[test]
fn no_tier_wired_fails() {
let check = build_statusline_check(
&[tier(TierState::Missing), tier(TierState::Missing)],
Ok(12),
true,
);
assert_eq!(check.status, CheckStatus::Fail);
assert!(check.message.contains("--fix"), "{}", check.message);
}
#[test]
fn a_stale_tier_beside_a_wired_one_warns() {
let check = build_statusline_check(
&[tier(TierState::Wired), tier(TierState::Stale)],
Ok(12),
true,
);
assert_eq!(check.status, CheckStatus::Warn);
assert!(
check.message.contains("no longer on disk"),
"{}",
check.message
);
}
#[test]
fn an_unreadable_ledger_fails() {
let check = build_statusline_check(
&[tier(TierState::Wired)],
Err("permission denied".to_string()),
true,
);
assert_eq!(check.status, CheckStatus::Fail);
assert!(
check.message.contains("permission denied")
&& check.message.contains("repair savings-ledger"),
"{}",
check.message
);
}
#[test]
fn an_absent_ledger_warns() {
let check = build_statusline_check(&[tier(TierState::Wired)], Ok(0), true);
assert_eq!(check.status, CheckStatus::Warn);
assert!(check.message.contains("no rows yet"), "{}", check.message);
}
#[test]
fn an_unlistable_store_fails() {
let check = build_statusline_check(&[tier(TierState::Wired)], Ok(12), false);
assert_eq!(check.status, CheckStatus::Fail);
assert!(
check.message.contains("cannot be listed"),
"{}",
check.message
);
}
#[test]
fn an_absent_or_real_store_is_readable() {
let dir = tempfile::tempdir().expect("tempdir");
assert!(store_is_readable(&dir.path().join("usage")));
assert!(store_is_readable(dir.path()));
}
#[test]
fn an_absent_ledger_reads_as_zero_rows() {
let dir = tempfile::tempdir().expect("tempdir");
assert_eq!(ledger_state(&dir.path().join("savings.jsonl")), Ok(0));
let ledger = dir.path().join("savings.jsonl");
std::fs::write(&ledger, "{}\n\n{}\n").expect("seed");
assert_eq!(ledger_state(&ledger), Ok(2));
}