Skip to content
Open
Show file tree
Hide file tree
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
2 changes: 2 additions & 0 deletions CHANGES/1458.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fixed ``uuid.UUID`` objects being converted to integers instead of strings
when used as query parameter values -- by :user:`toroleapinc`.
47 changes: 47 additions & 0 deletions tests/test_update_query.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import enum
import uuid

import pytest
from multidict import MultiDict
Expand Down Expand Up @@ -275,6 +276,52 @@ class FloatEnum(float, enum.Enum):
assert str(url2) == "http://example.com/path?a=1.1"


def test_with_query_uuid() -> None:
"""UUID objects should be converted to string representation, not integer."""
url = URL("http://example.com/path")
test_uuid = uuid.UUID("3199712f-1b78-4420-852b-a73ee09e6a8f")
url2 = url.with_query(user_id=test_uuid)
assert (
str(url2)
== "http://example.com/path?user_id=3199712f-1b78-4420-852b-a73ee09e6a8f"
)


def test_with_query_uuid_multiple_values() -> None:
"""Test UUID handling with multiple values."""
url = URL("http://example.com/path")
uuid1 = uuid.UUID("3199712f-1b78-4420-852b-a73ee09e6a8f")
uuid2 = uuid.UUID("550e8400-e29b-41d4-a716-446655440000")
url2 = url.with_query([("id", uuid1), ("id", uuid2)])
assert (
str(url2)
== "http://example.com/path?id=3199712f-1b78-4420-852b-a73ee09e6a8f&id=550e8400-e29b-41d4-a716-446655440000"
)


def test_with_query_uuid_mixed_types() -> None:
"""Test UUID mixed with other types."""
url = URL("http://example.com/path")
test_uuid = uuid.UUID("3199712f-1b78-4420-852b-a73ee09e6a8f")
url2 = url.with_query({"user_id": test_uuid, "count": 42, "name": "test"})
query_parts = str(url2).split("?")[1].split("&")
query_dict = dict(part.split("=") for part in query_parts)
assert query_dict["user_id"] == "3199712f-1b78-4420-852b-a73ee09e6a8f"
assert query_dict["count"] == "42"
assert query_dict["name"] == "test"


def test_update_query_uuid() -> None:
"""Test UUID handling with update_query."""
url = URL("http://example.com/path?existing=value")
test_uuid = uuid.UUID("3199712f-1b78-4420-852b-a73ee09e6a8f")
url2 = url.update_query(user_id=test_uuid)
assert (
str(url2)
== "http://example.com/path?existing=value&user_id=3199712f-1b78-4420-852b-a73ee09e6a8f"
)


def test_with_query_multidict() -> None:
url = URL("http://example.com/path")
q = MultiDict([("a", "b"), ("c", "d")])
Expand Down
5 changes: 4 additions & 1 deletion yarl/_query.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
"""Query string handling."""

import math
import uuid
from collections.abc import Iterable, Mapping, Sequence
from typing import TYPE_CHECKING, Any, SupportsInt, Union, cast

from multidict import istr

from ._quoters import QUERY_PART_QUOTER, QUERY_QUOTER

SimpleQuery = Union[str, SupportsInt, float]
SimpleQuery = Union[str, SupportsInt, float, uuid.UUID]
QueryVariable = Union[SimpleQuery, Sequence[SimpleQuery]]
Query = Union[
None, str, Mapping[str, QueryVariable], Sequence[tuple[str, QueryVariable]]
Expand All @@ -22,6 +23,8 @@ def query_var(v: SimpleQuery) -> str:
return str(v)
if isinstance(v, str):
return v
if isinstance(v, uuid.UUID):
return str(v)
if isinstance(v, float):
if math.isinf(v):
raise ValueError("float('inf') is not supported")
Expand Down
Loading