pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
"""
|
|
Test that routes with multiple methods get unique operation IDs.
|
|
This is a regression test for issue #13175.
|
|
"""
|
|
|
|
import warnings
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def test_multiple_methods_generate_unique_operation_ids():
|
|
"""Test that add_api_route with multiple methods generates unique operation IDs."""
|
|
app = FastAPI()
|
|
|
|
def clear():
|
|
return {"cleared": True}
|
|
|
|
app.add_api_route("/clear", clear, methods=["POST", "DELETE"])
|
|
|
|
# Capture warnings to check for duplicate operation_id warnings
|
|
with warnings.catch_warnings(record=True) as w:
|
|
warnings.simplefilter("always")
|
|
client = TestClient(app)
|
|
response = client.get("/openapi.json")
|
|
|
|
# There should be no duplicate operation_id warnings
|
|
dup_warnings = [
|
|
warning for warning in w if "Duplicate Operation ID" in str(warning.message)
|
|
]
|
|
assert len(dup_warnings) == 0, (
|
|
f"Expected no duplicate warnings, got: {dup_warnings}"
|
|
)
|
|
|
|
openapi_schema = response.json()
|
|
|
|
# Get the operation IDs for POST and DELETE
|
|
post_operation_id = openapi_schema["paths"]["/clear"]["post"]["operationId"]
|
|
delete_operation_id = openapi_schema["paths"]["/clear"]["delete"]["operationId"]
|
|
|
|
# They should be different
|
|
assert post_operation_id != delete_operation_id, (
|
|
f"POST and DELETE should have different operation IDs. "
|
|
f"Got POST: {post_operation_id}, DELETE: {delete_operation_id}"
|
|
)
|
|
|
|
# Verify the operation IDs contain the correct method suffix
|
|
assert post_operation_id.endswith("_post"), (
|
|
f"POST operation_id should end with '_post', got: {post_operation_id}"
|
|
)
|
|
assert delete_operation_id.endswith("_delete"), (
|
|
f"DELETE operation_id should end with '_delete', got: {delete_operation_id}"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_multiple_methods_generate_unique_operation_ids()
|
|
print("Test passed!")
|
|
|