Browse Source

fix: make generated operation id method suffix deterministic

pull/15272/head
wwenrr 3 months ago
parent
commit
804fbbb505
  1. 2
      fastapi/utils.py
  2. 17
      tests/test_generate_unique_id_function.py

2
fastapi/utils.py

@ -96,7 +96,7 @@ 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()}"
operation_id = f"{operation_id}_{sorted(route.methods)[0].lower()}"
return operation_id

17
tests/test_generate_unique_id_function.py

@ -3,6 +3,7 @@ import warnings
from fastapi import APIRouter, FastAPI
from fastapi.routing import APIRoute
from fastapi.testclient import TestClient
from fastapi.utils import generate_unique_id
from inline_snapshot import snapshot
from pydantic import BaseModel
@ -1697,3 +1698,19 @@ def test_warn_duplicate_operation_id():
]
assert len(duplicate_warnings) > 0
assert "Duplicate Operation ID" in str(duplicate_warnings[0].message)
def test_generate_unique_id_with_multiple_methods_is_deterministic():
app = FastAPI()
@app.api_route("/items", methods=["POST", "DELETE"])
def items():
return {} # pragma: nocover
route = next(
route
for route in app.routes
if isinstance(route, APIRoute) and route.path == "/items"
)
assert generate_unique_id(route) == "items_items_delete"

Loading…
Cancel
Save