From 25602e1f5dc375449a6c9cfc279086aff59c5b8e Mon Sep 17 00:00:00 2001 From: "Pegler, Sam" Date: Fri, 4 Jul 2025 11:00:54 +0100 Subject: [PATCH 1/4] Bug: Add failing test. --- tests/app.py | 13 ++++++++++++- tests/test_app.py | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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/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 From a1e60d496595899d30c6c5a35ba9f854fcae8296 Mon Sep 17 00:00:00 2001 From: "Pegler, Sam" Date: Fri, 4 Jul 2025 11:13:30 +0100 Subject: [PATCH 2/4] Bug: Add extra test that covers forward refs plus annotations. --- tests/forwardrefs/test_forwardrefs.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/forwardrefs/test_forwardrefs.py b/tests/forwardrefs/test_forwardrefs.py index 3e1724d..697fa94 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") + @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" From f9c20e96d2e0576c67e2c61d29ebcb537c7eea2f Mon Sep 17 00:00:00 2001 From: "Pegler, Sam" Date: Fri, 4 Jul 2025 13:45:34 +0100 Subject: [PATCH 3/4] Partial: add type ignore. --- tests/forwardrefs/test_forwardrefs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/forwardrefs/test_forwardrefs.py b/tests/forwardrefs/test_forwardrefs.py index 697fa94..b14c10f 100644 --- a/tests/forwardrefs/test_forwardrefs.py +++ b/tests/forwardrefs/test_forwardrefs.py @@ -39,7 +39,7 @@ def test_forward_references_are_copied_from_call_site_scope( def test_forward_references_plus_annotation( test_client: TestClient, ) -> None: - @test_client.app.get("/test-extra") + @test_client.app.get("/test-extra") # type: ignore[attr-defined,misc] @empty_decorator def endpoint_with_request_dependency( request: Request, From 7c0bb5febdeec0bf85f72136594733a160fa5e72 Mon Sep 17 00:00:00 2001 From: "Pegler, Sam" Date: Fri, 4 Jul 2025 13:45:53 +0100 Subject: [PATCH 4/4] Bug: Include extras when calling get_type_hints. --- fastapi_decorators/decorators.py | 1 + 1 file changed, 1 insertion(+) 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] = {}