testsAndMisc/linux_configuration/tests/conftest.py
Krzysztof kuhy Rudnicki a1f8044a4a Extract system-maintenance, the isolated subsystem
github.com/kuhyx/system-maintenance, cloned to ~/system-maintenance

First of the four live subsystems, and the one with no cross-unit source
edges, so it establishes the pattern for the harder three. Passed in
vmbox first -- the installer ran from an extracted-layout copy in the
guest and detected its distro without any monorepo path -- then on the
host.

Its 21 Python and shell test files lived in linux_configuration/tests/,
reaching bin/ through a shared conftest. Twenty moved with the code and
got their own conftest; the shared one stays, since it serves several
script directories that are not going anywhere.

test_shutdown_timer_monitor.sh stays here. It is a pair test: it checks
that digital_wellbeing's installer template and the monitor it installs
still agree, so it belongs to whichever half owns the installer. It now
reads the monitor from ~/system-maintenance and SKIPs when that checkout
is absent.

An intermediate version of that test fell back to /usr/local/bin, which
HUNG -- the installed copy is stale and differs from source, so the test
was comparing an installer template against a binary it never generated.
Falling back to it would have been worse than skipping, so the fallback
is gone and the comment says why.

Also removed test_hosts_file_monitor.sh from shell-tests.yml's explicit
list: it left with the subsystem, and CI would have failed on the missing
file rather than quietly skipping it.

Verified: 136 tests pass in the new repo, 202 still pass here, the pair
test passes against the checkout and skips without it, and both the shell
coverage gate and shellcheck are clean. Depth 294 -> 267.

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

90 lines
2.7 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 / "phone_focus_mode" / "lib", # monitor_report
_REPO_ROOT / "phone_focus_mode", # strip_workout_hosts
_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