from __future__ import annotations import pytest from pydantic import ValidationError from schemas.agent.ui_hints import UiHintsPayload def _base_payload() -> dict[str, object]: return { "intent": "status", "status": "success", "title": "Todo created", } def test_navigation_action_accepts_concrete_path_and_scalar_params() -> None: payload = { **_base_payload(), "actions": [ { "label": "View todo", "action": { "type": "navigation", "path": "/todo/123", "params": {"from": "assistant", "focus": True}, }, } ], } parsed = UiHintsPayload.model_validate(payload) assert parsed.actions[0].action.type == "navigation" def test_navigation_action_rejects_template_path_placeholder() -> None: payload = { **_base_payload(), "actions": [ { "label": "Open", "action": { "type": "navigation", "path": "/todo/:id", }, } ], } with pytest.raises(ValidationError): UiHintsPayload.model_validate(payload) def test_navigation_action_rejects_nested_params() -> None: payload = { **_base_payload(), "actions": [ { "label": "Open", "action": { "type": "navigation", "path": "/todo/123", "params": {"filters": {"status": "open"}}, }, } ], } with pytest.raises(ValidationError): UiHintsPayload.model_validate(payload)