From 99d7d2a9169340f17e309049c868e445dac8ecb7 Mon Sep 17 00:00:00 2001 From: Maksim Zayats Date: Tue, 17 Mar 2026 01:04:40 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20Add=20test=20to=20cover=20mixed?= =?UTF-8?q?=20param=20model=20openapi=20metadata=20branches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ookie_header_param_models_with_siblings.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/test_query_cookie_header_param_models_with_siblings.py b/tests/test_query_cookie_header_param_models_with_siblings.py index 0648a29292..673d34151a 100644 --- a/tests/test_query_cookie_header_param_models_with_siblings.py +++ b/tests/test_query_cookie_header_param_models_with_siblings.py @@ -35,6 +35,17 @@ def read_query_mixed( return {"m": m.model_dump(), "extra": extra} +@app.get("/query/openapi-metadata") +def read_query_openapi_metadata( + m: Annotated[QueryModel, Query()], + documented_query: Annotated[ + str | None, + Query(description="Documented query", deprecated=True), + ] = None, +): + return {"m": m.model_dump(), "documented_query": documented_query} + + @app.get("/header/only") def read_header_only(h: Annotated[HeaderModel, Header()]): return {"h": h.model_dump()} @@ -56,6 +67,26 @@ def read_header_mixed_no_convert( return {"h": h.model_dump(), "extra": extra} +@app.get("/header/openapi-metadata") +def read_header_openapi_metadata( + h: Annotated[HeaderModel, Header()], + hidden_header: Annotated[str | None, Header(include_in_schema=False)] = None, + documented_header: Annotated[ + str | None, + Header( + description="Documented header", + openapi_examples={"demo": {"summary": "Demo", "value": "abc"}}, + deprecated=True, + ), + ] = None, +): + return { + "h": h.model_dump(), + "hidden_header": hidden_header, + "documented_header": documented_header, + } + + @app.get("/cookie/only") def read_cookie_only(c: Annotated[CookieModel, Cookie()]): return {"c": c.model_dump()} @@ -107,6 +138,15 @@ def test_query_model_with_sibling_param_openapi(): assert "m" not in parameter_names +def test_query_openapi_metadata(): + parameters = app.openapi()["paths"]["/query/openapi-metadata"]["get"]["parameters"] + documented_query = next( + param for param in parameters if param["name"] == "documented_query" + ) + assert documented_query["description"] == "Documented query" + assert documented_query["deprecated"] is True + + def test_header_model_only_still_flattens(): response = client.get( "/header/only", @@ -158,6 +198,23 @@ def test_header_model_with_sibling_param_convert_underscores_false(): assert parameter_names == ["x_token", "x_trace", "extra"] +def test_header_openapi_metadata_and_hidden_params(): + parameters = app.openapi()["paths"]["/header/openapi-metadata"]["get"]["parameters"] + parameter_names = [param["name"] for param in parameters] + + assert parameter_names == ["x-token", "x-trace", "documented-header"] + + documented_header = next( + param for param in parameters if param["name"] == "documented-header" + ) + assert documented_header["description"] == "Documented header" + assert documented_header["deprecated"] is True + assert documented_header["examples"] == { + "demo": {"summary": "Demo", "value": "abc"} + } + assert "hidden-header" not in parameter_names + + def test_cookie_model_only_still_flattens(): with client as c: c.cookies.clear()