mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-08-05 13:35:23 +02:00
feat: Add Household Filter to Meal Plan Rules (#4231)
This commit is contained in:
parent
38502e82d4
commit
4712994242
13 changed files with 533 additions and 87 deletions
|
@ -1,8 +1,14 @@
|
|||
import random
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from uuid import UUID
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from mealie.schema.household.household import HouseholdSummary
|
||||
from mealie.schema.meal_plan.new_meal import CreatePlanEntry
|
||||
from mealie.schema.meal_plan.plan_rules import PlanRulesDay, PlanRulesOut, PlanRulesSave, PlanRulesType
|
||||
from mealie.schema.recipe.recipe import Recipe
|
||||
from mealie.schema.recipe.recipe_category import CategoryOut, CategorySave, TagOut, TagSave
|
||||
from tests.utils import api_routes
|
||||
from tests.utils.factories import random_string
|
||||
from tests.utils.fixture_schemas import TestUser
|
||||
|
@ -14,6 +20,39 @@ def route_all_slice(page: int, perPage: int, start_date: str, end_date: str):
|
|||
)
|
||||
|
||||
|
||||
def create_recipe(unique_user: TestUser, tags: list[TagOut] | None = None, categories: list[CategoryOut] | None = None):
|
||||
return unique_user.repos.recipes.create(
|
||||
Recipe(
|
||||
user_id=unique_user.user_id,
|
||||
group_id=UUID(unique_user.group_id),
|
||||
name=random_string(),
|
||||
tags=tags or [],
|
||||
recipe_category=categories or [],
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def create_rule(
|
||||
unique_user: TestUser,
|
||||
day: PlanRulesDay,
|
||||
entry_type: PlanRulesType,
|
||||
tags: list[TagOut] | None = None,
|
||||
categories: list[CategoryOut] | None = None,
|
||||
households: list[HouseholdSummary] | None = None,
|
||||
):
|
||||
return unique_user.repos.group_meal_plan_rules.create(
|
||||
PlanRulesSave(
|
||||
group_id=UUID(unique_user.group_id),
|
||||
household_id=UUID(unique_user.household_id),
|
||||
day=day,
|
||||
entry_type=entry_type,
|
||||
tags=tags or [],
|
||||
categories=categories or [],
|
||||
households=households or [],
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_create_mealplan_no_recipe(api_client: TestClient, unique_user: TestUser):
|
||||
title = random_string(length=25)
|
||||
text = random_string(length=25)
|
||||
|
@ -167,3 +206,128 @@ def test_get_mealplan_today(api_client: TestClient, unique_user: TestUser):
|
|||
|
||||
for meal_plan in response_json:
|
||||
assert meal_plan["date"] == datetime.now(timezone.utc).date().strftime("%Y-%m-%d")
|
||||
|
||||
|
||||
def test_get_mealplan_with_rules_categories_and_tags_filter(api_client: TestClient, unique_user: TestUser):
|
||||
tags = [
|
||||
unique_user.repos.tags.create(TagSave(name=random_string(), group_id=unique_user.group_id)) for _ in range(4)
|
||||
]
|
||||
categories = [
|
||||
unique_user.repos.categories.create(CategorySave(name=random_string(), group_id=unique_user.group_id))
|
||||
for _ in range(4)
|
||||
]
|
||||
[
|
||||
create_recipe(unique_user, tags=[tag], categories=[category])
|
||||
for tag, category in zip(tags, categories, strict=True)
|
||||
]
|
||||
[create_recipe(unique_user) for _ in range(5)]
|
||||
|
||||
i = random.randint(0, 3)
|
||||
tag = tags[i]
|
||||
category = categories[i]
|
||||
rule = create_rule(
|
||||
unique_user,
|
||||
day=PlanRulesDay.saturday,
|
||||
entry_type=PlanRulesType.breakfast,
|
||||
tags=[tag],
|
||||
categories=[category],
|
||||
)
|
||||
|
||||
try:
|
||||
payload = {"date": "2023-02-25", "entryType": "breakfast"}
|
||||
response = api_client.post(api_routes.households_mealplans_random, json=payload, headers=unique_user.token)
|
||||
assert response.status_code == 200
|
||||
recipe_data = response.json()["recipe"]
|
||||
assert recipe_data["tags"][0]["name"] == tag.name
|
||||
assert recipe_data["recipeCategory"][0]["name"] == category.name
|
||||
finally:
|
||||
unique_user.repos.group_meal_plan_rules.delete(rule.id)
|
||||
|
||||
|
||||
def test_get_mealplan_with_rules_date_and_type_filter(api_client: TestClient, unique_user: TestUser):
|
||||
tags = [
|
||||
unique_user.repos.tags.create(TagSave(name=random_string(), group_id=unique_user.group_id)) for _ in range(4)
|
||||
]
|
||||
recipes = [create_recipe(unique_user, tags=[tag]) for tag in tags]
|
||||
[create_recipe(unique_user) for _ in range(5)]
|
||||
|
||||
rules: list[PlanRulesOut] = []
|
||||
rules.append(
|
||||
create_rule(unique_user, day=PlanRulesDay.saturday, entry_type=PlanRulesType.breakfast, tags=[tags[0]])
|
||||
)
|
||||
rules.append(create_rule(unique_user, day=PlanRulesDay.saturday, entry_type=PlanRulesType.dinner, tags=[tags[1]]))
|
||||
rules.append(create_rule(unique_user, day=PlanRulesDay.sunday, entry_type=PlanRulesType.breakfast, tags=[tags[2]]))
|
||||
rules.append(create_rule(unique_user, day=PlanRulesDay.sunday, entry_type=PlanRulesType.dinner, tags=[tags[3]]))
|
||||
|
||||
try:
|
||||
payload = {"date": "2023-02-25", "entryType": "breakfast"}
|
||||
response = api_client.post(api_routes.households_mealplans_random, json=payload, headers=unique_user.token)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["recipe"]["slug"] == recipes[0].slug
|
||||
finally:
|
||||
for rule in rules:
|
||||
unique_user.repos.group_meal_plan_rules.delete(rule.id)
|
||||
|
||||
|
||||
def test_get_mealplan_with_rules_includes_other_households(
|
||||
api_client: TestClient, unique_user: TestUser, h2_user: TestUser
|
||||
):
|
||||
tag = h2_user.repos.tags.create(TagSave(name=random_string(), group_id=h2_user.group_id))
|
||||
recipe = create_recipe(h2_user, tags=[tag])
|
||||
rule = create_rule(unique_user, day=PlanRulesDay.saturday, entry_type=PlanRulesType.breakfast, tags=[tag])
|
||||
|
||||
try:
|
||||
payload = {"date": "2023-02-25", "entryType": "breakfast"}
|
||||
response = api_client.post(api_routes.households_mealplans_random, json=payload, headers=unique_user.token)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["recipe"]["slug"] == recipe.slug
|
||||
finally:
|
||||
unique_user.repos.group_meal_plan_rules.delete(rule.id)
|
||||
|
||||
|
||||
def test_get_mealplan_with_rules_households_filter(api_client: TestClient, unique_user: TestUser, h2_user: TestUser):
|
||||
tag = unique_user.repos.tags.create(TagSave(name=random_string(), group_id=unique_user.group_id))
|
||||
recipe = create_recipe(unique_user, tags=[tag])
|
||||
[create_recipe(h2_user, tags=[tag]) for _ in range(10)]
|
||||
|
||||
household = unique_user.repos.households.get_by_slug_or_id(unique_user.household_id)
|
||||
assert household
|
||||
|
||||
rule = create_rule(
|
||||
unique_user, day=PlanRulesDay.saturday, entry_type=PlanRulesType.breakfast, tags=[tag], households=[household]
|
||||
)
|
||||
|
||||
try:
|
||||
payload = {"date": "2023-02-25", "entryType": "breakfast"}
|
||||
response = api_client.post(api_routes.households_mealplans_random, json=payload, headers=unique_user.token)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["recipe"]["slug"] == recipe.slug
|
||||
finally:
|
||||
unique_user.repos.group_meal_plan_rules.delete(rule.id)
|
||||
|
||||
|
||||
def test_get_mealplan_with_rules_households_filter_includes_any_households(
|
||||
api_client: TestClient, unique_user: TestUser, h2_user: TestUser
|
||||
):
|
||||
tag = unique_user.repos.tags.create(TagSave(name=random_string(), group_id=unique_user.group_id))
|
||||
recipe = create_recipe(h2_user, tags=[tag])
|
||||
|
||||
household = unique_user.repos.households.get_by_slug_or_id(unique_user.household_id)
|
||||
assert household
|
||||
h2_household = unique_user.repos.households.get_by_slug_or_id(h2_user.household_id)
|
||||
assert h2_household
|
||||
rule = create_rule(
|
||||
unique_user,
|
||||
day=PlanRulesDay.saturday,
|
||||
entry_type=PlanRulesType.breakfast,
|
||||
tags=[tag],
|
||||
households=[household, h2_household],
|
||||
)
|
||||
|
||||
try:
|
||||
payload = {"date": "2023-02-25", "entryType": "breakfast"}
|
||||
response = api_client.post(api_routes.households_mealplans_random, json=payload, headers=unique_user.token)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["recipe"]["slug"] == recipe.slug
|
||||
finally:
|
||||
unique_user.repos.group_meal_plan_rules.delete(rule.id)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue