"""Payload rules: every field present, enums enforced, missing field fails the run.""" from __future__ import annotations import unittest from corpus import chunker, loader, payloads from corpus.config import Config from corpus.pipeline import chunk_id from corpus.tests import support def first_payload(): cfg = Config.from_env(root=support.REPO_ROOT, provider="local-hashing", dim=32) doc = loader.load_documents(cfg)[0] chunk = chunker.chunk_document(doc.body)[0] payload = payloads.build_payload(doc, chunk, cfg) payload["id"] = chunk_id(doc.path, chunk.index, doc.digest) return cfg, doc, payload class BuildTest(unittest.TestCase): def test_payload_has_every_required_field(self): cfg, doc, payload = first_payload() payloads.validate_payload(payload) for field in payloads.REQUIRED_FIELDS: self.assertIn(field, payload) self.assertEqual(payload["area"], doc.area) self.assertEqual(payload["confidence"], doc.confidence) self.assertEqual(payload["last_verified"], doc.last_verified) self.assertEqual(payload["embedding_model"], cfg.model) self.assertEqual(payload["embedding_dim"], cfg.dim) def test_every_real_document_produces_valid_payloads(self): cfg = Config.from_env(root=support.REPO_ROOT, provider="local-hashing", dim=32) for doc in loader.load_documents(cfg): for chunk in chunker.chunk_document(doc.body): payload = payloads.build_payload(doc, chunk, cfg) payload["id"] = chunk_id(doc.path, chunk.index, doc.digest) payloads.validate_payload(payload, where=doc.path) def test_source_type_is_doc_by_default(self): _cfg, doc, payload = first_payload() self.assertEqual(payload["source_type"], "doc") def test_source_type_from_tags(self): doc = loader.Document( path="content/ai/adr-x.md", source_id="adr-x", area="ai", level=3, title="ADR", claim="c", confidence="delivered", period="2024", tech=[], metrics=[], artefacts=[], public=True, last_verified="2026-01-01", tags=["adr"], body="", digest="0" * 64, url="/ai/a/adr-x/", ) self.assertEqual(payloads.source_type_for(doc), "adr") class ValidationTest(unittest.TestCase): def test_missing_field_raises(self): _cfg, _doc, payload = first_payload() for field in ("area", "level", "source_type", "confidence", "period", "artefacts", "last_verified", "text"): broken = dict(payload) del broken[field] with self.assertRaises(payloads.PayloadError, msg=f"missing {field} passed validation"): payloads.validate_payload(broken) def test_missing_provenance_field_raises(self): _cfg, _doc, payload = first_payload() for field in payloads.PROVENANCE_FIELDS: broken = dict(payload) del broken[field] with self.assertRaises(payloads.PayloadError, msg=f"missing {field} passed validation"): payloads.validate_payload(broken) def test_bad_enums_raise(self): _cfg, _doc, payload = first_payload() for field, value in ( ("area", "sales"), ("level", 4), ("source_type", "blog"), ("confidence", "vibes"), ): broken = dict(payload) broken[field] = value with self.assertRaises(payloads.PayloadError, msg=f"{field}={value!r} passed validation"): payloads.validate_payload(broken) def test_empty_text_raises(self): _cfg, _doc, payload = first_payload() payload["text"] = " " with self.assertRaises(payloads.PayloadError): payloads.validate_payload(payload) def test_bad_date_raises(self): _cfg, _doc, payload = first_payload() payload["last_verified"] = "last october" with self.assertRaises(payloads.PayloadError): payloads.validate_payload(payload) if __name__ == "__main__": unittest.main()