testsAndMisc/linux_configuration/tests/conftest.py
Krzysztof kuhy Rudnicki a5209b6878 Extract phone_focus_mode together with focus_policy
github.com/kuhyx/phone-focus-mode

The two halves go as one repo: focus_policy parses phone_focus_mode's
config.sh into the typed policy that focus-owner consumes, and nothing
else references it. 77 commits of history, plus the two Python suites
from linux_configuration/tests/ and the six mutation fixtures from
meta/scripts/fixtures/, all of which named phone_focus_mode paths.

Running the suites -- not reading them -- turned up a real defect the
extraction would otherwise have inherited. config.sh sources the
untracked config_secrets.sh, and ctl_libs_harness.sh never pinned
HOME_LAT/HOME_LON, so the distance assertions were checking against
whatever real coordinates that file happened to hold. The suite passed on
this machine and could not run anywhere else, and a real home location
was load-bearing in a pass/fail condition. The harness now pins a pair
4300 m south of the coordinate its own case seeds, and config.sh sources
the secrets file only when it exists. 136/136 pass with no secrets file
present.

Before making the repo public I scanned the whole history for the known
home coordinates and for any committed config_secrets.sh: zero hits, and
the file was never tracked. The new repo also gained a .gitignore, since
none came across in the filter-repo pass.

test_magisk_service.sh hangs. It hangs identically in the pre-extraction
baseline worktree and appears in no CI list here, so the new repo's CI
skips it with that reason rather than pretending it passes.

check_python_location.sh loses its phone_focus_mode exception now that
the directory is gone; every tracked .py still passes it. The .gitignore
rules for config_secrets.sh and the keystore STAY -- the working copy is
still on this machine and still holds a real location.

Depth 262 -> 248.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJrqKERAo5QUeEHWS5Asgp
2026-08-23 18:32:58 +02:00

88 lines
2.6 KiB
Python

"""Pytest bootstrap: make non-package script dirs importable for these tests.
Several helper modules live in standalone script directories (outside
``python_pkg/``) and are invoked as ``python <file>.py`` rather than imported as
packages. To unit-test them they must be importable by bare module name, so each
directory is placed on ``sys.path`` before the tests import them.
"""
from __future__ import annotations
from pathlib import Path
import sys
from typing import TYPE_CHECKING
import pytest
if TYPE_CHECKING:
from collections.abc import Callable
# Repo root is two levels up from this file (linux_configuration/tests/conftest.py).
_REPO_ROOT = Path(__file__).resolve().parents[2]
# Each standalone script directory whose Python modules these tests import.
_SCRIPT_DIRS = (
_REPO_ROOT / "meta" / "scripts", # validate_evidence, validate_contract
_REPO_ROOT
/ "linux_configuration"
/ "scripts"
/ "single_use"
/ "utils", # fast_count
_REPO_ROOT
/ "linux_configuration"
/ "scripts"
/ "single_use"
/ "misc"
/ "testsAndMisc-bash"
/ "tools", # transcribe_fw and its helpers
)
for _script_dir in _SCRIPT_DIRS:
if str(_script_dir) not in sys.path:
sys.path.insert(0, str(_script_dir))
@pytest.fixture
def fake_whisper() -> type[FakeWhisper]:
"""The faster_whisper double, as a fixture (conftest is not importable)."""
return FakeWhisper
@pytest.fixture
def importer() -> Callable[[dict[str, object]], object]:
"""The ``_try_import`` double factory, as a fixture."""
return fake_importer
class FakeWhisper:
"""Stand-in for faster_whisper, recording how a model was constructed.
``WhisperModel`` is upstream's CamelCase name, so it is exposed through
``__getattr__`` rather than defined as a method: defining it would mean
naming a non-PEP8 identifier here just to satisfy a third-party API.
"""
def __init__(self, error: Exception | None = None) -> None:
self.calls: list[dict[str, object]] = []
self._error = error
def _construct(self, name: str, **kwargs: object) -> object:
if self._error is not None:
raise self._error
self.calls.append({"name": name, **kwargs})
return object()
def __getattr__(self, attr: str) -> object:
if attr == "WhisperModel":
return self._construct
raise AttributeError(attr)
def fake_importer(available: dict[str, object]) -> object:
"""Return a ``_try_import`` double resolving only the named modules."""
def _try(name: str) -> object | None:
return available.get(name)
return _try