From f8fa20a218491468bb312829c8472b3f4924a775 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Sun, 22 Mar 2026 15:38:58 -0400 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Remove=20unreachable=20guard=20in?= =?UTF-8?q?=20get=5Fsse=5Fdata=5Ftype;=20add=20subclass=20coverage=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pydantic BaseModel subclasses always have __pydantic_generic_metadata__, so the `if not meta` early-return was dead code. Collapse it into a ternary and add a test for a plain (non-parameterized) ServerSentEvent subclass to reach the `not args` branch, bringing fastapi/sse.py to 100% coverage. Co-Authored-By: Claude Sonnet 4.6 --- fastapi/sse.py | 4 +--- tests/test_sse.py | 9 +++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fastapi/sse.py b/fastapi/sse.py index 55d668b4bd..fc0c31f140 100644 --- a/fastapi/sse.py +++ b/fastapi/sse.py @@ -264,9 +264,7 @@ def get_sse_data_type(annotation: Any) -> Any | None: if annotation is ServerSentEvent: return None meta = getattr(annotation, "__pydantic_generic_metadata__", None) - if not meta: - return None - args = meta.get("args", ()) + args = meta.get("args", ()) if meta else () if not args or isinstance(args[0], TypeVar): return None return args[0] diff --git a/tests/test_sse.py b/tests/test_sse.py index bc464c464e..8866a669e1 100644 --- a/tests/test_sse.py +++ b/tests/test_sse.py @@ -340,6 +340,15 @@ def test_get_sse_data_type_non_sse(): assert get_sse_data_type(None) is None +def test_get_sse_data_type_subclass_no_type_param(): + """get_sse_data_type returns None for a plain ServerSentEvent subclass.""" + + class MyEvent(ServerSentEvent): + pass + + assert get_sse_data_type(MyEvent) is None + + def test_generic_sse_construction_validates_data(): """ServerSentEvent[Item] requires data to be an Item.""" item = Item(name="Foo", description=None)