diff --git a/steam_backlog_enforcer/library_hider.py b/steam_backlog_enforcer/library_hider.py index 21e4d61..6c5d23f 100644 --- a/steam_backlog_enforcer/library_hider.py +++ b/steam_backlog_enforcer/library_hider.py @@ -24,8 +24,8 @@ import pwd import shutil import subprocess import time -import urllib.request +import requests import websockets logger = logging.getLogger(__name__) @@ -42,10 +42,9 @@ _STEAM_STARTUP_WAIT = 45 def _get_shared_js_ws_url() -> str | None: """Query the CDP HTTP endpoint and return the SharedJSContext WS URL.""" - url = f"http://127.0.0.1:{_CDP_PORT}/json" try: - with urllib.request.urlopen(url, timeout=5) as resp: - targets = json.loads(resp.read()) + resp = requests.get(f"http://127.0.0.1:{_CDP_PORT}/json", timeout=5) + targets = resp.json() except (OSError, ValueError): return None diff --git a/steam_backlog_enforcer/tests/test_game_install_part2.py b/steam_backlog_enforcer/tests/test_game_install_part2.py index 099b4a2..7aa18b1 100644 --- a/steam_backlog_enforcer/tests/test_game_install_part2.py +++ b/steam_backlog_enforcer/tests/test_game_install_part2.py @@ -63,7 +63,7 @@ class TestRemoveGameDirs: (tmp_path / "shadercache" / "440").mkdir(parents=True) call_count = 0 - def fake_rmtree(path: object, **_kw: object) -> None: + def fake_rmtree(_path: object, **_kw: object) -> None: nonlocal call_count call_count += 1 msg = "perm" diff --git a/steam_backlog_enforcer/tests/test_hltb.py b/steam_backlog_enforcer/tests/test_hltb.py index 9e07c6c..083128d 100644 --- a/steam_backlog_enforcer/tests/test_hltb.py +++ b/steam_backlog_enforcer/tests/test_hltb.py @@ -25,6 +25,7 @@ from python_pkg.steam_backlog_enforcer.hltb import ( ) if TYPE_CHECKING: + from collections.abc import Callable from pathlib import Path @@ -243,7 +244,7 @@ def _make_ctx( session: MagicMock, *, cache: dict[int, float] | None = None, - progress_cb: Any = None, + progress_cb: Callable[..., object] | None = None, ) -> _SearchCtx: return _SearchCtx( session=session, diff --git a/steam_backlog_enforcer/tests/test_hltb_part2.py b/steam_backlog_enforcer/tests/test_hltb_part2.py index 2253828..4f0eedc 100644 --- a/steam_backlog_enforcer/tests/test_hltb_part2.py +++ b/steam_backlog_enforcer/tests/test_hltb_part2.py @@ -33,7 +33,7 @@ class TestFetchHltbTimesCached: ): # fetch_hltb_times modifies cache in-place def add_to_cache( - games: object, + _games: object, cache: dict[int, float] | None = None, progress_cb: object = None, ) -> list[object]: @@ -85,7 +85,7 @@ class TestFetchHltbTimesCached: ): def add_found( - games: object, + _games: object, cache: dict[int, float] | None = None, progress_cb: object = None, ) -> list[object]: diff --git a/steam_backlog_enforcer/tests/test_library_hider.py b/steam_backlog_enforcer/tests/test_library_hider.py index beb9913..4ebad97 100644 --- a/steam_backlog_enforcer/tests/test_library_hider.py +++ b/steam_backlog_enforcer/tests/test_library_hider.py @@ -37,11 +37,9 @@ class TestGetSharedJsWsUrl: {"title": "Other", "webSocketDebuggerUrl": "ws://other"}, ] mock_resp = MagicMock() - mock_resp.read.return_value = json.dumps(targets).encode() - mock_resp.__enter__ = MagicMock(return_value=mock_resp) - mock_resp.__exit__ = MagicMock(return_value=False) + mock_resp.json.return_value = targets with patch( - "python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen", + "python_pkg.steam_backlog_enforcer.library_hider.requests.get", return_value=mock_resp, ): result = _get_shared_js_ws_url() @@ -50,18 +48,16 @@ class TestGetSharedJsWsUrl: def test_no_shared_context(self) -> None: targets = [{"title": "Other", "webSocketDebuggerUrl": "ws://other"}] mock_resp = MagicMock() - mock_resp.read.return_value = json.dumps(targets).encode() - mock_resp.__enter__ = MagicMock(return_value=mock_resp) - mock_resp.__exit__ = MagicMock(return_value=False) + mock_resp.json.return_value = targets with patch( - "python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen", + "python_pkg.steam_backlog_enforcer.library_hider.requests.get", return_value=mock_resp, ): assert _get_shared_js_ws_url() is None def test_connection_error(self) -> None: with patch( - "python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen", + "python_pkg.steam_backlog_enforcer.library_hider.requests.get", side_effect=OSError, ): assert _get_shared_js_ws_url() is None diff --git a/steam_backlog_enforcer/tests/test_library_hider_part2.py b/steam_backlog_enforcer/tests/test_library_hider_part2.py index 5c745da..7078779 100644 --- a/steam_backlog_enforcer/tests/test_library_hider_part2.py +++ b/steam_backlog_enforcer/tests/test_library_hider_part2.py @@ -3,6 +3,7 @@ from __future__ import annotations import os +import tempfile from unittest.mock import MagicMock, patch from python_pkg.steam_backlog_enforcer.library_hider import ( @@ -32,7 +33,10 @@ class TestRunAsUser: with ( patch(f"{PKG}.os.geteuid", return_value=0), patch(f"{PKG}.pwd.getpwnam", return_value=mock_pw), - patch.dict(os.environ, {"DISPLAY": ":1", "XAUTHORITY": "/tmp/.X"}), + patch.dict( + os.environ, + {"DISPLAY": ":1", "XAUTHORITY": tempfile.gettempdir() + "/.X"}, + ), patch(f"{PKG}.subprocess.Popen") as mock_popen, ): _run_as_user(["steam", "-shutdown"], "alice") diff --git a/steam_backlog_enforcer/tests/test_main_part2.py b/steam_backlog_enforcer/tests/test_main_part2.py index 10939f3..f7d606c 100644 --- a/steam_backlog_enforcer/tests/test_main_part2.py +++ b/steam_backlog_enforcer/tests/test_main_part2.py @@ -55,9 +55,9 @@ class TestFinalizeCompletion: ): def set_next( - games: object, + _games: object, s: State, - c: object, + _c: object, ) -> None: s.current_app_id = 2 s.current_game_name = "NewGame" @@ -89,9 +89,9 @@ class TestFinalizeCompletion: ): def set_none( - games: object, + _games: object, s: State, - c: object, + _c: object, ) -> None: s.current_app_id = None @@ -112,9 +112,9 @@ class TestFinalizeCompletion: ): def set_2( - games: object, + _games: object, s: State, - c: object, + _c: object, ) -> None: s.current_app_id = 2 s.current_game_name = "Next" @@ -137,9 +137,9 @@ class TestFinalizeCompletion: ): def set_2( - games: object, + _games: object, s: State, - c: object, + _c: object, ) -> None: s.current_app_id = 2 s.current_game_name = "Next" diff --git a/steam_backlog_enforcer/tests/test_scanning.py b/steam_backlog_enforcer/tests/test_scanning.py index 2efbe96..c9e6a55 100644 --- a/steam_backlog_enforcer/tests/test_scanning.py +++ b/steam_backlog_enforcer/tests/test_scanning.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any +from typing import TYPE_CHECKING from unittest.mock import MagicMock, patch from python_pkg.steam_backlog_enforcer.config import Config, State @@ -15,6 +15,9 @@ from python_pkg.steam_backlog_enforcer.scanning import ( ) from python_pkg.steam_backlog_enforcer.steam_api import GameInfo +if TYPE_CHECKING: + from collections.abc import Callable + def _game( app_id: int = 1, @@ -41,8 +44,8 @@ class TestDoScan: mock_client = MagicMock() def build_game_list( - skip_app_ids: Any = None, - progress_callback: Any = None, + skip_app_ids: object = None, + progress_callback: Callable[..., object] | None = None, ) -> list[GameInfo]: # Trigger progress callback to cover those lines. if progress_callback: @@ -58,7 +61,7 @@ class TestDoScan: ), patch( "python_pkg.steam_backlog_enforcer.scanning.fetch_hltb_times_cached", - side_effect=lambda games, progress_cb=None: ( + side_effect=lambda _games, progress_cb=None: ( progress_cb(1, 1, 1, "TF2") if progress_cb else None, {440: 20.0}, )[1], @@ -84,8 +87,8 @@ class TestDoScan: mock_client = MagicMock() def build_game_list( - skip_app_ids: Any = None, - progress_callback: Any = None, + skip_app_ids: object = None, + progress_callback: Callable[..., object] | None = None, ) -> list[GameInfo]: if progress_callback: # current=1, total=2 → not %50 and not ==total → covers False branch diff --git a/steam_backlog_enforcer/tests/test_steam_api.py b/steam_backlog_enforcer/tests/test_steam_api.py index 527c419..6571dc9 100644 --- a/steam_backlog_enforcer/tests/test_steam_api.py +++ b/steam_backlog_enforcer/tests/test_steam_api.py @@ -253,7 +253,7 @@ class TestSteamAPIClient: def test_fetch_one_game(self) -> None: client = SteamAPIClient("key", "id") - ach = AchievementInfo("A1", "Ach1", True, 100) + ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100) with patch.object(client, "get_achievement_details", return_value=[ach]): result = client._fetch_one_game( {"appid": 440, "name": "TF2", "playtime_forever": 60}, @@ -275,7 +275,7 @@ class TestSteamAPIClient: def test_build_game_list(self) -> None: client = SteamAPIClient("key", "id") - ach = AchievementInfo("A1", "Ach1", True, 100) + ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100) with ( patch.object( client, @@ -322,7 +322,7 @@ class TestSteamAPIClient: def test_refresh_single_game(self) -> None: client = SteamAPIClient("key", "id") - ach = AchievementInfo("A1", "Ach1", True, 100) + ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100) with patch.object(client, "get_achievement_details", return_value=[ach]): result = client.refresh_single_game(440, "TF2", 60) assert result is not None diff --git a/steam_backlog_enforcer/tests/test_store_blocker.py b/steam_backlog_enforcer/tests/test_store_blocker.py index 7a97c69..f87b3a4 100644 --- a/steam_backlog_enforcer/tests/test_store_blocker.py +++ b/steam_backlog_enforcer/tests/test_store_blocker.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from unittest.mock import MagicMock, patch from python_pkg.steam_backlog_enforcer.store_blocker import ( @@ -382,7 +382,7 @@ class TestBlockStoreIptables: ] call_count = 0 - def side_effect(*args: Any, **kwargs: Any) -> MagicMock: + def side_effect(*_args: object, **_kwargs: object) -> MagicMock: nonlocal call_count idx = min(call_count, len(results) - 1) call_count += 1 diff --git a/steam_backlog_enforcer/tests/test_store_blocker_part2.py b/steam_backlog_enforcer/tests/test_store_blocker_part2.py index aeddd43..67a5021 100644 --- a/steam_backlog_enforcer/tests/test_store_blocker_part2.py +++ b/steam_backlog_enforcer/tests/test_store_blocker_part2.py @@ -38,7 +38,7 @@ class TestDisableHostsProtection: def run_side_effect( cmd: list[str], - **kwargs: object, + **_kwargs: object, ) -> MagicMock: if any("findmnt" in str(c) for c in cmd): return findmnt_found @@ -52,7 +52,7 @@ class TestDisableHostsProtection: def run_side_effect( cmd: list[str], - **kwargs: object, + **_kwargs: object, ) -> MagicMock: if any("findmnt" in str(c) for c in cmd): return findmnt_missing