diff --git a/fastapi_decorators/decorators.py b/fastapi_decorators/decorators.py index 859d4a6..62c5663 100644 --- a/fastapi_decorators/decorators.py +++ b/fastapi_decorators/decorators.py @@ -64,6 +64,7 @@ def decorator(func: F) -> F: original_func, globalns=original_func.__globals__, localns=None, + include_extras=True, ) resolved_params: dict[str, Parameter] = {} diff --git a/tests/app.py b/tests/app.py index 313fa52..c49c39b 100644 --- a/tests/app.py +++ b/tests/app.py @@ -1,7 +1,7 @@ from functools import wraps import logging from time import sleep, time -from typing import Any +from typing import Annotated, Any from fastapi import Depends, FastAPI, HTTPException, Header, Request, Response from fastapi.responses import JSONResponse from pydantic import BaseModel @@ -334,6 +334,17 @@ def get_error_log() -> list[Any]: return error_log +@app.get("/headers") +@log +def expects_header( + requestor_id: Annotated[str, Header(alias="requestor_id")], +) -> dict[str, str]: + """ + Endpoint that returns current annotated requestor_id. + """ + return {"requestor_id": requestor_id} + + if __name__ == "__main__": import uvicorn diff --git a/tests/forwardrefs/test_forwardrefs.py b/tests/forwardrefs/test_forwardrefs.py index 3e1724d..b14c10f 100644 --- a/tests/forwardrefs/test_forwardrefs.py +++ b/tests/forwardrefs/test_forwardrefs.py @@ -1,10 +1,10 @@ """This app JUST tests forward references.""" from __future__ import annotations - +from typing import Annotated import pytest -from fastapi import FastAPI, Request +from fastapi import FastAPI, Request, Header from fastapi.testclient import TestClient from tests.forwardrefs.dummy_decorator import empty_decorator @@ -34,3 +34,21 @@ def test_forward_references_are_copied_from_call_site_scope( response = test_client.get("/test") assert response.status_code == 200 assert response.json() == "OK" + + +def test_forward_references_plus_annotation( + test_client: TestClient, +) -> None: + @test_client.app.get("/test-extra") # type: ignore[attr-defined,misc] + @empty_decorator + def endpoint_with_request_dependency( + request: Request, + requestor_id: Annotated[str, Header(alias="requestor_id")], + ) -> str: + """Test a builtin.""" + return "OK" + + headers = {"requestor_id": "potato@me"} + response = test_client.get("/test-extra", headers=headers) + assert response.status_code == 200 + assert response.json() == "OK" diff --git a/tests/test_app.py b/tests/test_app.py index 20b11a0..d8a774d 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -161,3 +161,10 @@ def test_error_log_endpoint() -> None: assert response.status_code == 200 data = response.json() assert isinstance(data, list) + + +def test_expects_header() -> None: + headers = {"requestor_id": "potato@me"} + response = client.get("/headers", headers=headers) + assert response.status_code == 200 + assert response.json() == headers