62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
# #region Test.AgentChat.Context [C:3] [TYPE Module] [SEMANTICS test,agent-chat,context,validation]
|
|
# @BRIEF Contract tests for UIContext validation at the backend trust boundary.
|
|
# @RELATION BINDS_TO -> [AgentChat.Context.Validate]
|
|
# @TEST_EDGE: valid -> returns unchanged payload.
|
|
# @TEST_EDGE: invalid_objectType -> raises validation error.
|
|
# @TEST_EDGE: oversized -> raises validation error.
|
|
# @TEST_EDGE: objectName_too_long -> raises validation error.
|
|
# ruff: noqa: I001
|
|
|
|
import pytest
|
|
|
|
from src.agent._context import UIContextValidationError, validate_uicontext
|
|
|
|
|
|
VALID_CONTEXT = {
|
|
"objectType": "dashboard",
|
|
"objectId": "42",
|
|
"objectName": "Energy",
|
|
"envId": "ss-dev",
|
|
"route": "/dashboards/42",
|
|
"contextVersion": 1,
|
|
}
|
|
|
|
|
|
# #region test_valid_uicontext_returns_payload [C:2] [TYPE Function]
|
|
# @BRIEF Valid UIContext payload returns unchanged.
|
|
def test_valid_uicontext_returns_payload():
|
|
assert validate_uicontext(dict(VALID_CONTEXT)) == VALID_CONTEXT
|
|
# #endregion test_valid_uicontext_returns_payload
|
|
|
|
|
|
# #region test_invalid_object_type_rejected [C:2] [TYPE Function]
|
|
# @BRIEF Unknown objectType is rejected by backend validation.
|
|
def test_invalid_object_type_rejected():
|
|
payload = dict(VALID_CONTEXT, objectType="chart")
|
|
|
|
with pytest.raises(UIContextValidationError, match="objectType"):
|
|
validate_uicontext(payload)
|
|
# #endregion test_invalid_object_type_rejected
|
|
|
|
|
|
# #region test_oversized_payload_rejected [C:2] [TYPE Function]
|
|
# @BRIEF Payloads over 4KB are rejected before prompt injection.
|
|
def test_oversized_payload_rejected():
|
|
payload = dict(VALID_CONTEXT, debug_padding="x" * 5000)
|
|
|
|
with pytest.raises(UIContextValidationError, match="4 KB"):
|
|
validate_uicontext(payload)
|
|
# #endregion test_oversized_payload_rejected
|
|
|
|
|
|
# #region test_object_name_too_long_rejected [C:2] [TYPE Function]
|
|
# @BRIEF objectName longer than 256 chars is rejected.
|
|
def test_object_name_too_long_rejected():
|
|
payload = dict(VALID_CONTEXT, objectName="x" * 257)
|
|
|
|
with pytest.raises(UIContextValidationError, match="objectName"):
|
|
validate_uicontext(payload)
|
|
# #endregion test_object_name_too_long_rejected
|
|
|
|
# #endregion Test.AgentChat.Context
|