mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-12 19:50:55 +01:00
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
90 lines
2.7 KiB
Python
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
|