Files
composiohq__composio/python/tests/test_cross_sdk_compatibility.py
jkomyno 5e57815af1 fix(json-schema): accept and preserve dynamic object content across converters
Property-less objects (`{ type: "object" }`, `properties: {}`) were being
collapsed to a strict empty object by the Zod converter and given an implicit
`additionalProperties: false` by the Effect converter, so valid free-form
payloads such as METABASE_POST_API_CARD.dataset_query were rejected at the CLI
boundary. `ToolSchema.parse` separately dropped root `patternProperties` and
rejected a schema-valued root `additionalProperties`.

Dynamic keys are now routed to exactly the schemas that apply to them, and the
shared acceptance contract lives in one checked-in corpus with byte-identical
TypeScript and Python copies.
2026-08-06 20:33:53 +05:30

56 lines
1.8 KiB
Python

"""Cross-SDK compatibility tests.
These tests verify that the Python SDK uses identical fixtures
to the TypeScript SDK, ensuring webhook verification works consistently
across both SDKs.
"""
import json
import pytest
from tests.conftest import (
get_py_fixtures_dir,
get_py_json_schema_corpus_dir,
get_ts_fixtures_dir,
get_ts_json_schema_corpus_dir,
)
class TestCrossSDKFixtureCompatibility:
"""Tests verifying Python and TypeScript fixtures are synchronized."""
@pytest.mark.parametrize(
"fixture_name",
[
"golden-signatures.json",
"v1-github-push.json",
"v2-github-push.json",
"v3-github-push.json",
],
)
def test_fixtures_are_identical(self, fixture_name: str) -> None:
"""Verify TypeScript and Python fixtures are byte-identical."""
ts_path = get_ts_fixtures_dir() / fixture_name
py_path = get_py_fixtures_dir() / fixture_name
with open(ts_path) as f:
ts_content = json.load(f)
with open(py_path) as f:
py_content = json.load(f)
assert ts_content == py_content, (
f"Fixture {fixture_name} differs between TypeScript and Python SDKs. "
"Ensure fixtures are kept in sync."
)
def test_json_schema_conversion_corpus_is_identical(self) -> None:
"""The shared JSON Schema conversion corpus has one copy per language."""
ts_path = get_ts_json_schema_corpus_dir() / "object-cases.json"
py_path = get_py_json_schema_corpus_dir() / "object-cases.json"
assert ts_path.read_bytes() == py_path.read_bytes(), (
"object-cases.json differs between the TypeScript and Python SDKs. "
"Both copies must stay byte-identical."
)