mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-07-18 05:30:18 -04:00
fix: handle IntegrityError with 409 conflict response (#7712)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
from sqlite3 import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from mealie.lang.providers import Translator
|
from mealie.lang.providers import Translator
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,11 @@ class HttpRepo[C: BaseModel, R: BaseModel, U: BaseModel]:
|
|||||||
status.HTTP_404_NOT_FOUND,
|
status.HTTP_404_NOT_FOUND,
|
||||||
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
|
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
|
||||||
)
|
)
|
||||||
|
elif isinstance(ex, sqlalchemy.exc.IntegrityError):
|
||||||
|
raise HTTPException(
|
||||||
|
status.HTTP_409_CONFLICT,
|
||||||
|
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status.HTTP_400_BAD_REQUEST,
|
status.HTTP_400_BAD_REQUEST,
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ def test_organizer_association(
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("route", organizer_routes, ids=test_ids)
|
@pytest.mark.parametrize("route", organizer_routes, ids=test_ids)
|
||||||
def test_organizer_create_duplicate_name_returns_400(
|
def test_organizer_create_duplicate_name_returns_409(
|
||||||
api_client: TestClient,
|
api_client: TestClient,
|
||||||
unique_user: TestUser,
|
unique_user: TestUser,
|
||||||
route: RoutesBase,
|
route: RoutesBase,
|
||||||
@@ -206,7 +206,7 @@ def test_organizer_create_duplicate_name_returns_400(
|
|||||||
assert response.status_code == 201
|
assert response.status_code == 201
|
||||||
|
|
||||||
response = api_client.post(route.base, json=data, headers=unique_user.token)
|
response = api_client.post(route.base, json=data, headers=unique_user.token)
|
||||||
assert response.status_code == 400
|
assert response.status_code == 409
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("route, recipe_key", association_data, ids=test_ids)
|
@pytest.mark.parametrize("route, recipe_key", association_data, ids=test_ids)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ def create_labels(api_client: TestClient, unique_user: TestUser, count: int = 10
|
|||||||
return labels
|
return labels
|
||||||
|
|
||||||
|
|
||||||
def test_label_create_duplicate_name_returns_400(api_client: TestClient, unique_user_fn_scoped: TestUser):
|
def test_label_create_duplicate_name_returns_409(api_client: TestClient, unique_user_fn_scoped: TestUser):
|
||||||
# Regression test for #7582: POSTing a duplicate label name leaked the
|
# Regression test for #7582: POSTing a duplicate label name leaked the
|
||||||
# sqlalchemy IntegrityError as an HTTP 500. The expected behavior, matching
|
# sqlalchemy IntegrityError as an HTTP 500. The expected behavior, matching
|
||||||
# the other organizer endpoints (foods, units, tools, tags, categories),
|
# the other organizer endpoints (foods, units, tools, tags, categories),
|
||||||
@@ -32,7 +32,7 @@ def test_label_create_duplicate_name_returns_400(api_client: TestClient, unique_
|
|||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
response = api_client.post(api_routes.groups_labels, json=payload, headers=unique_user_fn_scoped.token)
|
response = api_client.post(api_routes.groups_labels, json=payload, headers=unique_user_fn_scoped.token)
|
||||||
assert response.status_code == 400
|
assert response.status_code == 409
|
||||||
|
|
||||||
|
|
||||||
def test_new_list_creates_list_labels(api_client: TestClient, unique_user: TestUser):
|
def test_new_list_creates_list_labels(api_client: TestClient, unique_user: TestUser):
|
||||||
|
|||||||
Reference in New Issue
Block a user