test(peer): cover installed-only rescan readiness

Add a focused local-library test for the case where a game starts with only a
committed `local/` install and later gains a root `version.ini` sentinel. The
single-game rescan now has coverage showing it promotes the summary from
LocalOnly to Ready while preserving the installed flag and reading the local
version.

This pins the cached-index transition called out in FOLLOW_UP_2.md without
touching scanner dispatch or broader monitor behavior.

Test Plan:
- git diff --check
- just fmt
- just clippy
- just test

Follow-up-Plan: FOLLOW_UP_2.md
This commit is contained in:
2026-05-16 09:09:50 +02:00
parent 3abb2e051b
commit c7b7ab7576
+33
View File
@@ -716,6 +716,39 @@ mod tests {
assert!(!scan.summaries.contains_key("non-catalog"));
}
#[tokio::test]
async fn rescan_promotes_installed_only_game_to_ready_when_sentinel_appears() {
let temp = TempDir::new();
let catalog = HashSet::from(["game".to_string()]);
std::fs::create_dir_all(temp.path().join("game").join("local"))
.expect("local install dir should be created");
let first_scan = scan_local_library(temp.path(), &catalog)
.await
.expect("initial scan should succeed");
let local_only = first_scan
.summaries
.get("game")
.expect("installed-only game should be indexed");
assert!(!local_only.downloaded);
assert!(local_only.installed);
assert_eq!(local_only.availability, Availability::LocalOnly);
write_file(&temp.path().join("game").join("version.ini"), b"20250101");
let rescan = rescan_local_game(temp.path(), &catalog, "game")
.await
.expect("rescan should succeed");
let ready = rescan
.summaries
.get("game")
.expect("ready game should remain indexed");
assert!(ready.downloaded);
assert!(ready.installed);
assert_eq!(ready.eti_version.as_deref(), Some("20250101"));
assert_eq!(ready.availability, Availability::Ready);
}
#[tokio::test]
async fn local_download_available_gates_on_catalog_operation_and_sentinel() {
let temp = TempDir::new();