steam-backlog-enforcer/steam_backlog_enforcer/tests
Krzysztof kuhy Rudnicki eb1472a433 feat(enforcer): add 4-day grace period to undo a manual pick
A manual pick had no escape hatch: once locked in, every command except
done/check/status/enforce/setup/serve exited 1 for 14 days or until 100%
achievements. A wrong pick meant two weeks stuck with it.

Adds a short mistake-correction window:

- MANUAL_GRACE_DAYS = 4 — within 4 days, 'abandon-pick <app_id>' backs out
  of the pick. Outside it the command refuses and exits 1.
- The app_id must be passed explicitly and must match the active pick, so
  an abandon cannot be triggered by muscle memory.
- 'abandon-pick' joins _MANUAL_LOCK_EXEMPT_COMMANDS — the pre-dispatch
  lock check would otherwise block the only way out. It is dropped from
  the advertised command list once the window closes.
- Abandoning clears the lock and the assignment, uninstalls the game, and
  reuses the existing skipped_until cooldown for ABANDON_COOLDOWN_DAYS=30
  so 'scan' does not hand it straight back.
- _actions.abandon_manual_pick is state-only (no uninstall cascade),
  matching apply_manual_pick, so the gated MCP abandon_pick tool reuses it.

Also fixes a crash surfaced while picking a replacement game: the
SteamUnavailableError family (including SteamUpdateInProgressError, raised
when a game update defers a Steam restart) was only caught in the enforce
loop. cmd_hide, cmd_pick, cmd_pick_manual and both cmd_done reconciliation
points called hide_other_games bare, so an undrivable Steam aborted the
command with a traceback — after the pick had already been saved. All six
sites now go through the new stdout-free try_hide_other_games wrapper and
report "Library hiding: skipped (<reason>)" instead.

Verified live: lock message advertises the window, expired/wrong-id/no-arg
paths exit 1, and abandoning released the AoE2 lock, uninstalled it and
recorded the 30-day cooldown. 1030 tests pass at 100% coverage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 17:04:08 +02:00
..
__init__.py test: achieve 100% branch coverage across all python_pkg packages 2026-03-21 17:51:36 +01:00
conftest.py fix(enforcer): defer Steam restart while a game update is in progress 2026-07-18 15:59:47 +02:00
test_actions.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_cmd_done_part2.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_config.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_enforce_loop_part2.py fix(enforcer): idle when Steam is absent instead of crash-looping 2026-07-17 13:53:24 +02:00
test_enforce_loop_part3.py feat: add block-gaming command (Stage 4) + guard-lib migration cleanup 2026-07-04 11:45:54 +02:00
test_enforce_loop.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_enforcer_part2.py feat: add block-gaming command (Stage 4) + guard-lib migration cleanup 2026-07-04 11:45:54 +02:00
test_enforcer.py fix: add websockets dependency and apply ruff formatting to tests 2026-05-28 21:00:49 +02:00
test_game_install_part2.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_game_install_part3.py fix: add websockets dependency and apply ruff formatting to tests 2026-05-28 21:00:49 +02:00
test_game_install.py fix(enforcer): idle when Steam is absent instead of crash-looping 2026-07-17 13:53:24 +02:00
test_hltb_detail.py fix: sort requirements.txt and add tests for uncovered branches 2026-05-28 21:11:53 +02:00
test_hltb_part2.py feat: add pick-manual command with 2-week enforcement lock 2026-05-30 17:15:37 +02:00
test_hltb_part3.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_hltb_search_part2.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_hltb_search.py fix: HLTB count_comp=0 bug, false matches, and ProtonDB log noise 2026-05-28 20:40:51 +02:00
test_hltb.py fix: sort requirements.txt and add tests for uncovered branches 2026-05-28 21:11:53 +02:00
test_library_hider_part2.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_library_hider.py fix(enforcer): idle when Steam is absent instead of crash-looping 2026-07-17 13:53:24 +02:00
test_main_part2.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_main_part3.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_main_part4.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_main_part5.py feat: add block-gaming command (Stage 4) + guard-lib migration cleanup 2026-07-04 11:45:54 +02:00
test_main.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_mcp.py feat(enforcer): add 4-day grace period to undo a manual pick 2026-07-19 17:04:08 +02:00
test_polls_tracking_part2.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_polls_tracking.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_protondb.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_scanning_part2.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_scanning_part3.py fix: add websockets dependency and apply ruff formatting to tests 2026-05-28 21:00:49 +02:00
test_scanning_part4.py fix: add websockets dependency and apply ruff formatting to tests 2026-05-28 21:00:49 +02:00
test_scanning.py fix: add websockets dependency and apply ruff formatting to tests 2026-05-28 21:00:49 +02:00
test_stats.py Deterministically cover the SteamAPIError branch in stats refresh 2026-07-10 23:10:44 +02:00
test_steam_api.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_store_blocker_part2.py feat: add block-gaming command (Stage 4) + guard-lib migration cleanup 2026-07-04 11:45:54 +02:00
test_store_blocker.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
test_total_block.py feat: block-gaming purges Steam/Proton filesystem remnants + helper packages 2026-07-04 17:25:08 +02:00
test_update_restart_guard.py fix(enforcer): defer Steam restart while a game update is in progress 2026-07-18 15:59:47 +02:00
test_web_dataset.py feat: add pick-manual command with 2-week enforcement lock 2026-05-30 17:15:37 +02:00
test_web_server.py feat: add interactive web UI for backlog completion planning 2026-05-29 18:35:45 +02:00
test_whitelist.py Remove whitelist exception cooldown; approve immediately 2026-07-10 22:57:39 +02:00