Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions libs/core/tests/unit_tests/utils/test_json_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,84 @@ def test_dereference_refs_list_index() -> None:
assert actual_dict_key == expected_dict_key


def test_dereference_refs_list_index_items_ref_mcp_like() -> None:
"""Regression test: MCP-style list index ref into array items."""
schema = {
"type": "object",
"properties": {
"body": {
"anyOf": [
{"type": "string"},
{
"type": "object",
"properties": {
"Message": {
"type": "object",
"properties": {
"bccRecipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emailAddress": {
"type": "object",
"properties": {
"address": {"type": "string"},
"name": {"type": "string"},
},
"required": ["address"],
}
},
},
"description": (
"The Bcc: recipients for the message."
),
},
"ccRecipients": {
"type": "array",
"items": {
"$ref": (
"#/properties/body/anyOf/1/"
"properties/Message/properties/"
"bccRecipients/items"
)
},
"description": (
"The Cc: recipients for the message."
),
},
},
"additionalProperties": False,
},
"SaveToSentItems": {
"type": ["boolean", "null"],
"default": False,
},
},
"additionalProperties": False,
},
]
}
},
"required": ["body"],
"additionalProperties": False,
}

resolved = dereference_refs(schema)

message_props = resolved["properties"]["body"]["anyOf"][1]["properties"]["Message"][
"properties"
]

bcc_items = message_props["bccRecipients"]["items"]
cc_items = message_props["ccRecipients"]["items"]

# $ref should be fully resolved in ccRecipients.items
assert "$ref" not in cc_items
# And ccRecipients.items should match bccRecipients.items
assert cc_items == bcc_items


def test_dereference_refs_mixed_ref_with_properties() -> None:
"""Test dereferencing refs that have $ref plus other properties."""
# This pattern can cause infinite recursion if not handled correctly
Expand Down
Loading