diff --git a/tests/integration/README.md b/tests/integration/README.md index ac9b01786b9..1601123038b 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -28,6 +28,8 @@ Provider contracts exercise actual TCP requests with synthetic credentials and l Streaming checks send real HTTP transfer chunks, including one-byte partitions, fragmented tools, incomplete transfers and a cancellation barrier. They assert meaningful text, tool arguments, final usage and persisted cost. The Redis recovery case owns a separate database and Redis process, uses the supported one-second circuit-breaker recovery setting, waits for the real subscriber and verifies response data in Redis after restart. CircleCI reuses its existing Redis image for that extra process; it never pulls an image during tests +The `messages/` directory holds `/v1/messages` endpoint contracts grouped by backend subfolder (`anthropic`, `bedrock`, `gemini`, `responses_bridge`, `chat_bridge`) and runs in the providers shard; `run.py` selects test files recursively under each scheduled directory + The sdk shard exercises the SDK's own HTTP clients against local protocol peers with no gateway in the path, so a case here fails only when the client library or its wire behavior changes. The HTTP/2 case runs a hypercorn TLS peer offering h2 and http/1.1 over ALPN, drives the sync and async httpx handlers at it with `LITELLM_HTTP2` off and on, and asserts the version both the client and the peer observed on the wire. Put a test here only when it needs no proxy, database or Redis; a case that reaches the gateway belongs in one of the other shards The extensions shard uses the built-in generic callback and guardrail transports. It checks callback correlation and credential exclusion, guardrail rewriting and denial, retained OpenAI consumers and A2A wire versions diff --git a/tests/integration/_support/manifest.py b/tests/integration/_support/manifest.py index aa0b27eceda..0a0d1ca52fd 100644 --- a/tests/integration/_support/manifest.py +++ b/tests/integration/_support/manifest.py @@ -10,6 +10,7 @@ OWNED_DIRECTORIES: Final = frozenset( "routing", "providers", "streaming", + "messages", "configuration", "mcp", "observability", diff --git a/tests/integration/providers/test_anthropic_advisor_wire.py b/tests/integration/messages/anthropic/test_anthropic_advisor_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_advisor_wire.py rename to tests/integration/messages/anthropic/test_anthropic_advisor_wire.py diff --git a/tests/integration/providers/test_anthropic_legacy_thinking_budget_wire.py b/tests/integration/messages/anthropic/test_anthropic_legacy_thinking_budget_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_legacy_thinking_budget_wire.py rename to tests/integration/messages/anthropic/test_anthropic_legacy_thinking_budget_wire.py diff --git a/tests/integration/providers/test_anthropic_messages_timeout_wire.py b/tests/integration/messages/anthropic/test_anthropic_messages_timeout_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_messages_timeout_wire.py rename to tests/integration/messages/anthropic/test_anthropic_messages_timeout_wire.py diff --git a/tests/integration/providers/test_anthropic_thinking_signature_retry_wire.py b/tests/integration/messages/anthropic/test_anthropic_thinking_signature_retry_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_thinking_signature_retry_wire.py rename to tests/integration/messages/anthropic/test_anthropic_thinking_signature_retry_wire.py diff --git a/tests/integration/providers/test_anthropic_wire.py b/tests/integration/messages/anthropic/test_anthropic_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_wire.py rename to tests/integration/messages/anthropic/test_anthropic_wire.py diff --git a/tests/integration/providers/test_websearch_interception_wire.py b/tests/integration/messages/anthropic/test_websearch_interception_wire.py similarity index 100% rename from tests/integration/providers/test_websearch_interception_wire.py rename to tests/integration/messages/anthropic/test_websearch_interception_wire.py diff --git a/tests/integration/providers/test_bedrock_invoke_tool_search_wire.py b/tests/integration/messages/bedrock/test_bedrock_invoke_tool_search_wire.py similarity index 100% rename from tests/integration/providers/test_bedrock_invoke_tool_search_wire.py rename to tests/integration/messages/bedrock/test_bedrock_invoke_tool_search_wire.py diff --git a/tests/integration/providers/test_bedrock_messages_web_search_replay_wire.py b/tests/integration/messages/bedrock/test_bedrock_messages_web_search_replay_wire.py similarity index 100% rename from tests/integration/providers/test_bedrock_messages_web_search_replay_wire.py rename to tests/integration/messages/bedrock/test_bedrock_messages_web_search_replay_wire.py diff --git a/tests/integration/providers/test_anthropic_messages_fireworks_stop_wire.py b/tests/integration/messages/chat_bridge/test_anthropic_messages_fireworks_stop_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_messages_fireworks_stop_wire.py rename to tests/integration/messages/chat_bridge/test_anthropic_messages_fireworks_stop_wire.py diff --git a/tests/integration/providers/test_gemini_messages_cache_control_wire.py b/tests/integration/messages/gemini/test_gemini_messages_cache_control_wire.py similarity index 100% rename from tests/integration/providers/test_gemini_messages_cache_control_wire.py rename to tests/integration/messages/gemini/test_gemini_messages_cache_control_wire.py diff --git a/tests/integration/providers/test_anthropic_messages_claude_code_cache_key_wire.py b/tests/integration/messages/responses_bridge/test_anthropic_messages_claude_code_cache_key_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_messages_claude_code_cache_key_wire.py rename to tests/integration/messages/responses_bridge/test_anthropic_messages_claude_code_cache_key_wire.py diff --git a/tests/integration/providers/test_anthropic_messages_openai_bridge_wire.py b/tests/integration/messages/responses_bridge/test_anthropic_messages_openai_bridge_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_messages_openai_bridge_wire.py rename to tests/integration/messages/responses_bridge/test_anthropic_messages_openai_bridge_wire.py diff --git a/tests/integration/providers/test_anthropic_messages_openai_tools_wire.py b/tests/integration/messages/responses_bridge/test_anthropic_messages_openai_tools_wire.py similarity index 100% rename from tests/integration/providers/test_anthropic_messages_openai_tools_wire.py rename to tests/integration/messages/responses_bridge/test_anthropic_messages_openai_tools_wire.py diff --git a/tests/integration/providers/test_responses_bridge_stream_options.py b/tests/integration/messages/responses_bridge/test_responses_bridge_stream_options.py similarity index 100% rename from tests/integration/providers/test_responses_bridge_stream_options.py rename to tests/integration/messages/responses_bridge/test_responses_bridge_stream_options.py diff --git a/tests/integration/run.py b/tests/integration/run.py index 9ef585def3d..65b5524506f 100644 --- a/tests/integration/run.py +++ b/tests/integration/run.py @@ -14,7 +14,7 @@ GROUPS: Final = MappingProxyType( "management": ("management", "authorization", "configuration"), "accounting": ("pricing", "spend"), "database": ("database",), - "providers": ("providers", "routing", "streaming"), + "providers": ("providers", "routing", "streaming", "messages"), "extensions": ("observability", "compatibility"), "mcp": ("mcp",), "sdk": ("sdk",), @@ -35,7 +35,7 @@ def main() -> int: selected: Final = tuple( str(path.relative_to(root)) for folder in GROUPS[options.group] - for path in sorted((root / "tests/integration" / folder).glob("test_*.py")) + for path in sorted((root / "tests/integration" / folder).rglob("test_*.py")) ) if not selected: parser.error(f"No integration test files selected for {options.group}")