mirror of
https://github.com/sstent/foodplanner.git
synced 2025-12-06 08:01:47 +00:00
updated the tracker to have more features
This commit is contained in:
@@ -3,6 +3,10 @@ Tests for Tracker CRUD operations
|
||||
"""
|
||||
import pytest
|
||||
from datetime import date, timedelta
|
||||
from app.database import (
|
||||
TrackedDay, TrackedMeal, TrackedMealFood, Meal, MealFood, Food,
|
||||
Template, calculate_day_nutrition_tracked
|
||||
)
|
||||
|
||||
|
||||
class TestTrackerRoutes:
|
||||
@@ -49,7 +53,6 @@ class TestTrackerRoutes:
|
||||
|
||||
def test_tracker_remove_meal(self, client, sample_tracked_day, db_session):
|
||||
"""Test DELETE /tracker/remove_meal/{tracked_meal_id}"""
|
||||
from main import TrackedMeal
|
||||
|
||||
tracked_meal = db_session.query(TrackedMeal).filter(
|
||||
TrackedMeal.tracked_day_id == sample_tracked_day.id
|
||||
@@ -122,7 +125,6 @@ class TestTrackerTemplates:
|
||||
|
||||
def test_tracker_apply_empty_template(self, client, db_session):
|
||||
"""Test applying template with no meals"""
|
||||
from main import Template
|
||||
|
||||
empty_template = Template(name="Empty Tracker Template")
|
||||
db_session.add(empty_template)
|
||||
@@ -171,7 +173,6 @@ class TestTrackerNutrition:
|
||||
|
||||
def test_calculate_tracked_day_nutrition(self, client, sample_tracked_day, db_session):
|
||||
"""Test tracked day nutrition calculation"""
|
||||
from main import calculate_day_nutrition_tracked, TrackedMeal
|
||||
|
||||
tracked_meals = db_session.query(TrackedMeal).filter(
|
||||
TrackedMeal.tracked_day_id == sample_tracked_day.id
|
||||
@@ -187,7 +188,6 @@ class TestTrackerNutrition:
|
||||
|
||||
def test_tracked_day_with_quantity_multiplier(self, client, sample_meal, db_session):
|
||||
"""Test nutrition calculation with quantity multiplier"""
|
||||
from main import TrackedDay, TrackedMeal, calculate_day_nutrition_tracked
|
||||
|
||||
# Create tracked day with meal at 2x quantity
|
||||
tracked_day = TrackedDay(
|
||||
@@ -213,3 +213,184 @@ class TestTrackerNutrition:
|
||||
|
||||
# Should be double the base meal nutrition
|
||||
assert nutrition["calories"] > 0
|
||||
|
||||
|
||||
class TestTrackerView:
|
||||
"""Test tracker view rendering"""
|
||||
|
||||
def test_tracker_page_shows_food_breakdown(self, client, sample_meal, sample_food, db_session):
|
||||
"""Test that tracker page shows food breakdown for tracked meals"""
|
||||
|
||||
# Create sample tracked day and meal
|
||||
tracked_day = TrackedDay(person="Sarah", date=date.today(), is_modified=True)
|
||||
db_session.add(tracked_day)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_day)
|
||||
|
||||
# Add the meal to tracker (assuming meal has the food)
|
||||
tracked_meal = TrackedMeal(
|
||||
tracked_day_id=tracked_day.id,
|
||||
meal_id=sample_meal.id,
|
||||
meal_time="Breakfast",
|
||||
quantity=1.0
|
||||
)
|
||||
db_session.add(tracked_meal)
|
||||
db_session.commit()
|
||||
|
||||
# Get tracker page
|
||||
response = client.get(f"/tracker?person=Sarah")
|
||||
assert response.status_code == 200
|
||||
|
||||
# Check if food name appears in the response (breakdown should show it)
|
||||
assert sample_food.name.encode() in response.content
|
||||
|
||||
|
||||
class TestTrackerEdit:
|
||||
"""Test editing tracked meals"""
|
||||
|
||||
def test_update_tracked_food_quantity(self, client, sample_meal, sample_food, db_session):
|
||||
"""Test updating quantity of a custom food in a tracked meal"""
|
||||
|
||||
# Create sample tracked day and meal
|
||||
tracked_day = TrackedDay(person="Sarah", date=date.today(), is_modified=True)
|
||||
db_session.add(tracked_day)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_day)
|
||||
|
||||
tracked_meal = TrackedMeal(
|
||||
tracked_day_id=tracked_day.id,
|
||||
meal_id=sample_meal.id,
|
||||
meal_time="Breakfast",
|
||||
quantity=1.0
|
||||
)
|
||||
db_session.add(tracked_meal)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_meal)
|
||||
|
||||
# Add a custom tracked food
|
||||
tracked_food = TrackedMealFood(
|
||||
tracked_meal_id=tracked_meal.id,
|
||||
food_id=sample_food.id,
|
||||
quantity=2.0,
|
||||
is_override=True
|
||||
)
|
||||
db_session.add(tracked_food)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_food)
|
||||
|
||||
original_quantity = tracked_food.quantity
|
||||
|
||||
# Update the food quantity via API
|
||||
response = client.post("/tracker/update_tracked_food", json={
|
||||
"tracked_food_id": tracked_food.id,
|
||||
"quantity": 3.0
|
||||
})
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["status"] == "success"
|
||||
|
||||
# Verify the update
|
||||
db_session.commit()
|
||||
updated_food = db_session.query(TrackedMealFood).get(tracked_food.id)
|
||||
assert updated_food.quantity == 3.0
|
||||
assert updated_food.quantity != original_quantity
|
||||
|
||||
|
||||
class TestTrackerSaveAsNewMeal:
|
||||
"""Test saving an edited tracked meal as a new meal"""
|
||||
|
||||
def test_save_as_new_meal(self, client, sample_meal, sample_food, db_session):
|
||||
"""Test POST /tracker/save_as_new_meal"""
|
||||
|
||||
# Create a tracked day and meal with custom foods
|
||||
tracked_day = TrackedDay(person="Sarah", date=date.today(), is_modified=True)
|
||||
db_session.add(tracked_day)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_day)
|
||||
|
||||
tracked_meal = TrackedMeal(
|
||||
tracked_day_id=tracked_day.id,
|
||||
meal_id=sample_meal.id,
|
||||
meal_time="Breakfast",
|
||||
quantity=1.0
|
||||
)
|
||||
db_session.add(tracked_meal)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_meal)
|
||||
|
||||
# Add a custom food to the tracked meal
|
||||
tracked_food = TrackedMealFood(
|
||||
tracked_meal_id=tracked_meal.id,
|
||||
food_id=sample_food.id,
|
||||
quantity=2.5,
|
||||
is_override=False # This is an addition, not an override for this test
|
||||
)
|
||||
db_session.add(tracked_food)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_food)
|
||||
|
||||
new_meal_name = "My Custom Breakfast"
|
||||
|
||||
response = client.post("/tracker/save_as_new_meal", json={
|
||||
"tracked_meal_id": tracked_meal.id,
|
||||
"new_meal_name": new_meal_name,
|
||||
"foods": [
|
||||
{"food_id": sample_food.id, "quantity": 3.0}
|
||||
]
|
||||
})
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["status"] == "success"
|
||||
assert "new_meal_id" in data
|
||||
|
||||
# Verify a new meal was created
|
||||
new_meal = db_session.query(Meal).filter(Meal.name == new_meal_name).first()
|
||||
assert new_meal is not None
|
||||
assert len(new_meal.meal_foods) == 1 # Only the custom food should be here
|
||||
|
||||
# Verify the original tracked meal now points to the new meal
|
||||
db_session.commit()
|
||||
updated_tracked_meal = db_session.query(TrackedMeal).get(tracked_meal.id)
|
||||
assert updated_tracked_meal.meal_id == new_meal.id
|
||||
assert len(updated_tracked_meal.tracked_foods) == 0 # Custom foods should be moved to the new meal
|
||||
|
||||
|
||||
class TestTrackerAddFood:
|
||||
"""Test adding a single food directly to the tracker"""
|
||||
|
||||
def test_add_food_to_tracker(self, client, sample_food, db_session):
|
||||
"""Test POST /tracker/add_food"""
|
||||
|
||||
# Create a tracked day
|
||||
tracked_day = TrackedDay(person="Sarah", date=date.today(), is_modified=False)
|
||||
db_session.add(tracked_day)
|
||||
db_session.commit()
|
||||
db_session.refresh(tracked_day)
|
||||
|
||||
# Add food directly to tracker
|
||||
response = client.post("/tracker/add_food", json={
|
||||
"person": "Sarah",
|
||||
"date": date.today().isoformat(),
|
||||
"food_id": sample_food.id,
|
||||
"quantity": 100.0,
|
||||
"meal_time": "Snack 1"
|
||||
})
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["status"] == "success"
|
||||
|
||||
# Verify that a new tracked meal was created with the food
|
||||
tracked_meals = db_session.query(TrackedMeal).filter(
|
||||
TrackedMeal.tracked_day_id == tracked_day.id,
|
||||
TrackedMeal.meal_time == "Snack 1"
|
||||
).all()
|
||||
assert len(tracked_meals) == 1
|
||||
|
||||
tracked_meal = tracked_meals[0]
|
||||
assert tracked_meal.meal.name == sample_food.name # The meal name should be the food name
|
||||
assert tracked_meal.quantity == 1.0 # The meal quantity should be 1.0
|
||||
|
||||
# Verify the food is in the tracked meal's foods
|
||||
assert len(tracked_meal.meal.meal_foods) == 1
|
||||
assert tracked_meal.meal.meal_foods[0].food_id == sample_food.id
|
||||
assert tracked_meal.meal.meal_foods[0].quantity == 100.0
|
||||
|
||||
Reference in New Issue
Block a user