feat(core): add provider-neutral records filing contract
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import UTC, datetime
|
||||
import unittest
|
||||
|
||||
from govoplan_core.core.records import (
|
||||
RecordContractError,
|
||||
RecordFilingRequest,
|
||||
RecordSourceLocator,
|
||||
RecordSourceReference,
|
||||
record_source_capabilities,
|
||||
record_source_capability,
|
||||
)
|
||||
|
||||
|
||||
class _Registry:
|
||||
def capability_names(self) -> tuple[str, ...]:
|
||||
return ("mail.delivery", "records.source.cases", "records.source.files")
|
||||
|
||||
|
||||
class RecordsContractTests(unittest.TestCase):
|
||||
def test_exact_source_and_filing_request_are_tenant_bound(self) -> None:
|
||||
locator = RecordSourceLocator(
|
||||
tenant_id="tenant-1",
|
||||
source_module="files",
|
||||
resource_type="file_version",
|
||||
resource_id="asset-1",
|
||||
source_revision="version-7",
|
||||
)
|
||||
reference = RecordSourceReference(
|
||||
locator=locator,
|
||||
label="Evidence.pdf",
|
||||
content_sha256="a" * 64,
|
||||
size_bytes=12,
|
||||
recorded_at=datetime(2026, 8, 6, tzinfo=UTC),
|
||||
)
|
||||
request = RecordFilingRequest(
|
||||
tenant_id="tenant-1",
|
||||
record_id="record-1",
|
||||
source=locator,
|
||||
purpose="process application",
|
||||
filing_reason="Evidence received with the application.",
|
||||
idempotency_key="filing-1",
|
||||
)
|
||||
|
||||
self.assertEqual("version-7", reference.locator.source_revision)
|
||||
self.assertEqual("record-1", request.record_id)
|
||||
|
||||
def test_cross_tenant_filing_and_inexact_sources_are_rejected(self) -> None:
|
||||
with self.assertRaisesRegex(RecordContractError, "source_revision"):
|
||||
RecordSourceLocator(
|
||||
tenant_id="tenant-1",
|
||||
source_module="files",
|
||||
resource_type="file_version",
|
||||
resource_id="asset-1",
|
||||
source_revision="",
|
||||
)
|
||||
|
||||
locator = RecordSourceLocator(
|
||||
tenant_id="tenant-1",
|
||||
source_module="cases",
|
||||
resource_type="case_revision",
|
||||
resource_id="case-1",
|
||||
source_revision="4",
|
||||
)
|
||||
with self.assertRaisesRegex(RecordContractError, "cross tenants"):
|
||||
RecordFilingRequest(
|
||||
tenant_id="tenant-2",
|
||||
record_id="record-1",
|
||||
source=locator,
|
||||
purpose="audit",
|
||||
filing_reason="Preserve the decision basis.",
|
||||
idempotency_key="filing-2",
|
||||
)
|
||||
|
||||
def test_source_capabilities_are_discoverable_without_module_imports(self) -> None:
|
||||
self.assertEqual("records.source.files", record_source_capability("files"))
|
||||
self.assertEqual(
|
||||
"records.source.forms_runtime",
|
||||
record_source_capability("forms_runtime"),
|
||||
)
|
||||
self.assertEqual(
|
||||
("records.source.cases", "records.source.files"),
|
||||
record_source_capabilities(_Registry()),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user