From 90ba034b60930e160d49ffba740e0d38f29fd574 Mon Sep 17 00:00:00 2001 From: dawaman43 Date: Tue, 10 Feb 2026 11:30:40 +0300 Subject: [PATCH] Make default operation IDs deterministic for multi-method routes --- fastapi/utils.py | 3 ++- tests/test_generate_unique_id_function.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 28c7cdfccb..4cda2d4666 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -98,7 +98,8 @@ def generate_unique_id(route: "APIRoute") -> str: operation_id = f"{route.name}{route.path_format}" operation_id = re.sub(r"\W", "_", operation_id) assert route.methods - operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" + method = sorted(route.methods)[0].lower() + operation_id = f"{operation_id}_{method}" return operation_id diff --git a/tests/test_generate_unique_id_function.py b/tests/test_generate_unique_id_function.py index c56e6d5794..53007f9d9e 100644 --- a/tests/test_generate_unique_id_function.py +++ b/tests/test_generate_unique_id_function.py @@ -29,6 +29,14 @@ class Message(BaseModel): description: str +def test_generate_unique_id_is_deterministic_with_multiple_methods(): + def read_items(): # pragma: nocover - used for name only + return None + + route = APIRoute("/items", read_items, methods=["POST", "GET"]) + assert route.unique_id == "read_items_items_get" + + def test_top_level_generate_unique_id(): app = FastAPI(generate_unique_id_function=custom_generate_unique_id) router = APIRouter()