Plan Step 2. Verify green: `bash scripts/bootstrap.sh && .venv/bin/python -m
pytest tests/test_toolchain.py` -> 3 passed, exit 0.
Test first, and the RED was demonstrated rather than assumed: run against a
venv carrying pytest and the guard but not pytest-socket, the third test fails
with ModuleNotFoundError while the other two pass. The test discriminates.
pyproject.toml declares the dependencies as a PEP 735 group rather than an
installable distribution -- nothing here needs a build backend, since the tests
import from scripts/ via pytest's pythonpath. Measured before choosing it: pip
26.2.1 on this machine supports `install --group`, and bootstrap upgrades pip
first, so a pip too old fails loudly instead of silently skipping the guard.
The guard is pinned to the exact tag v1.3.0 and is not vendored. Verified the
tag resolves and the package exposes __version__ == "1.3.0"; that equality is
what the test asserts, not the pip metadata.
addopts carries --disable-socket and --strict-markers, which is why the
`network` marker is declared: with strict markers an undeclared marker would
make `-m 'not network'` an error rather than a filter, and the offline
guarantee would quietly stop being tested.
bootstrap.sh builds under ${CLAUDE_PLUGIN_DATA} when set (survives a plugin
update) and falls back to the repo-root .venv for development -- risk H2. It
refuses an interpreter below 3.10 instead of building on it, because python3
here can resolve to 3.9.6 under a GUI-spawned process.
Exercised, not just written: re-running is idempotent (exit 0); --med-xlsx
installs the extra (openpyxl 3.1.5 importable); an unknown argument exits 2
with usage; a missing JOBBSOK_PYTHON interpreter refuses loudly. bash 3.2-clean
(system /bin/bash 3.2.57 -n passes) and ASCII-only.
.gitignore needed no change: `.venv/` was already on line 12 from the initial
commit, and `git check-ignore -v .venv` confirms it matches.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
"""The toolchain contract for every later test in this repo (plan Step 2).
|
|
|
|
Three things have to hold before anything else is worth running, and each has
|
|
already bitten this project once:
|
|
|
|
1. The interpreter is 3.10 or newer. A GUI-spawned process on this Mac can
|
|
resolve `python3` to 3.9.6, which parses the code and then fails at runtime.
|
|
2. The ingestion guard is present and pinned to exactly v1.3.0. It is the trust
|
|
boundary for M3; a floating version is not a boundary.
|
|
3. pytest-socket is installed and the `network` marker is registered. The suite
|
|
runs with `--disable-socket --strict-markers`, so an unregistered marker
|
|
would make `-m 'not network'` an error rather than a filter -- and the
|
|
offline guarantee would quietly stop being tested.
|
|
|
|
This is the first test file in the repo and sets the style for the rest.
|
|
"""
|
|
|
|
import sys
|
|
|
|
|
|
def test_interpreter_is_3_10_or_newer():
|
|
assert sys.version_info >= (3, 10), (
|
|
"the toolchain requires Python 3.10+, got %s from %s"
|
|
% (sys.version.split()[0], sys.executable)
|
|
)
|
|
|
|
|
|
def test_guard_is_pinned_to_1_3_0():
|
|
import llm_ingestion_guard
|
|
|
|
assert llm_ingestion_guard.__version__ == "1.3.0", (
|
|
"guard must be pinned to v1.3.0, got %r -- a different tag is not a "
|
|
"substitute and the source is never vendored"
|
|
% (llm_ingestion_guard.__version__,)
|
|
)
|
|
|
|
|
|
def test_pytest_socket_installed_and_network_marker_registered(pytestconfig):
|
|
import pytest_socket # noqa: F401 -- import IS the assertion
|
|
|
|
markers = pytestconfig.getini("markers")
|
|
names = [m.split(":", 1)[0].split("(", 1)[0].strip() for m in markers]
|
|
assert "network" in names, (
|
|
"the 'network' marker must be declared in pyproject.toml; with "
|
|
"--strict-markers an undeclared marker makes -m 'not network' an "
|
|
"error, not a filter. Declared markers: %r" % (names,)
|
|
)
|