diff --git a/plain/plain/http/response.py b/plain/plain/http/response.py index e8aec64022..2208212b90 100644 --- a/plain/plain/http/response.py +++ b/plain/plain/http/response.py @@ -798,7 +798,10 @@ def __init__( class NotAllowedResponse(Response): - """HTTP 405 response""" + """HTTP 405 response. + + The constructor is pinned: no status_code parameter, so this class + always means exactly "405 method not allowed".""" status_code = 405 @@ -807,14 +810,12 @@ def __init__( permitted_methods: list[str], *, content_type: str | None = None, - status_code: int | None = None, reason: str | None = None, charset: str | None = None, headers: dict[str, Any] | None = None, ): super().__init__( content_type=content_type, - status_code=status_code, reason=reason, charset=charset, headers=headers, diff --git a/plain/tests/public/test_http_bodiless_responses.py b/plain/tests/public/test_http_bodiless_responses.py index a063ca4b8b..0f07289248 100644 --- a/plain/tests/public/test_http_bodiless_responses.py +++ b/plain/tests/public/test_http_bodiless_responses.py @@ -14,6 +14,7 @@ FileResponse, HTTPException, JsonResponse, + NotAllowedResponse, NotModifiedResponse, Response, StreamingResponse, @@ -158,6 +159,13 @@ def test_not_modified_response_signature_is_pinned(): NotModifiedResponse(status_code=200) # ty: ignore[unknown-argument] +def test_not_allowed_response_signature_is_pinned(): + # No status_code parameter — this class always means exactly "405 + # method not allowed". + with pytest.raises(TypeError): + NotAllowedResponse(["GET"], status_code=200) # ty: ignore[unknown-argument] + + def test_setting_content_after_bodiless_status_raises(): response = Response(status_code=204) with pytest.raises(ValueError, match="cannot have a body"):