diff --git a/src/storage/src/storage3/_async/vectors.py b/src/storage/src/storage3/_async/vectors.py index 8da9b83f..9d647ddf 100644 --- a/src/storage/src/storage3/_async/vectors.py +++ b/src/storage/src/storage3/_async/vectors.py @@ -74,7 +74,7 @@ async def list_indexes( prefix: Optional[str] = None, ) -> ListVectorIndexesResponse: body = self.with_metadata( - next_token=next_token, max_results=max_results, prefix=prefix + nextToken=next_token, maxResults=max_results, prefix=prefix ) data = await self._request.send( http_method="POST", path=["ListIndexes"], body=body diff --git a/src/storage/src/storage3/_sync/vectors.py b/src/storage/src/storage3/_sync/vectors.py index 0673bd23..cb41947f 100644 --- a/src/storage/src/storage3/_sync/vectors.py +++ b/src/storage/src/storage3/_sync/vectors.py @@ -72,7 +72,7 @@ def list_indexes( prefix: Optional[str] = None, ) -> ListVectorIndexesResponse: body = self.with_metadata( - next_token=next_token, max_results=max_results, prefix=prefix + nextToken=next_token, maxResults=max_results, prefix=prefix ) data = self._request.send(http_method="POST", path=["ListIndexes"], body=body) return ListVectorIndexesResponse.model_validate_json(data.content) diff --git a/src/storage/tests/test_client.py b/src/storage/tests/test_client.py index 92f0ea01..da06bbcc 100644 --- a/src/storage/tests/test_client.py +++ b/src/storage/tests/test_client.py @@ -409,3 +409,70 @@ async def test_async_bucket_proxy_exists_false_on_headless_error() -> None: proxy._client, "request", new_callable=AsyncMock, return_value=mock_response ): assert await proxy.exists("missing.txt") is False + + +def _list_indexes_transport(captured: Dict[str, Any]) -> Any: + """A transport that records the ListIndexes request body and replies with one page.""" + import json as _json + + def handler(request: Request) -> Response: + captured["url"] = str(request.url) + captured["body"] = _json.loads(request.content) + return Response(200, json={"indexes": [], "nextToken": None}) + + return handler + + +@pytest.mark.asyncio +async def test_async_list_indexes_sends_camel_case_pagination( + valid_url, valid_headers +) -> None: + from httpx import MockTransport + + captured: Dict[str, Any] = {} + client = AsyncStorageClient( + url=valid_url + "/", + headers=valid_headers, + http_client=AsyncClient( + transport=MockTransport(_list_indexes_transport(captured)) + ), + ) + + await ( + client.vectors() + .from_("my-bucket") + .list_indexes(next_token="cursor-1", max_results=10, prefix="idx-") + ) + + assert captured["url"].endswith("/vector/ListIndexes") + assert captured["body"] == { + "vectorBucketName": "my-bucket", + "nextToken": "cursor-1", + "maxResults": 10, + "prefix": "idx-", + } + + +def test_sync_list_indexes_sends_camel_case_pagination( + valid_url, valid_headers +) -> None: + from httpx import MockTransport + + captured: Dict[str, Any] = {} + client = SyncStorageClient( + url=valid_url + "/", + headers=valid_headers, + http_client=Client(transport=MockTransport(_list_indexes_transport(captured))), + ) + + client.vectors().from_("my-bucket").list_indexes( + next_token="cursor-1", max_results=10, prefix="idx-" + ) + + assert captured["url"].endswith("/vector/ListIndexes") + assert captured["body"] == { + "vectorBucketName": "my-bucket", + "nextToken": "cursor-1", + "maxResults": 10, + "prefix": "idx-", + }