|
|
@@ -362,6 +362,73 @@ async def test_plain_dict_resolution_remains_complete_for_optional_schema():
|
|
|
assert fallback_calls == 0
|
|
|
|
|
|
|
|
|
+def test_sync_kernel_rejects_structured_incomplete_optional_arguments():
|
|
|
+ handler_calls = 0
|
|
|
+
|
|
|
+ def handler(request: EventRequest) -> dict[str, Any]:
|
|
|
+ nonlocal handler_calls
|
|
|
+ handler_calls += 1
|
|
|
+ return {"ok": True}
|
|
|
+
|
|
|
+ definition = _definition(
|
|
|
+ parameters={
|
|
|
+ "type": "object",
|
|
|
+ "properties": {"query": {"type": "string"}},
|
|
|
+ },
|
|
|
+ resolver=lambda request, context: EventArgumentResolution(
|
|
|
+ arguments={},
|
|
|
+ complete=False,
|
|
|
+ ),
|
|
|
+ handler=handler,
|
|
|
+ )
|
|
|
+
|
|
|
+ result = EventKernel(EventRegistry([definition])).execute_sync(
|
|
|
+ EventRequest(id="event-1", name="example.lookup"),
|
|
|
+ enabled_names=["example.lookup"],
|
|
|
+ )
|
|
|
+
|
|
|
+ assert result.status is EventStatus.INVALID_ARGUMENTS
|
|
|
+ assert result.error == "event arguments incomplete"
|
|
|
+ assert handler_calls == 0
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize(
|
|
|
+ "resolver",
|
|
|
+ [
|
|
|
+ lambda request, context: EventArgumentResolution(
|
|
|
+ arguments={},
|
|
|
+ complete=True,
|
|
|
+ ),
|
|
|
+ lambda request, context: {},
|
|
|
+ ],
|
|
|
+)
|
|
|
+def test_sync_kernel_preserves_complete_compatible_resolvers(resolver: Any):
|
|
|
+ handler_calls = 0
|
|
|
+
|
|
|
+ def handler(request: EventRequest) -> dict[str, Any]:
|
|
|
+ nonlocal handler_calls
|
|
|
+ handler_calls += 1
|
|
|
+ return {"ok": True}
|
|
|
+
|
|
|
+ definition = _definition(
|
|
|
+ parameters={
|
|
|
+ "type": "object",
|
|
|
+ "properties": {"query": {"type": "string"}},
|
|
|
+ },
|
|
|
+ resolver=resolver,
|
|
|
+ handler=handler,
|
|
|
+ )
|
|
|
+
|
|
|
+ result = EventKernel(EventRegistry([definition])).execute_sync(
|
|
|
+ EventRequest(id="event-1", name="example.lookup"),
|
|
|
+ enabled_names=["example.lookup"],
|
|
|
+ )
|
|
|
+
|
|
|
+ assert result.status is EventStatus.SUCCESS
|
|
|
+ assert result.payload == {"ok": True}
|
|
|
+ assert handler_calls == 1
|
|
|
+
|
|
|
+
|
|
|
@pytest.mark.asyncio
|
|
|
async def test_provider_resolved_arguments_are_not_rewritten_or_fallen_back():
|
|
|
resolver_calls = 0
|