diff --git a/fooder/controller/meal.py b/fooder/controller/meal.py index b12cda8..42b0529 100644 --- a/fooder/controller/meal.py +++ b/fooder/controller/meal.py @@ -6,6 +6,7 @@ from ..model.meal import ( SaveMealPayload, CreateMealFromPresetPayload, ) +from ..model.preset import Preset from ..domain.meal import Meal as DBMeal from ..domain.diary import Diary as DBDiary from ..domain.preset import Preset as DBPreset @@ -30,15 +31,17 @@ class CreateMeal(AuthorizedController): class SaveMeal(AuthorizedController): - async def call(self, meal_id: id, payload: SaveMealPayload) -> None: + async def call(self, meal_id: id, payload: SaveMealPayload) -> Preset: async with self.async_session.begin() as session: meal = await DBMeal.get_by_id(session, self.user.id, meal_id) if meal is None: raise HTTPException(status_code=404, detail="meal not found") try: - await DBPreset.create( - session, user_id=self.user.id, name=payload.name, meal=meal + return Preset.from_orm( + await DBPreset.create( + session, user_id=self.user.id, name=payload.name, meal=meal + ) ) except AssertionError as e: raise HTTPException(status_code=400, detail=e.args[0]) diff --git a/fooder/domain/preset.py b/fooder/domain/preset.py index 6a1227e..27627ef 100644 --- a/fooder/domain/preset.py +++ b/fooder/domain/preset.py @@ -74,7 +74,9 @@ class Preset(Base, CommonMixin): raise RuntimeError() for entry in meal.entries: - PresetEntry.create(session, preset.id, entry) + await PresetEntry.create(session, preset.id, entry) + + return await cls.get(session, user_id, preset.id) @classmethod async def list_all( diff --git a/fooder/test/test_preset.py b/fooder/test/test_preset.py index de02222..a619910 100644 --- a/fooder/test/test_preset.py +++ b/fooder/test/test_preset.py @@ -3,7 +3,9 @@ import pytest @pytest.mark.dependency() -def test_create_meal(client, meal_payload_factory): +def test_create_meal( + client, meal_payload_factory, product_payload_factory, entry_payload_factory +): today = datetime.date.today().isoformat() response = client.get("diary", params={"date": today}) @@ -13,18 +15,35 @@ def test_create_meal(client, meal_payload_factory): response = client.post("meal", json=meal_payload_factory(diary_id, meal_order)) assert response.status_code == 200, response.json() + meal_id = response.json()["id"] + + product_id = client.post("product", json=product_payload_factory()).json()["id"] + + entry_payload = entry_payload_factory(meal_id, product_id, 100.0) + response = client.post("entry", json=entry_payload) + assert response.status_code == 200, response.json() + @pytest.mark.dependency(depends=["test_create_meal"]) def test_save_meal(client, meal_save_payload): today = datetime.date.today().isoformat() response = client.get("diary", params={"date": today}) - meal_id = response.json()["meals"][0]["id"] + meal = response.json()["meals"][0] + meal_id = meal["id"] save_payload = meal_save_payload(meal_id) response = client.post(f"meal/{meal_id}/save", json=save_payload) assert response.status_code == 200, response.json() + preset = response.json() + + for k, v in preset.items(): + if k in ("id", "name", "entries"): + continue + + assert meal[k] == v, f"{k} != {v}" + @pytest.mark.dependency(depends=["test_create_meal"]) def test_list_presets(client, meal_save_payload): diff --git a/fooder/view/meal.py b/fooder/view/meal.py index 13c0507..5fb62a4 100644 --- a/fooder/view/meal.py +++ b/fooder/view/meal.py @@ -1,4 +1,5 @@ from fastapi import APIRouter, Depends, Request +from ..model.preset import Preset from ..model.meal import ( Meal, CreateMealPayload, @@ -20,14 +21,14 @@ async def create_meal( return await contoller.call(data) -@router.post("/{meal_id}/save") +@router.post("/{meal_id}/save", response_model=Preset) async def save_meal( request: Request, meal_id: int, data: SaveMealPayload, contoller: SaveMeal = Depends(SaveMeal), ): - await contoller.call(meal_id, data) + return await contoller.call(meal_id, data) @router.post("/from_preset", response_model=Meal)