fix(evidence): validate curated runtime corpus
This commit is contained in:
@@ -2,14 +2,18 @@ import json
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
|
||||
import pytest
|
||||
from typer.testing import CliRunner
|
||||
|
||||
from tht.cli import app
|
||||
|
||||
|
||||
def _runtime_config(tmp_path: Path, name: str = "workspace.yaml") -> Path:
|
||||
def _runtime_config(
|
||||
tmp_path: Path, name: str = "workspace.yaml", evidence_schema_version: int | None = None,
|
||||
) -> Path:
|
||||
path = tmp_path / name
|
||||
(tmp_path / "evidence").mkdir(exist_ok=True)
|
||||
evidence_version = "" if evidence_schema_version is None else f"\n schema_version: {evidence_schema_version}"
|
||||
path.write_text(
|
||||
f"""
|
||||
runtime_identity:
|
||||
@@ -28,6 +32,7 @@ embeddings:
|
||||
model: qwen3-embedding:0.6b
|
||||
dim: 1024
|
||||
evidence:
|
||||
{evidence_version}
|
||||
sources:
|
||||
- type: filesystem
|
||||
root: {tmp_path / 'evidence'}
|
||||
@@ -40,6 +45,54 @@ roots:
|
||||
return path
|
||||
|
||||
|
||||
def test_v2_invalid_materialized_corpus_stops_before_vector_store_construction(monkeypatch, tmp_path):
|
||||
import tht.cli.preprocess_cmd as command
|
||||
from tht.evidence import ValidationFinding, ValidationReport
|
||||
|
||||
config = _runtime_config(tmp_path, evidence_schema_version=2)
|
||||
vector_store_constructed = False
|
||||
monkeypatch.setattr(
|
||||
"tht.evidence.validate_workspace_evidence",
|
||||
lambda root: ValidationReport((ValidationFinding(
|
||||
"error", "manifest_missing", "manifest.yaml", "missing",
|
||||
),)),
|
||||
)
|
||||
|
||||
def forbidden_vector_store(*args, **kwargs):
|
||||
nonlocal vector_store_constructed
|
||||
vector_store_constructed = True
|
||||
raise AssertionError("invalid corpus must not reach vector upsert setup")
|
||||
|
||||
monkeypatch.setattr("tht.adapters.factory.build_vector_store", forbidden_vector_store)
|
||||
|
||||
with pytest.raises(RuntimeError, match="curated Evidence corpus is invalid"):
|
||||
command.run_from_config(config)
|
||||
|
||||
assert vector_store_constructed is False
|
||||
|
||||
|
||||
def test_v2_valid_materialized_corpus_is_validated_before_preprocessing(monkeypatch, tmp_path):
|
||||
import tht.cli.preprocess_cmd as command
|
||||
from tht.evidence import ValidationReport
|
||||
|
||||
config = _runtime_config(tmp_path, evidence_schema_version=2)
|
||||
calls = []
|
||||
|
||||
class FakePipeline:
|
||||
def run_as_job(self, **kwargs):
|
||||
calls.append(("run", kwargs))
|
||||
return "completed"
|
||||
|
||||
monkeypatch.setattr("tht.evidence.validate_workspace_evidence", lambda root: calls.append(("validate", root)) or ValidationReport(()))
|
||||
monkeypatch.setattr("tht.adapters.factory.build_vector_store", lambda cfg, require_write: calls.append(("vector", require_write)) or object())
|
||||
monkeypatch.setattr("tht.cli.vector_cmd.make_embedder", lambda cfg: object())
|
||||
monkeypatch.setattr("tht.evidence.build_sources", lambda evidence: [])
|
||||
monkeypatch.setattr("tht.evidence.build_preprocessing_pipeline", lambda **kwargs: FakePipeline())
|
||||
|
||||
assert command.run_from_config(config) == "completed"
|
||||
assert calls[:2] == [("validate", tmp_path), ("vector", True)]
|
||||
|
||||
|
||||
def test_preprocess_evidence_json_is_pristine(monkeypatch, tmp_path):
|
||||
import tht.cli.preprocess_cmd as command
|
||||
|
||||
|
||||
Reference in New Issue
Block a user