Bound connector source previews
This commit is contained in:
@@ -81,6 +81,11 @@ class ConnectorDatasourceOriginTests(unittest.TestCase):
|
||||
self.assertEqual((self.source.ref,), tuple(item.ref for item in origins))
|
||||
self.assertEqual(("live", "cached"), origins[0].supported_modes)
|
||||
self.assertEqual(({"id": 1, "name": "Ada"},), result.rows)
|
||||
self.assertEqual("cached", origins[0].source_mode)
|
||||
self.assertTrue(origins[0].pushdown.projections)
|
||||
self.assertEqual("healthy", origins[0].health.status)
|
||||
self.assertGreater(result.returned_bytes, 2)
|
||||
self.assertEqual(1_000_000, result.effective_byte_limit)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -12,6 +12,7 @@ from govoplan_core.core.tabular_sources import (
|
||||
TabularReadRequest,
|
||||
TabularSnapshotInput,
|
||||
TabularSourceAccessError,
|
||||
TabularSourceUnavailableError,
|
||||
TabularSourceValidationError,
|
||||
)
|
||||
from govoplan_core.db.base import Base
|
||||
@@ -91,6 +92,94 @@ class ConnectorsTabularSourceTests(unittest.TestCase):
|
||||
self.assertEqual(1, len(preview.rows))
|
||||
self.assertTrue(preview.truncated)
|
||||
self.assertEqual(created.fingerprint, preview.source.fingerprint)
|
||||
self.assertEqual("cached", preview.source.source_mode)
|
||||
self.assertTrue(preview.source.pushdown.projections)
|
||||
self.assertTrue(preview.source.pushdown.pagination)
|
||||
self.assertEqual("healthy", preview.source.health.status)
|
||||
self.assertGreater(preview.returned_bytes, 2)
|
||||
self.assertEqual(1, preview.effective_row_limit)
|
||||
self.assertEqual("preview.row_limit_reached", preview.diagnostics[0].code)
|
||||
|
||||
def test_preview_enforces_byte_time_and_provider_ceiling_budgets(self) -> None:
|
||||
created = self.provider.create_snapshot(
|
||||
self.session,
|
||||
principal(),
|
||||
snapshot=TabularSnapshotInput(
|
||||
name="Bounded",
|
||||
source_name="bounded",
|
||||
rows=(
|
||||
{"id": 1, "value": "first"},
|
||||
{"id": 2, "value": "second"},
|
||||
),
|
||||
),
|
||||
)
|
||||
self.session.commit()
|
||||
|
||||
bounded = self.provider.read_source(
|
||||
self.session,
|
||||
principal(),
|
||||
request=TabularReadRequest(
|
||||
source_ref=created.ref,
|
||||
limit=500,
|
||||
max_bytes=35,
|
||||
timeout_ms=2_000,
|
||||
),
|
||||
)
|
||||
self.assertEqual(1, len(bounded.rows))
|
||||
self.assertTrue(bounded.truncated)
|
||||
self.assertEqual(
|
||||
"preview.byte_limit_reached",
|
||||
bounded.diagnostics[-1].code,
|
||||
)
|
||||
with self.assertRaisesRegex(
|
||||
TabularSourceValidationError,
|
||||
"single source row exceeds",
|
||||
):
|
||||
self.provider.read_source(
|
||||
self.session,
|
||||
principal(),
|
||||
request=TabularReadRequest(
|
||||
source_ref=created.ref,
|
||||
max_bytes=2,
|
||||
),
|
||||
)
|
||||
|
||||
tightened = self.provider.read_source(
|
||||
self.session,
|
||||
principal(),
|
||||
request=TabularReadRequest(
|
||||
source_ref=created.ref,
|
||||
limit=5_000,
|
||||
max_bytes=5_000_000,
|
||||
timeout_ms=10_000,
|
||||
),
|
||||
)
|
||||
self.assertEqual(500, tightened.effective_row_limit)
|
||||
self.assertEqual(1_000_000, tightened.effective_byte_limit)
|
||||
self.assertEqual(2_000, tightened.effective_timeout_ms)
|
||||
self.assertEqual(
|
||||
{
|
||||
"preview.row_limit_tightened",
|
||||
"preview.byte_limit_tightened",
|
||||
"preview.timeout_tightened",
|
||||
},
|
||||
{item.code for item in tightened.diagnostics},
|
||||
)
|
||||
|
||||
times = iter((0.0, 0.01))
|
||||
timeout_provider = SqlTabularSourceProvider(clock=lambda: next(times))
|
||||
with self.assertRaisesRegex(
|
||||
TabularSourceUnavailableError,
|
||||
"time budget",
|
||||
):
|
||||
timeout_provider.read_source(
|
||||
self.session,
|
||||
principal(),
|
||||
request=TabularReadRequest(
|
||||
source_ref=created.ref,
|
||||
timeout_ms=1,
|
||||
),
|
||||
)
|
||||
|
||||
def test_tenant_and_scope_isolation_are_enforced(self) -> None:
|
||||
created = self.provider.create_snapshot(
|
||||
|
||||
Reference in New Issue
Block a user