mirror of
https://github.com/kuhyx/screen-locker.git
synced 2026-11-10 20:27:13 +01:00
Six new modules, all composed or re-exported so no caller changes:
_shutdown.py (384) -> _shutdown_sick_state.py SickDayStateMixin
_wake_alarm.py WakeAlarmMixin
_phone_verification.py (380)-> _adb_transport.py AdbTransportMixin
_http_workout_fetch.py HttpWorkoutFetchMixin
_status_data.py (370) -> _status_types.py the 7 dataclasses
_status_projection.py shutdown projection
+ format_summary_line
Moving a name means moving where it is *read*, so 30-odd mock patch targets
move with it. Most importantly conftest.py's autouse _block_real_network
fixture: ruff correctly dropped the now-unused `socket` import from
_phone_verification, which silently removed the guard's target and would have
let subnet probes reach the real network. It now blocks socket in both modules
that actually own the probes, and both targets are asserted to exist.
976 tests pass at 100% branch coverage; pylint 8.70 -> 8.71; `screen_lock
--status` renders the real week unchanged. File-length gate: 41 -> 35.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EveB813BQ8abAP68VSqZ5Y
114 lines
4.2 KiB
Python
114 lines
4.2 KiB
Python
"""Tests for phone verification coverage gaps (part 2)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from screen_locker.tests.conftest import create_locker
|
|
|
|
if TYPE_CHECKING:
|
|
from pathlib import Path
|
|
|
|
|
|
class TestTryWirelessReconnect:
|
|
"""Tests for _try_wireless_reconnect method."""
|
|
|
|
def test_returns_false_when_no_prefix(
|
|
self,
|
|
mock_tk: MagicMock,
|
|
mock_sys_exit: MagicMock,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
"""Test returns False when subnet prefix can't be determined."""
|
|
locker = create_locker(mock_tk, tmp_path)
|
|
with patch.object(locker, "_get_local_subnet_prefix", return_value=None):
|
|
result = locker._try_wireless_reconnect()
|
|
assert result is False
|
|
|
|
def test_returns_true_when_probe_succeeds(
|
|
self,
|
|
mock_tk: MagicMock,
|
|
mock_sys_exit: MagicMock,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
"""Test returns True when a probe finds the phone."""
|
|
locker = create_locker(mock_tk, tmp_path)
|
|
with (
|
|
patch.object(locker, "_get_local_subnet_prefix", return_value="192.168.1"),
|
|
patch.object(locker, "_try_adb_connect", return_value=True),
|
|
patch.object(locker, "_has_adb_device", return_value=True),
|
|
patch(
|
|
"screen_locker._adb_transport.socket.create_connection",
|
|
) as mock_conn,
|
|
):
|
|
mock_sock = MagicMock()
|
|
mock_sock.__enter__ = MagicMock(return_value=mock_sock)
|
|
mock_sock.__exit__ = MagicMock(return_value=False)
|
|
mock_conn.return_value = mock_sock
|
|
result = locker._try_wireless_reconnect()
|
|
assert result is True
|
|
|
|
def test_returns_false_when_no_probe_succeeds(
|
|
self,
|
|
mock_tk: MagicMock,
|
|
mock_sys_exit: MagicMock,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
"""Test returns False when no probe finds the phone."""
|
|
locker = create_locker(mock_tk, tmp_path)
|
|
with (
|
|
patch.object(locker, "_get_local_subnet_prefix", return_value="192.168.1"),
|
|
patch(
|
|
"screen_locker._adb_transport.socket.create_connection",
|
|
side_effect=OSError("refused"),
|
|
),
|
|
):
|
|
result = locker._try_wireless_reconnect()
|
|
assert result is False
|
|
|
|
def test_probe_connect_succeeds_but_no_device(
|
|
self,
|
|
mock_tk: MagicMock,
|
|
mock_sys_exit: MagicMock,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
"""Test probe passes socket but adb_connect succeeds without device."""
|
|
locker = create_locker(mock_tk, tmp_path)
|
|
with (
|
|
patch.object(locker, "_get_local_subnet_prefix", return_value="192.168.1"),
|
|
patch.object(locker, "_try_adb_connect", return_value=True),
|
|
patch.object(locker, "_has_adb_device", return_value=False),
|
|
patch(
|
|
"screen_locker._adb_transport.socket.create_connection",
|
|
) as mock_conn,
|
|
):
|
|
mock_sock = MagicMock()
|
|
mock_sock.__enter__ = MagicMock(return_value=mock_sock)
|
|
mock_sock.__exit__ = MagicMock(return_value=False)
|
|
mock_conn.return_value = mock_sock
|
|
result = locker._try_wireless_reconnect()
|
|
assert result is False
|
|
|
|
def test_probe_adb_connect_fails(
|
|
self,
|
|
mock_tk: MagicMock,
|
|
mock_sys_exit: MagicMock,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
"""Test probe where socket connects but adb connect fails."""
|
|
locker = create_locker(mock_tk, tmp_path)
|
|
with (
|
|
patch.object(locker, "_get_local_subnet_prefix", return_value="192.168.1"),
|
|
patch.object(locker, "_try_adb_connect", return_value=False),
|
|
patch(
|
|
"screen_locker._adb_transport.socket.create_connection",
|
|
) as mock_conn,
|
|
):
|
|
mock_sock = MagicMock()
|
|
mock_sock.__enter__ = MagicMock(return_value=mock_sock)
|
|
mock_sock.__exit__ = MagicMock(return_value=False)
|
|
mock_conn.return_value = mock_sock
|
|
result = locker._try_wireless_reconnect()
|
|
assert result is False
|