feat: version search source contracts

This commit is contained in:
2026-07-29 18:08:52 +02:00
parent 13893c80cd
commit 920e3c9834
4 changed files with 456 additions and 2 deletions

View File

@@ -5,11 +5,18 @@ import unittest
from govoplan_core.core.modules import ModuleContext, ModuleManifest
from govoplan_core.core.registry import PlatformRegistry
from govoplan_core.core.search import (
SearchAuthorizationRequest,
SearchBackfillPage,
SearchBackfillRequest,
SearchDocument,
SearchProvider,
SearchProviderRegistration,
SearchQuery,
SearchResourceReference,
SearchResourceType,
SearchResult,
SearchSourceProvider,
SearchSourceProviderRegistration,
)
@@ -28,6 +35,34 @@ class _Provider:
)
class _Source:
def resource_types(self):
return (
SearchResourceType(
provider_id="test.records",
module_id="test",
resource_type="record",
label="Records",
),
)
def backfill(self, session, *, request):
del session
return SearchBackfillPage(
documents=(),
next_cursor=None,
complete=True,
high_watermark=request.cursor,
)
def authorize(self, session, principal, *, requests):
del session, principal
return {
request.reference.key: True
for request in requests
}
class SearchContractTests(unittest.TestCase):
def test_query_and_restricted_document_are_bounded(self) -> None:
query = SearchQuery(text=" permit ", tenant_id="tenant-1", limit=20)
@@ -52,6 +87,17 @@ class SearchContractTests(unittest.TestCase):
title="Permit",
url="/cases/case-1",
)
with self.assertRaisesRegex(ValueError, "body"):
SearchDocument(
tenant_id="tenant-1",
module_id="cases",
resource_type="case",
resource_id="case-1",
title="Permit",
url="/cases/case-1",
body="x" * 200_001,
acl_tokens=("account:account-1",),
)
def test_manifest_provider_registration_resolves_lazily(self) -> None:
registry = PlatformRegistry()
@@ -67,6 +113,12 @@ class SearchContractTests(unittest.TestCase):
resource_types=("record",),
),
),
search_sources=(
SearchSourceProviderRegistration(
id="test.records",
factory=lambda context: _Source(),
),
),
)
)
registry.configure_capability_context(
@@ -76,6 +128,35 @@ class SearchContractTests(unittest.TestCase):
providers = registry.search_providers()
self.assertEqual(1, len(providers))
self.assertIsInstance(providers[0][1], SearchProvider)
sources = registry.search_sources()
self.assertEqual(1, len(sources))
self.assertIsInstance(sources[0][1], SearchSourceProvider)
request = SearchAuthorizationRequest(
reference=SearchResourceReference(
tenant_id="tenant-1",
module_id="test",
resource_type="record",
resource_id="1",
),
source_revision="1",
)
self.assertTrue(
sources[0][1].authorize(
object(),
object(),
requests=(request,),
)[request.reference.key]
)
page = sources[0][1].backfill(
object(),
request=SearchBackfillRequest(
tenant_id="tenant-1",
provider_id="test.records",
resource_type="record",
rebuild_id="rebuild-1",
),
)
self.assertTrue(page.complete)
if __name__ == "__main__":