From c7b7ab7576b39b3c1f148d65b2ffe1d25e586021 Mon Sep 17 00:00:00 2001 From: ddidderr Date: Sat, 16 May 2026 09:09:50 +0200 Subject: [PATCH] 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 --- crates/lanspread-peer/src/local_games.rs | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/crates/lanspread-peer/src/local_games.rs b/crates/lanspread-peer/src/local_games.rs index 25b41dc..23dd9ed 100644 --- a/crates/lanspread-peer/src/local_games.rs +++ b/crates/lanspread-peer/src/local_games.rs @@ -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();