From 0a95fa7e4b327e7f96df38f288d1685e7d55fc69 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Fri, 30 Jan 2026 18:01:12 +0300 Subject: [PATCH 1/2] Update HTTP status codes from 422 UNPROCESSABLE ENTITY to 422 UNPROCESSABLE CONTENT across multiple API routers and tests for consistency. --- app/api/auth/router_auth.py | 4 ++-- app/api/auth/router_mfa.py | 2 +- app/api/dhcp/router.py | 2 +- app/api/main/dns_router.py | 2 +- app/api/network/router.py | 4 ++-- app/api/network/utils.py | 2 +- app/api/shadow/router.py | 2 +- app/ldap_protocol/dns/base.py | 6 +----- interface | 2 +- tests/test_api/test_auth/test_router.py | 4 ++-- tests/test_api/test_dhcp/test_router.py | 8 ++++---- .../test_attribute_type_router_datasets.py | 2 +- .../test_api/test_ldap_schema/test_entity_type_router.py | 2 +- .../test_ldap_schema/test_object_class_router_datasets.py | 2 +- 14 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/api/auth/router_auth.py b/app/api/auth/router_auth.py index ae8df7bfd..56484a88f 100644 --- a/app/api/auth/router_auth.py +++ b/app/api/auth/router_auth.py @@ -67,7 +67,7 @@ translator=translator, ), PasswordPolicyError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), UserNotFoundError: rule( @@ -75,7 +75,7 @@ translator=translator, ), AuthValidationError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), MFARequiredError: rule( diff --git a/app/api/auth/router_mfa.py b/app/api/auth/router_mfa.py index 18424c8ca..d7a90b3b2 100644 --- a/app/api/auth/router_mfa.py +++ b/app/api/auth/router_mfa.py @@ -62,7 +62,7 @@ translator=translator, ), InvalidCredentialsError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), NotFoundError: rule( diff --git a/app/api/dhcp/router.py b/app/api/dhcp/router.py index 053241809..78a153063 100644 --- a/app/api/dhcp/router.py +++ b/app/api/dhcp/router.py @@ -66,7 +66,7 @@ translator=translator, ), DHCPValidatonError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), DHCPOperationError: rule( diff --git a/app/api/main/dns_router.py b/app/api/main/dns_router.py index d93382512..509cb377a 100644 --- a/app/api/main/dns_router.py +++ b/app/api/main/dns_router.py @@ -43,7 +43,7 @@ error_map: ERROR_MAP_TYPE = { dns_exc.DNSSetupError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), dns_exc.DNSRecordCreateError: rule( diff --git a/app/api/network/router.py b/app/api/network/router.py index bc65ed858..f380672f2 100644 --- a/app/api/network/router.py +++ b/app/api/network/router.py @@ -38,7 +38,7 @@ error_map: ERROR_MAP_TYPE = { NetworkPolicyAlreadyExistsError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), NetworkPolicyNotFoundError: rule( @@ -46,7 +46,7 @@ translator=translator, ), LastActivePolicyError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), } diff --git a/app/api/network/utils.py b/app/api/network/utils.py index 532399eb9..a01db466d 100644 --- a/app/api/network/utils.py +++ b/app/api/network/utils.py @@ -27,6 +27,6 @@ async def check_policy_count(session: AsyncSession) -> None: if count.one() == 1: raise HTTPException( - status.HTTP_422_UNPROCESSABLE_ENTITY, + status.HTTP_422_UNPROCESSABLE_CONTENT, "At least one policy should be active", ) diff --git a/app/api/shadow/router.py b/app/api/shadow/router.py index ee8938a18..b1ebe86fb 100644 --- a/app/api/shadow/router.py +++ b/app/api/shadow/router.py @@ -46,7 +46,7 @@ translator=translator, ), PasswordPolicyError: rule( - status=status.HTTP_422_UNPROCESSABLE_ENTITY, + status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), PermissionError: rule( diff --git a/app/ldap_protocol/dns/base.py b/app/ldap_protocol/dns/base.py index 01fe71c8c..a323a7e0c 100644 --- a/app/ldap_protocol/dns/base.py +++ b/app/ldap_protocol/dns/base.py @@ -14,7 +14,7 @@ from ldap_protocol.dns.dto import DNSSettingDTO -from .exceptions import DNSSetupError +from .exceptions import DNSNotImplementedError, DNSSetupError DNS_MANAGER_STATE_NAME = "DNSManagerState" DNS_MANAGER_ZONE_NAME = "DNSManagerZoneName" @@ -46,10 +46,6 @@ class DNSForwarderServerStatus(StrEnum): NOT_FOUND = "not found" -class DNSNotImplementedError(NotImplementedError): - """API Not Implemented Error.""" - - class DNSRecordType(StrEnum): """DNS record types.""" diff --git a/interface b/interface index e1ca5656a..f31962020 160000 --- a/interface +++ b/interface @@ -1 +1 @@ -Subproject commit e1ca5656aeabc20a1862aeaf11ded72feaa97403 +Subproject commit f31962020a6689e6a4c61fb3349db5b5c7895f92 diff --git a/tests/test_api/test_auth/test_router.py b/tests/test_api/test_auth/test_router.py index ffffd6ef1..0256c0463 100644 --- a/tests/test_api/test_auth/test_router.py +++ b/tests/test_api/test_auth/test_router.py @@ -211,7 +211,7 @@ async def test_first_setup_with_invalid_domain( "/auth/setup", json=test_case, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT response = await unbound_http_client.get("/auth/setup") assert response.status_code == status.HTTP_200_OK @@ -384,7 +384,7 @@ async def test_update_password_with_empty_old_password( }, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT new_auth = await http_client.post( "auth/", diff --git a/tests/test_api/test_dhcp/test_router.py b/tests/test_api/test_dhcp/test_router.py index fbb739816..2ea89d0de 100644 --- a/tests/test_api/test_dhcp/test_router.py +++ b/tests/test_api/test_dhcp/test_router.py @@ -147,7 +147,7 @@ async def test_create_subnet_invalid_data( json=invalid_data, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT @pytest.mark.asyncio @@ -297,7 +297,7 @@ async def test_create_lease_invalid_data( json=invalid_data, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT @pytest.mark.asyncio @@ -486,7 +486,7 @@ async def test_create_reservation_invalid_data( json=invalid_data, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT @pytest.mark.asyncio @@ -597,7 +597,7 @@ async def test_delete_reservation_missing_params( """Test reservation deletion with missing parameters.""" response = await http_client.delete("/dhcp/reservation") - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT @pytest.mark.asyncio diff --git a/tests/test_api/test_ldap_schema/test_attribute_type_router_datasets.py b/tests/test_api/test_ldap_schema/test_attribute_type_router_datasets.py index bcfea7210..e04eecc8d 100644 --- a/tests/test_api/test_ldap_schema/test_attribute_type_router_datasets.py +++ b/tests/test_api/test_ldap_schema/test_attribute_type_router_datasets.py @@ -115,6 +115,6 @@ { "attribute_type_schemas": [], "attribute_types_deleted": [], - "status_code": status.HTTP_422_UNPROCESSABLE_ENTITY, + "status_code": status.HTTP_422_UNPROCESSABLE_CONTENT, }, ] diff --git a/tests/test_api/test_ldap_schema/test_entity_type_router.py b/tests/test_api/test_ldap_schema/test_entity_type_router.py index c130c2067..b7a40c66e 100644 --- a/tests/test_api/test_ldap_schema/test_entity_type_router.py +++ b/tests/test_api/test_ldap_schema/test_entity_type_router.py @@ -78,7 +78,7 @@ async def test_create_one_entity_type_value_422( "is_system": False, }, ) - assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT @pytest.mark.parametrize( diff --git a/tests/test_api/test_ldap_schema/test_object_class_router_datasets.py b/tests/test_api/test_ldap_schema/test_object_class_router_datasets.py index 3864c4035..1824cee7a 100644 --- a/tests/test_api/test_ldap_schema/test_object_class_router_datasets.py +++ b/tests/test_api/test_ldap_schema/test_object_class_router_datasets.py @@ -206,7 +206,7 @@ { "object_class_datas": [], "object_classes_deleted": [], - "status_code": status.HTTP_422_UNPROCESSABLE_ENTITY, + "status_code": status.HTTP_422_UNPROCESSABLE_CONTENT, }, { "object_class_datas": [ From e2f1300afbd9e2436cb872ce360f7a70375a167b Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Tue, 3 Feb 2026 15:13:23 +0300 Subject: [PATCH 2/2] Fix: correct spelling of DHCPValidationError in exceptions and update references across the codebase --- app/api/dhcp/router.py | 4 ++-- app/ldap_protocol/dhcp/__init__.py | 4 ++-- app/ldap_protocol/dhcp/exceptions.py | 2 +- tests/test_api/test_network/test_router.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/api/dhcp/router.py b/app/api/dhcp/router.py index 78a153063..a41e806a0 100644 --- a/app/api/dhcp/router.py +++ b/app/api/dhcp/router.py @@ -25,7 +25,7 @@ DHCPEntryNotFoundError, DHCPEntryUpdateError, DHCPOperationError, - DHCPValidatonError, + DHCPValidationError, ) from ldap_protocol.dhcp.schemas import ( DHCPChangeStateSchemaRequest, @@ -65,7 +65,7 @@ status=status.HTTP_400_BAD_REQUEST, translator=translator, ), - DHCPValidatonError: rule( + DHCPValidationError: rule( status=status.HTTP_422_UNPROCESSABLE_CONTENT, translator=translator, ), diff --git a/app/ldap_protocol/dhcp/__init__.py b/app/ldap_protocol/dhcp/__init__.py index cf26f1903..d9f4c277c 100644 --- a/app/ldap_protocol/dhcp/__init__.py +++ b/app/ldap_protocol/dhcp/__init__.py @@ -8,7 +8,7 @@ DHCPEntryNotFoundError, DHCPEntryUpdateError, DHCPOperationError, - DHCPValidatonError, + DHCPValidationError, ) from .kea_dhcp_manager import KeaDHCPManager from .kea_dhcp_repository import KeaDHCPAPIRepository @@ -54,7 +54,7 @@ def get_dhcp_api_repository_class( "DHCPEntryDeleteError", "DHCPEntryAddError", "DHCPEntryUpdateError", - "DHCPValidatonError", + "DHCPValidationError", "DHCPOperationError", "DHCPAPIError", "DHCPSubnetSchemaRequest", diff --git a/app/ldap_protocol/dhcp/exceptions.py b/app/ldap_protocol/dhcp/exceptions.py index 4b29a4514..c5be2f126 100644 --- a/app/ldap_protocol/dhcp/exceptions.py +++ b/app/ldap_protocol/dhcp/exceptions.py @@ -37,7 +37,7 @@ class DHCPAPIError(DHCPError): code = ErrorCodes.DHCP_API_ERROR -class DHCPValidatonError(DHCPError): +class DHCPValidationError(DHCPError): """DHCP validation error.""" code = ErrorCodes.DHCP_VALIDATION_ERROR diff --git a/tests/test_api/test_network/test_router.py b/tests/test_api/test_network/test_router.py index 70e7f38e6..b98759bcd 100644 --- a/tests/test_api/test_network/test_router.py +++ b/tests/test_api/test_network/test_router.py @@ -260,7 +260,7 @@ async def test_delete_policy( assert response[0]["priority"] == 1 response = await http_client.delete(f"/policy/{pol_id2}") - assert response.status_code == 422 + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT assert response.json()["detail"] == "At least one policy should be active" @@ -314,7 +314,7 @@ async def test_switch_policy( assert response.json()[0]["enabled"] is False response = await http_client.patch(f"/policy/{pol_id2}") - assert response.status_code == 422 + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT assert response.json()["detail"] == "At least one policy should be active"