Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions fastapi_decorators/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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] = {}
Expand Down
13 changes: 12 additions & 1 deletion tests/app.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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

Expand Down
22 changes: 20 additions & 2 deletions tests/forwardrefs/test_forwardrefs.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"
7 changes: 7 additions & 0 deletions tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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