From a6d581e0a7d789888902fecfe749e197e3a703b3 Mon Sep 17 00:00:00 2001 From: Edouard Theron Date: Mon, 16 Dec 2024 23:19:34 +0100 Subject: [PATCH 1/2] Make uuid convertor case-&-hyphen-insensitive --- starlette/convertors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starlette/convertors.py b/starlette/convertors.py index 2d8ab53be..84df87a58 100644 --- a/starlette/convertors.py +++ b/starlette/convertors.py @@ -67,7 +67,7 @@ def to_string(self, value: float) -> str: class UUIDConvertor(Convertor[uuid.UUID]): - regex = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" + regex = "[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}" def convert(self, value: str) -> uuid.UUID: return uuid.UUID(value) From 85e92be141b91105d28d5ab707e3dcfa8f3bed96 Mon Sep 17 00:00:00 2001 From: Edouard Theron Date: Tue, 17 Dec 2024 11:11:39 +0100 Subject: [PATCH 2/2] Test default UUID convertor --- tests/test_convertors.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_convertors.py b/tests/test_convertors.py index ced1b86cc..0fabe101b 100644 --- a/tests/test_convertors.py +++ b/tests/test_convertors.py @@ -1,5 +1,6 @@ from datetime import datetime from typing import Iterator +from uuid import UUID import pytest @@ -70,3 +71,26 @@ def float_convertor(request: Request) -> JSONResponse: client = test_client_factory(app) response = client.get(f"/{param}") assert response.status_code == status_code + + +@pytest.mark.parametrize( + "param, status_code", + [ + ("00000000-aaaa-ffff-9999-000000000000", 200), + ("00000000aaaaffff9999000000000000", 200), + ("00000000-AAAA-FFFF-9999-000000000000", 200), + ("00000000AAAAFFFF9999000000000000", 200), + ("not-a-uuid", 404), + ], +) +def test_default_uuid_convertor(test_client_factory: TestClientFactory, param: str, status_code: int) -> None: + def uuid_convertor(request: Request) -> JSONResponse: + param = request.path_params["param"] + assert isinstance(param, UUID) + return JSONResponse("ok") + + app = Router(routes=[Route("/{param:uuid}", endpoint=uuid_convertor)]) + + client = test_client_factory(app) + response = client.get(f"/{param}") + assert response.status_code == status_code