diff --git a/test/collection/test_queries.py b/test/collection/test_queries.py index 513764a17..a2145b0a8 100644 --- a/test/collection/test_queries.py +++ b/test/collection/test_queries.py @@ -3,8 +3,10 @@ import pytest from weaviate.collections.query import _QueryCollectionAsync +from weaviate.collections.grpc.query import _QueryGRPC from weaviate.connect import ConnectionV4 from weaviate.exceptions import WeaviateInvalidInputError +from weaviate.util import _ServerVersion # TODO: re-enable tests once string syntax is re-enabled in the API @@ -88,6 +90,35 @@ async def _test_query(query: Awaitable) -> None: await query() +def _grpc_query(validate_arguments: bool = True) -> _QueryGRPC: + return _QueryGRPC( + weaviate_version=_ServerVersion.from_string("1.38.13"), + name="Dummy", + tenant=None, + consistency_level=None, + validate_arguments=validate_arguments, + uses_125_api=True, + uses_127_api=True, + ) + + +def test_query_limit_zero_is_rejected() -> None: + with pytest.raises(WeaviateInvalidInputError, match="limit must be greater than zero"): + _grpc_query().get(limit=0) + + +@pytest.mark.parametrize("limit", [None, 1]) +def test_query_limit_boundary_is_accepted(limit: int | None) -> None: + request = _grpc_query().get(limit=limit) + assert request.limit == (limit or 0) + + +def test_query_limit_zero_keeps_legacy_behavior_without_validation() -> None: + zero = _grpc_query(validate_arguments=False).get(limit=0) + omitted = _grpc_query(validate_arguments=False).get() + assert zero.SerializeToString() == omitted.SerializeToString() + + @pytest.mark.asyncio async def test_bad_query_inputs(connection: ConnectionV4) -> None: query = _QueryCollectionAsync(connection, "dummy", None, None, None, None, True) diff --git a/weaviate/collections/grpc/query.py b/weaviate/collections/grpc/query.py index 281da6e2d..b9e1bfc43 100644 --- a/weaviate/collections/grpc/query.py +++ b/weaviate/collections/grpc/query.py @@ -45,6 +45,7 @@ ) from weaviate.collections.filters import _FilterToGRPC from weaviate.collections.grpc.shared import _BaseGRPC +from weaviate.exceptions import WeaviateInvalidInputError from weaviate.proto.v1 import base_search_pb2, search_get_pb2 from weaviate.types import NUMBER, UUID from weaviate.util import _ServerVersion @@ -470,6 +471,8 @@ def __create_request( ), ] ) + if limit == 0: + raise WeaviateInvalidInputError("Query limit must be greater than zero") if isinstance(return_properties, Sequence): for prop in return_properties: _validate_input(