Issue Manager / issue-manager (push) Has been cancelled
Build Docs / changes (push) Has been cancelled
Build Docs / langs (push) Has been cancelled
Build Docs / build-docs (push) Has been cancelled
Build Docs / docs-all-green (push) Has been cancelled
Conflict detector / main (push) Has been cancelled
Test Redistribute / test-redistribute (fastapi) (push) Has been cancelled
Test Redistribute / test-redistribute (fastapi-slim) (push) Has been cancelled
Test Redistribute / test-redistribute-alls-green (push) Has been cancelled
Test / lint (push) Has been cancelled
Test / test (pydantic-v1, 3.10) (push) Has been cancelled
Test / test (pydantic-v1, 3.11) (push) Has been cancelled
Test / test (pydantic-v1, 3.13) (push) Has been cancelled
Test / test (pydantic-v1, 3.8) (push) Has been cancelled
Test / test (pydantic-v1, 3.9) (push) Has been cancelled
Test / test (pydantic-v2, 3.10) (push) Has been cancelled
Test / test (pydantic-v2, 3.11) (push) Has been cancelled
Test / test (pydantic-v2, 3.12) (push) Has been cancelled
Test / test (pydantic-v2, 3.13) (push) Has been cancelled
Test / test (pydantic-v2, 3.14) (push) Has been cancelled
Test / test (pydantic-v2, 3.8) (push) Has been cancelled
Test / test (pydantic-v2, 3.9) (push) Has been cancelled
Test / coverage-combine (push) Has been cancelled
Test / check (push) Has been cancelled
Label Approved / label-approved (push) Has been cancelled
FastAPI People Contributors / job (push) Has been cancelled
FastAPI People Sponsors / job (push) Has been cancelled
Update Topic Repos / topic-repos (push) Has been cancelled
FastAPI People / job (push) Has been cancelled
Test / test (pydantic-v1, 3.12) (push) Has been cancelled
47 lines
1.0 KiB
Python
47 lines
1.0 KiB
Python
from typing import Dict
|
|
|
|
import pytest
|
|
from fastapi import Depends, FastAPI, Security
|
|
from fastapi.testclient import TestClient
|
|
from typing_extensions import Annotated
|
|
|
|
|
|
@pytest.fixture(name="call_counter")
|
|
def call_counter_fixture():
|
|
return {"count": 0}
|
|
|
|
|
|
@pytest.fixture(name="app")
|
|
def app_fixture(call_counter: Dict[str, int]):
|
|
def get_db():
|
|
call_counter["count"] += 1
|
|
return f"db_{call_counter['count']}"
|
|
|
|
def get_user(db: Annotated[str, Depends(get_db)]):
|
|
return "user"
|
|
|
|
app = FastAPI()
|
|
|
|
@app.get("/")
|
|
def endpoint(
|
|
db: Annotated[str, Depends(get_db)],
|
|
user: Annotated[str, Security(get_user, scopes=["read"])],
|
|
):
|
|
return {"db": db}
|
|
|
|
return app
|
|
|
|
|
|
@pytest.fixture(name="client")
|
|
def client_fixture(app: FastAPI):
|
|
return TestClient(app)
|
|
|
|
|
|
def test_security_scopes_dependency_called_once(
|
|
client: TestClient, call_counter: Dict[str, int]
|
|
):
|
|
response = client.get("/")
|
|
|
|
assert response.status_code == 200
|
|
assert call_counter["count"] == 1
|