llm-ingestion-okf/tests/test_import_consumable.py
Kjell Tore Guttormsen 9d1f4b14ed test(fixtures): replace sector-specific example material with generic, fictitious examples — green
Every fixture, test document, tool example and document now uses an invented
kitchen-and-baking handbook series, written in this repository. The package's
behaviour is unchanged; src/ changes are comments and help text only.

- Generated fixtures are regenerated from their generators. Their structural
  counts are identical before and after: elements, images, rows, cells,
  headings, bookmarks and the witness inventory's per-document totals. The
  image-inbox and accounting documents are renamed kapittel-84-*.
- tools/okf_accounting_gate.py: the two options that named one real corpus
  each are replaced by a generic, repeatable --corpus PATH with no default.
  Row 5 compares the PDF pair alone. Gate verdict unchanged: RED rows 2, 3, 6.
- tools/okf_witness.py: the STS JSON reader for one publisher's delivery is
  removed, along with its three twins and five tests. The mutation harness
  loses W09.
- docs/: 13 dated reports that documented runs on a retired reference corpus
  are removed, and 40 are neutralized. Dead links are removed, and no new
  dangling path is introduced.
- The synthetic MCP-gate corpus and the residual probe words are neutral.

Valgt: keep the `okf quality --fasit` bar value (the measured fraction, one corpus) and
rewrite only its provenance, because the verdict stays unchanged and the
number names nothing.

Term check with the local list: 0 of 411 tracked files, 0 file names, 0 of
27 binary fixtures. Suite after git add: 2457 passed, 1 skipped. The base
tree had 2460 passed and 2 skipped; five tests went with the JSON reader and
four were added by the term check. ruff, ruff format and mypy --strict src/
are clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 14:52:02 +02:00

127 lines
4.8 KiB
Python

"""Door C's own outcome is a bundle the reading direction can open.
A downstream consumer repository, 2026-09-08 (its finding 1): `import_bundle` wrote the root index with
no frontmatter and took no `root_frontmatter_values`, so it could not declare
`bundle_id`. `okf consume` then refused the result with exit 1,
`bundle_id_missing` -- section 3.1's identity tuple is `(bundle_id,
concept_id)` and half of it was absent. The consumer's workaround was to use
Door C as a GATE and write the consumable tree themselves.
The fix is the mechanism Door B already has and Door C did not: a profile
names a key, the CALLER owns its value (decision E1). It is keyword-only with
a default of `None`, so every existing call site emits the bytes it always did
-- a consumer with branch bases built through this door is not asked to
rebuild them, which is the boundary this repository states for its own
consumers.
"""
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
from test_import_flow import CONCEPT, StubImportGate, place
from llm_ingestion_okf.importer import import_bundle
from llm_ingestion_okf.materialize import parse_frontmatter
from llm_ingestion_okf.profiles import DEFAULT, SEGMENTED_V1
PROJECT_ROOT = Path(__file__).resolve().parents[1]
TOOL = PROJECT_ROOT / "tools" / "okf_consume.py"
KNOWN_POSITIVE = PROJECT_ROOT / "examples" / "ingest-golden-segmented-okf-v0-2" / "expected-bundle"
def _consume(bundle: Path) -> subprocess.CompletedProcess[str]:
return subprocess.run(
[sys.executable, str(TOOL), str(bundle), "--question", "users"],
capture_output=True,
text=True,
check=False,
)
def test_the_known_positive_is_readable_first() -> None:
"""Before an exit 1 counts as a finding, the chain must be shown able to pass."""
assert _consume(KNOWN_POSITIVE).returncode == 0
def test_door_c_without_a_bundle_id_is_still_refused(tmp_path: Path) -> None:
"""The defect, kept as a test: silence is not the fix, a named value is."""
place(tmp_path / "source", "tables/users.md", CONCEPT)
bundle = tmp_path / "bundle"
import_bundle(
tmp_path / "source",
bundle,
"1970-01-01T00:00:00Z",
origin="external",
channel="manual",
gate=StubImportGate(),
)
assert (bundle / "index.md").is_file()
assert "bundle_id" not in parse_frontmatter(bundle / "index.md")
assert _consume(bundle).returncode == 1
def test_door_c_with_a_bundle_id_produces_a_consumable_bundle(tmp_path: Path) -> None:
place(tmp_path / "source", "tables/users.md", CONCEPT)
bundle = tmp_path / "bundle"
import_bundle(
tmp_path / "source",
bundle,
"1970-01-01T00:00:00Z",
origin="external",
channel="manual",
gate=StubImportGate(),
profile=SEGMENTED_V1,
root_frontmatter_values={"bundle_id": "imported-2026-09-09"},
)
declared = parse_frontmatter(bundle / "index.md")
assert declared["bundle_id"] == "imported-2026-09-09"
done = _consume(bundle)
assert done.returncode == 0, done.stderr
payload = json.loads(done.stdout)
assert payload["bundle"]["bundle_id"] == "imported-2026-09-09"
def test_a_second_run_does_not_duplicate_the_declaration(tmp_path: Path) -> None:
"""The index is APPENDED to across runs; the frontmatter must not be."""
place(tmp_path / "source", "tables/users.md", CONCEPT)
bundle = tmp_path / "bundle"
for _ in range(2):
import_bundle(
tmp_path / "source",
bundle,
"1970-01-01T00:00:00Z",
origin="external",
channel="manual",
gate=StubImportGate(),
profile=SEGMENTED_V1,
root_frontmatter_values={"bundle_id": "imported-2026-09-09"},
)
text = (bundle / "index.md").read_text(encoding="utf-8")
assert text.count("bundle_id:") == 1
assert parse_frontmatter(bundle / "index.md")["bundle_id"] == "imported-2026-09-09"
def test_the_default_profile_names_no_root_key_and_says_so(tmp_path: Path) -> None:
"""Naming a key the profile does not carry is refused BEFORE any write."""
place(tmp_path / "source", "tables/users.md", CONCEPT)
bundle = tmp_path / "bundle"
assert DEFAULT.index.root_frontmatter == ()
try:
import_bundle(
tmp_path / "source",
bundle,
"1970-01-01T00:00:00Z",
origin="external",
channel="manual",
gate=StubImportGate(),
root_frontmatter_values={"bundle_id": "x"},
)
except Exception as exc:
assert getattr(exc, "code", "") == "index_root_frontmatter_unexpected"
else: # pragma: no cover - a pass here is the defect
raise AssertionError("an unnamed root key was written")
assert not bundle.exists(), "a refused call left a partially written bundle"