steam-backlog-enforcer/steam_backlog_enforcer/tests
Krzysztof kuhy Rudnicki 401031602e Always allow games with zero achievements
Owned games Steam confirms have no achievements can never be assigned or
completed, so the enforcer no longer uninstalls, hides or kills them as
unauthorized. The gaming-time budget kill still applies to them.

Fail-closed: unknown status (no cache, other account, unreadable config
or snapshot, request error) keeps a game enforced. The set comes from
no_achievements_cache.json minus snapshot.json, so a game that gains
achievements is enforced again after the next scan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzxdWWAkVShjD2Bo6hM88B
2026-11-01 22:00:35 +01:00
..
__init__.py test: achieve 100% branch coverage across all python_pkg packages 2026-03-21 17:51:36 +01:00
_budget_dates.py budget: price the enforced budget by the 06:00 gaming day's leisure switch 2026-10-19 17:09:33 +02:00
_ctl_fixtures.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
_fake_proc.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
_fake_prompter.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
_fake_session.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
_fake_xlib.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
_isolate_control_plane.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
_isolate_incidents.py Stop the suite writing into the real incident log 2026-08-30 15:30:22 +02:00
_isolate_leisure.py budget: price the enforced budget by the 06:00 gaming day's leisure switch 2026-10-19 17:09:33 +02:00
_isolate_playtime.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
_isolate_reading.py budget: resolve gaming time from the shared earned_time registry 2026-10-04 19:01:27 +02:00
_isolate_shadow.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
_jobs_helpers.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
_ledger_fixtures.py budget: resolve gaming time from the shared earned_time registry 2026-10-04 19:01:27 +02:00
_leisure_fake_proc.py leisure Phase 2 (dormant): bill, warn and kill on the leisure budget from go-live 2026-10-19 16:40:49 +02:00
_main_helpers.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
_no_fast_install.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
_no_real_effects.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
_no_subprocess.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
_no_systemd_run.py restart safety: own scope for launched Steam, hold the day's budget, re-arm warnings after a raise 2026-10-04 19:14:20 +02:00
_no_workout_http.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
_total_block_paths.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
_web_request.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
_zero_ach.py Always allow games with zero achievements 2026-11-01 22:00:35 +01:00
conftest.py leisure Phase 2 (dormant): bill, warn and kill on the leisure budget from go-live 2026-10-19 16:40:49 +02:00
fast_install_log_excerpt.txt pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_achievement_skip.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_actions_abandon_manual_pick.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_actions_status_payload.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_actions.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_assignment_progress.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
test_atomic_write.py Show the gaming budget in the web UI 2026-08-29 07:17:42 +02:00
test_attribution_labels.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_backups.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_bonus_incident.py Pay an hour of gaming budget for a LeetCode solve 2026-08-30 15:22:18 +02:00
test_budget_games.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
test_budget_log_tail.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
test_budget_resolve_leisure.py budget: price the enforced budget by the 06:00 gaming day's leisure switch 2026-10-19 17:09:33 +02:00
test_budget_resolve_reading.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_budget_resolve.py playtime: drop the Fri-Mon carry-over; log budget on change only 2026-10-18 21:37:29 +02:00
test_budget_view_collection.py tests: collecting test_budget_view never reads the host's leisure switch 2026-10-19 17:06:22 +02:00
test_budget_view_earners.py earned_time 0.5.0: per-day registry consumer (registry_for), pin v0.5.0 2026-10-09 21:13:12 +02:00
test_budget_view.py tests: collecting test_budget_view never reads the host's leisure switch 2026-10-19 17:06:22 +02:00
test_cmd_done_part2.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_cmd_playtime.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_cmd_serve.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
test_command_catalog.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_command_gate.py total block: two-unit countdown (2w 2d … 45s), ticking every second 2026-10-23 20:59:41 +02:00
test_command_params.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_config_interactive_setup.py Show the gaming budget in the web UI 2026-08-29 07:17:42 +02:00
test_config.py budget: resolve gaming time from the shared earned_time registry 2026-10-04 19:01:27 +02:00
test_ctl_client.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_ctl_context.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_control.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_ops_privileged.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_ops.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_ctl_pending.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_protocol.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_reset_ops.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_restart.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_ctl_server_internals.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ctl_server.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_desktop_env.py Pass SDL_JOYSTICK_HIDAPI_LG4FF=0 to Steam so the G29 keeps force feedback 2026-09-14 21:35:15 +02:00
test_desktop_session_gating.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_desktop_user_cmd.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_do_enforce.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_enforce_demo.py total block: two-unit countdown (2w 2d … 45s), ticking every second 2026-10-23 20:59:41 +02:00
test_enforce_loop_part2.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_enforce_loop_part3.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_enforce_loop.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_enforce_steps.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_enforcer_part2.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_enforcer.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_ensure_debug_port.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_ensure_steam_running.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_exception_visibility.py Timed store window that survives hosts reinstalls; whitelist exceptions stay visible 2026-10-03 13:43:32 +02:00
test_fast_install_dashboard.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_fast_install_failure.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_fast_install_guards.py fix: fast install ignores other downloads; install offers any allowed game 2026-10-16 15:21:00 +02:00
test_fast_install_helpers.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_fast_install_job_wait.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_fast_install_progress.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_fast_install_runs.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_file_wake.py budget: wake on screen-locker's log.json; stat stamps drop stale earner answers 2026-10-09 18:52:58 +02:00
test_first_credits.py earned_time 0.6.0: maturity-aware penalty start (first_credits), pin v0.6.0 2026-10-09 21:42:59 +02:00
test_game_install_guard.py Re-arm the no-library warning before install_game's early return 2026-08-24 14:04:54 +02:00
test_game_install_part2.py fix: fast install ignores other downloads; install offers any allowed game 2026-10-16 15:21:00 +02:00
test_game_install_part3.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
test_game_install_queue.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_game_install.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_game_names.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_gaming_days.py playtime: drop the Fri-Mon carry-over; log budget on change only 2026-10-18 21:37:29 +02:00
test_gaming_reset.py playtime: drop the Fri-Mon carry-over; log budget on change only 2026-10-18 21:37:29 +02:00
test_hltb_build_search_payload.py Bring the HLTB modules under the 250-line cap 2026-08-24 15:23:13 +02:00
test_hltb_confidence_helpers.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_hltb_detail_extract_comp100_avg_and_high.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_detail_fetch_leisure_times_save_interval.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_detail_fetch_leisure_times.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_detail_process_game_detail.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_detail.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_fetch_hltb_detail_missing.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_hltb_part2.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_hltb_part3.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_hltb_pick_best_hltb_entry_alias_exact_match_beats_spinoff.py Bring the HLTB modules under the 250-line cap 2026-08-24 15:23:13 +02:00
test_hltb_pick_best_hltb_entry.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
test_hltb_progress_cb.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_hltb_search_extract_leisure_hours.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_search_fetch_batch_hltb.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_search_part2.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_search_url_memo.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_hltb_search_zero_comp_100_skipped.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_hltb_search.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_hltb.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_jobs_control.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_daemon_jobs.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_events.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_job_io.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_prompter.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_registry.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_jobs_runner_parts.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_runner.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_spawn.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_specs_errors.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_store.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_jobs_view.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_ledger_earners.py earned_time 0.6.0: maturity-aware penalty start (first_credits), pin v0.6.0 2026-10-09 21:42:59 +02:00
test_ledger_units.py deps: earned_time 0.8.0 (per-minute tutor credit), fix stale 15-minute block comments 2026-10-10 18:22:04 +02:00
test_leetcode_bonus.py LeetCode hour needs the day paid in full (earned_time 0.18.0); gate_off read live from leetcode-guard 2026-10-24 13:26:28 +02:00
test_leetcode_ledger_errors.py Pay an hour of gaming budget for a LeetCode solve 2026-08-30 15:22:18 +02:00
test_leetcode_ledger.py LeetCode hour needs the day paid in full (earned_time 0.18.0); gate_off read live from leetcode-guard 2026-10-24 13:26:28 +02:00
test_leetcode_paid_day.py LeetCode hour needs the day paid in full (earned_time 0.18.0); gate_off read live from leetcode-guard 2026-10-24 13:26:28 +02:00
test_leisure_kill_debounce.py leisure kill: sweep only after 30 s of continuous untrusted now.json 2026-10-19 17:04:38 +02:00
test_leisure_kill_start.py leisure kill: a reason's start time pins the process (PID reuse) 2026-10-19 17:10:44 +02:00
test_leisure_kill.py leisure kill: sweep only after 30 s of continuous untrusted now.json 2026-10-19 17:04:38 +02:00
test_leisure_mode.py leisure Phase 2 (dormant): bill, warn and kill on the leisure budget from go-live 2026-10-19 16:40:49 +02:00
test_leisure_never_kill.py leisure kill: never signal the desktop session, whatever now.json says 2026-10-19 17:03:09 +02:00
test_leisure_procs_identity.py leisure kill: wsg-grabber only as the program run; see through (deleted) exes 2026-10-19 17:01:21 +02:00
test_leisure_procs.py leisure Phase 2 (dormant): bill, warn and kill on the leisure budget from go-live 2026-10-19 16:40:49 +02:00
test_leisure_tick.py leisure Phase 2 (dormant): bill, warn and kill on the leisure budget from go-live 2026-10-19 16:40:49 +02:00
test_library_hider_ops.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_library_hider_part2.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_library_hider.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_main_abandon.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_dispatch_extra.py Timed store window that survives hosts reinstalls; whitelist exceptions stay visible 2026-10-03 13:43:32 +02:00
test_main_dispatch.py Split main.py (1076 lines) into a main/ package 2026-08-23 19:56:34 +02:00
test_main_done.py Split _actions, _whitelist, _cmd_done and hltb under the cap 2026-08-24 14:55:57 +02:00
test_main_entrypoint.py Split main.py (1076 lines) into a main/ package 2026-08-23 19:56:34 +02:00
test_main_gate.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_install_pick.py fix: fast install ignores other downloads; install offers any allowed game 2026-10-16 15:21:00 +02:00
test_main_install.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_main_misc_gating.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_misc.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_part2.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
test_main_part2b.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
test_main_part2c.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
test_main_pick_cap.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_main_pick_keep.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_main_pick_manual_cascade.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_pick_manual.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_picks.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_main_shared.py total block: two-unit countdown (2w 2d … 45s), ticking every second 2026-10-23 20:59:41 +02:00
test_main_status_two_picks.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_main_status.py total block: two-unit countdown (2w 2d … 45s), ticking every second 2026-10-23 20:59:41 +02:00
test_mcp_actions.py Deduplicate snapshot loading, pick application and library hiding into shared helpers 2026-09-25 18:44:07 +02:00
test_mcp_gaming_time.py Show the gaming budget in the web UI 2026-08-29 07:17:42 +02:00
test_mcp.py Deduplicate snapshot loading, pick application and library hiding into shared helpers 2026-09-25 18:44:07 +02:00
test_no_real_effects.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_own_pick.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_owned_apps_cache.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_pacman.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_pick_completion.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
test_pick_keep.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_pick_manual_keep.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_playtime_block_part2.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_playtime_block.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_playtime_cutoff.py playtime: drop the Fri-Mon carry-over; log budget on change only 2026-10-18 21:37:29 +02:00
test_playtime_history.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
test_playtime_kill.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_playtime_log.py playtime: drop the Fri-Mon carry-over; log budget on change only 2026-10-18 21:37:29 +02:00
test_playtime_notify.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_playtime_part2.py Pay an hour of gaming budget for a LeetCode solve 2026-08-30 15:22:18 +02:00
test_playtime_policy.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_playtime_proctree.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_playtime_session.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_playtime_tick.py tests: block real kills/Steam spawns (a stale demo test killed the live game); enforce --demo is budget-only 2026-10-10 19:15:11 +02:00
test_playtime.py budget: resolve gaming time from the shared earned_time registry 2026-10-04 19:01:27 +02:00
test_polls_tracking_backfill_polls_for_finished.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_polls_tracking_part2.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_polls_tracking_report_assigned_confidence.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_polls_tracking_report_poll_confidence_chosen_zero_polls_report_poll_confidence_chosen_equals_min.py Split steam_api and _scanning_confidence under the cap 2026-08-24 14:25:43 +02:00
test_polls_tracking_report_poll_confidence_chosen_zero_polls.py Split steam_api and _scanning_confidence under the cap 2026-08-24 14:25:43 +02:00
test_polls_tracking.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_prompter.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_protondb_fetch_batch.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_protondb_fetch_one.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_protondb.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_reading_bonus.py Reading hour from book-guard: +1h gaming, 8h cap; base 5h->4h from 2026-10-01 2026-09-26 19:12:21 +02:00
test_release_lifecycle.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_remaining.py total block: two-unit countdown (2w 2d … 45s), ticking every second 2026-10-23 20:59:41 +02:00
test_scanning_assign_pick.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_scanning_cached_confidence_overlay_avoids_refetch.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_scanning_confidence_helpers_pick_next_shortest_candidate_no_echo_whe.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_scanning_confidence_helpers.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_scanning_part2.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_scanning_part3.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
test_scanning_part4.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_scanning_pick_next_game_sequential.py Release a game after one new achievement instead of 100% completion 2026-09-26 16:46:03 +02:00
test_scanning_pick_next_game_unknown_hours.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
test_scanning_pick_next_game.py Install games with steam-game-installer (depotdownloader) for speed, falling back to steam://install 2026-09-25 18:45:27 +02:00
test_scanning_tampering_window.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_scanning.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_serve_guard_lifecycle.py Stop the web UI serving numbers the enforcer is not applying 2026-08-29 23:39:40 +02:00
test_serve_guard.py Make the fd-scan test independent of iterdir() order 2026-08-29 18:57:01 +02:00
test_serve_stale.py Stop the web UI serving numbers the enforcer is not applying 2026-08-29 23:39:40 +02:00
test_serve_startup.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
test_shadow_budget.py shadow: no exception can escape into the enforce loop; warn once per pricing 2026-10-19 13:16:16 +02:00
test_shadow_guard.py shadow: forget expired warnings so varying messages cannot grow memory 2026-10-19 13:20:08 +02:00
test_shadow_log.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_shadow.py shadow: fail closed instead of raising on unreadable lock/fact inputs 2026-10-19 12:50:41 +02:00
test_stats_cmd_stats_refilter_called_when_ensure_rush_data_re.py Deduplicate snapshot loading, pick application and library hiding into shared helpers 2026-09-25 18:44:07 +02:00
test_stats_cmd_stats.py Deduplicate snapshot loading, pick application and library hiding into shared helpers 2026-09-25 18:44:07 +02:00
test_stats_ensure_rush_data.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_stats_print_player_speed_scenario.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_stats_print_worst_example.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_stats_refresh_recently_played_completions.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_stats_sum_hours.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_stats_unplayable_rating_counts_linux_skipped.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_stats.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
test_status_api_stamp.py budget: wake on screen-locker's log.json; stat stamps drop stale earner answers 2026-10-09 18:52:58 +02:00
test_status_kept_picks.py pick keeps already-picked games; fast install reports progress 2026-10-23 20:14:12 +02:00
test_steam_api_scan_extras.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_steam_api_steam_a_p_i_client.py Split steam_api and _scanning_confidence under the cap 2026-08-24 14:25:43 +02:00
test_steam_api.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_steam_launch_lifecycle.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_steam_process_scope.py restart safety: own scope for launched Steam, hold the day's budget, re-arm warnings after a raise 2026-10-04 19:14:20 +02:00
test_steam_restart_guard.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
test_steam_restart.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
test_store_blocker_block_via_hosts_install.py Point the iptables tests at the module that now holds the code 2026-08-24 15:07:58 +02:00
test_store_blocker_part2.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_store_blocker_unblock_store.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_store_blocker.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_store_window.py Timed store window that survives hosts reinstalls; whitelist exceptions stay visible 2026-10-03 13:43:32 +02:00
test_total_block_hosts.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_total_block_iptables.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_total_block_lifecycle.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_total_block_purge.py playtime: shadow leisure billing (C4); /proc scan from leisure_watch 2026-10-19 12:37:01 +02:00
test_total_block_remnants.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
test_total_block.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_update_restart_guard.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
test_web_art.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_auth.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_build.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
test_web_daemon.py fast install: never report a failed run as success; queue the manifest first 2026-10-24 08:36:57 +02:00
test_web_dataset_build_games.py Bring _web_dataset.py under the 250-line cap — cap campaign complete 2026-08-24 16:08:12 +02:00
test_web_dataset_compute_pace_vs_h_l_t_b_both_rush_and_leisure_interpolation_comp.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_web_dataset_compute_pace_vs_h_l_t_b.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_web_dataset_count_complete_since_start.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
test_web_dataset_dataset_to_payload.py Bring _web_dataset.py under the 250-line cap — cap campaign complete 2026-08-24 16:08:12 +02:00
test_web_dataset.py Bring every test file under the 250-line cap 2026-08-24 14:16:08 +02:00
test_web_errors.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_io.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_jobs.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_library.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_privileged.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_process.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_routes.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_server_routing.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_server_stale.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_server_static.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_server.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_setup.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_sse.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_web_views.py web control UI: all 24 commands in React, ctl.sock daemon, jobs, library browser; earned_time 0.7.0 2026-10-10 16:07:42 +02:00
test_whitelist_add_pending_exception.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_whitelist_immutable_flag_is_append_audit_log.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_whitelist_immutable_flag_is.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_whitelist.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
test_workout_budget.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
test_zero_achievement_allowed.py Always allow games with zero achievements 2026-11-01 22:00:35 +01:00
test_zero_achievement_fail_closed.py Always allow games with zero achievements 2026-11-01 22:00:35 +01:00