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.
65 lines
1.4 KiB
65 lines
1.4 KiB
from typing import List, Tuple
|
|
|
|
from fastapi import Depends, FastAPI, Security
|
|
from fastapi.security import SecurityScopes
|
|
from fastapi.testclient import TestClient
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
def get_user(required_scopes: SecurityScopes):
|
|
return "john", required_scopes.scopes
|
|
|
|
|
|
def get_user_override(required_scopes: SecurityScopes):
|
|
return "alice", required_scopes.scopes
|
|
|
|
|
|
def get_data():
|
|
return [1, 2, 3]
|
|
|
|
|
|
def get_data_override():
|
|
return [3, 4, 5]
|
|
|
|
|
|
@app.get("/user")
|
|
def read_user(
|
|
user_data: Tuple[str, List[str]] = Security(get_user, scopes=["foo", "bar"]),
|
|
data: List[int] = Depends(get_data),
|
|
):
|
|
return {"user": user_data[0], "scopes": user_data[1], "data": data}
|
|
|
|
|
|
client = TestClient(app)
|
|
|
|
|
|
def test_normal():
|
|
response = client.get("/user")
|
|
assert response.json() == {
|
|
"user": "john",
|
|
"scopes": ["foo", "bar"],
|
|
"data": [1, 2, 3],
|
|
}
|
|
|
|
|
|
def test_override_data():
|
|
app.dependency_overrides[get_data] = get_data_override
|
|
response = client.get("/user")
|
|
assert response.json() == {
|
|
"user": "john",
|
|
"scopes": ["foo", "bar"],
|
|
"data": [3, 4, 5],
|
|
}
|
|
app.dependency_overrides = {}
|
|
|
|
|
|
def test_override_security():
|
|
app.dependency_overrides[get_user] = get_user_override
|
|
response = client.get("/user")
|
|
assert response.json() == {
|
|
"user": "alice",
|
|
"scopes": ["foo", "bar"],
|
|
"data": [1, 2, 3],
|
|
}
|
|
app.dependency_overrides = {}
|
|
|