mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-07-24 15:49:42 +02:00
fix: Prevent Bad Cookbook Names (#4364)
This commit is contained in:
parent
1af2473a72
commit
6d89fe37ad
2 changed files with 29 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
|
|
||||||
from pydantic import UUID4, ConfigDict, Field, field_validator
|
from pydantic import UUID4, ConfigDict, Field, field_validator
|
||||||
|
from slugify import slugify
|
||||||
from sqlalchemy.orm import joinedload
|
from sqlalchemy.orm import joinedload
|
||||||
from sqlalchemy.orm.interfaces import LoaderOption
|
from sqlalchemy.orm.interfaces import LoaderOption
|
||||||
|
|
||||||
|
@ -29,6 +30,18 @@ class CreateCookBook(MealieModel):
|
||||||
def validate_public(public: bool | None) -> bool:
|
def validate_public(public: bool | None) -> bool:
|
||||||
return False if public is None else public
|
return False if public is None else public
|
||||||
|
|
||||||
|
@field_validator("name")
|
||||||
|
def validate_name(name: str) -> str:
|
||||||
|
name = name.strip()
|
||||||
|
|
||||||
|
# we calculate the slug later leveraging the database,
|
||||||
|
# but we still need to validate the name can be slugified
|
||||||
|
possible_slug = slugify(name)
|
||||||
|
if not (name and possible_slug):
|
||||||
|
raise ValueError("Name cannot be empty")
|
||||||
|
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
class SaveCookBook(CreateCookBook):
|
class SaveCookBook(CreateCookBook):
|
||||||
group_id: UUID4
|
group_id: UUID4
|
||||||
|
|
|
@ -62,6 +62,22 @@ def test_create_cookbook(api_client: TestClient, unique_user: TestUser):
|
||||||
assert response.status_code == 201
|
assert response.status_code == 201
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("name_input", ["", " ", "@"])
|
||||||
|
def test_create_cookbook_bad_name(api_client: TestClient, unique_user: TestUser, name_input: str):
|
||||||
|
data = {
|
||||||
|
"name": name_input,
|
||||||
|
"slug": name_input,
|
||||||
|
"description": "",
|
||||||
|
"position": 0,
|
||||||
|
"categories": [],
|
||||||
|
"group_id": str(unique_user.group_id),
|
||||||
|
"household_id": str(unique_user.household_id),
|
||||||
|
}
|
||||||
|
|
||||||
|
response = api_client.post(api_routes.households_cookbooks, json=data, headers=unique_user.token)
|
||||||
|
assert response.status_code == 422
|
||||||
|
|
||||||
|
|
||||||
def test_read_cookbook(api_client: TestClient, unique_user: TestUser, cookbooks: list[TestCookbook]):
|
def test_read_cookbook(api_client: TestClient, unique_user: TestUser, cookbooks: list[TestCookbook]):
|
||||||
sample = random.choice(cookbooks)
|
sample = random.choice(cookbooks)
|
||||||
response = api_client.get(api_routes.households_cookbooks_item_id(sample.id), headers=unique_user.token)
|
response = api_client.get(api_routes.households_cookbooks_item_id(sample.id), headers=unique_user.token)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue