Skip to content

Commit

Permalink
🐛 Fix parameterless Depends() with generics (#9479)
Browse files Browse the repository at this point in the history
Co-authored-by: Sebastián Ramírez <[email protected]>
  • Loading branch information
nzig and tiangolo authored Apr 2, 2024
1 parent 3c39b1c commit eec612c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
4 changes: 3 additions & 1 deletion fastapi/dependencies/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import inspect
from contextlib import AsyncExitStack, contextmanager
from copy import deepcopy
from copy import copy, deepcopy
from typing import (
Any,
Callable,
Expand Down Expand Up @@ -384,6 +384,8 @@ def analyze_param(
field_info.annotation = type_annotation

if depends is not None and depends.dependency is None:
# Copy `depends` before mutating it
depends = copy(depends)
depends.dependency = type_annotation

if lenient_issubclass(
Expand Down
77 changes: 77 additions & 0 deletions tests/test_generic_parameterless_depends.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from typing import TypeVar

from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
from typing_extensions import Annotated

app = FastAPI()

T = TypeVar("T")

Dep = Annotated[T, Depends()]


class A:
pass


class B:
pass


@app.get("/a")
async def a(dep: Dep[A]):
return {"cls": dep.__class__.__name__}


@app.get("/b")
async def b(dep: Dep[B]):
return {"cls": dep.__class__.__name__}


client = TestClient(app)


def test_generic_parameterless_depends():
response = client.get("/a")
assert response.status_code == 200, response.text
assert response.json() == {"cls": "A"}

response = client.get("/b")
assert response.status_code == 200, response.text
assert response.json() == {"cls": "B"}


def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"info": {"title": "FastAPI", "version": "0.1.0"},
"openapi": "3.1.0",
"paths": {
"/a": {
"get": {
"operationId": "a_a_get",
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
"description": "Successful " "Response",
}
},
"summary": "A",
}
},
"/b": {
"get": {
"operationId": "b_b_get",
"responses": {
"200": {
"content": {"application/json": {"schema": {}}},
"description": "Successful " "Response",
}
},
"summary": "B",
}
},
},
}

0 comments on commit eec612c

Please sign in to comment.