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 = f"{route.name}{route.path_format}"
operation_id = re.sub(r"\W", "_", operation_id) operation_id = re.sub(r"\W", "_", operation_id)
assert route.methods 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 return operation_id

17
tests/test_generate_unique_id_function.py

@ -3,6 +3,7 @@ import warnings
from fastapi import APIRouter, FastAPI from fastapi import APIRouter, FastAPI
from fastapi.routing import APIRoute from fastapi.routing import APIRoute
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from fastapi.utils import generate_unique_id
from inline_snapshot import snapshot from inline_snapshot import snapshot
from pydantic import BaseModel from pydantic import BaseModel
@ -1697,3 +1698,19 @@ def test_warn_duplicate_operation_id():
] ]
assert len(duplicate_warnings) > 0 assert len(duplicate_warnings) > 0
assert "Duplicate Operation ID" in str(duplicate_warnings[0].message) 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