Skip to content

Commit 7dd8813

Browse files
🐛 Fix testing security scopes when using dependency overrides (#1549)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
1 parent 530fc8f commit 7dd8813

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

fastapi/dependencies/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ async def solve_dependencies(
500500
name=sub_dependant.name,
501501
security_scopes=sub_dependant.security_scopes,
502502
)
503+
use_sub_dependant.security_scopes = sub_dependant.security_scopes
503504

504505
solved_result = await solve_dependencies(
505506
request=request,
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from typing import List, Tuple
2+
3+
from fastapi import Depends, FastAPI, Security
4+
from fastapi.security import SecurityScopes
5+
from fastapi.testclient import TestClient
6+
7+
app = FastAPI()
8+
9+
10+
def get_user(required_scopes: SecurityScopes):
11+
return "john", required_scopes.scopes
12+
13+
14+
def get_user_override(required_scopes: SecurityScopes):
15+
return "alice", required_scopes.scopes
16+
17+
18+
def get_data():
19+
return [1, 2, 3]
20+
21+
22+
def get_data_override():
23+
return [3, 4, 5]
24+
25+
26+
@app.get("/user")
27+
def read_user(
28+
user_data: Tuple[str, List[str]] = Security(get_user, scopes=["foo", "bar"]),
29+
data: List[int] = Depends(get_data),
30+
):
31+
return {"user": user_data[0], "scopes": user_data[1], "data": data}
32+
33+
34+
client = TestClient(app)
35+
36+
37+
def test_normal():
38+
response = client.get("/user")
39+
assert response.json() == {
40+
"user": "john",
41+
"scopes": ["foo", "bar"],
42+
"data": [1, 2, 3],
43+
}
44+
45+
46+
def test_override_data():
47+
app.dependency_overrides[get_data] = get_data_override
48+
response = client.get("/user")
49+
assert response.json() == {
50+
"user": "john",
51+
"scopes": ["foo", "bar"],
52+
"data": [3, 4, 5],
53+
}
54+
app.dependency_overrides = {}
55+
56+
57+
def test_override_security():
58+
app.dependency_overrides[get_user] = get_user_override
59+
response = client.get("/user")
60+
assert response.json() == {
61+
"user": "alice",
62+
"scopes": ["foo", "bar"],
63+
"data": [1, 2, 3],
64+
}
65+
app.dependency_overrides = {}

0 commit comments

Comments
 (0)