mirror of
https://github.com/sstent/foodplanner.git
synced 2026-03-14 09:15:24 +00:00
114 lines
3.6 KiB
Python
114 lines
3.6 KiB
Python
import pytest
|
|
from app.database import Food, TrackedMeal, TrackedMealFood, calculate_tracked_meal_nutrition
|
|
from sqlalchemy.orm import Session
|
|
|
|
def test_calculate_tracked_meal_nutrition_no_meal_template(db_session: Session):
|
|
"""Test nutrition calculation for a tracked meal with no parent meal template (meal_id=None)"""
|
|
# Create a food
|
|
food = Food(
|
|
name="Test Food",
|
|
serving_size=100.0,
|
|
serving_unit="g",
|
|
calories=100.0,
|
|
protein=10.0,
|
|
carbs=20.0,
|
|
fat=5.0,
|
|
fiber=5.0,
|
|
sugar=10.0,
|
|
sodium=100.0,
|
|
calcium=50.0
|
|
)
|
|
db_session.add(food)
|
|
db_session.commit()
|
|
db_session.refresh(food)
|
|
|
|
# Create a tracked meal without a template
|
|
tracked_meal = TrackedMeal(
|
|
meal_id=None,
|
|
meal_time="Snack",
|
|
name="Single Food Log"
|
|
)
|
|
db_session.add(tracked_meal)
|
|
db_session.commit()
|
|
db_session.refresh(tracked_meal)
|
|
|
|
# Add a tracked food entry to it
|
|
tracked_food = TrackedMealFood(
|
|
tracked_meal_id=tracked_meal.id,
|
|
food_id=food.id,
|
|
quantity=200.0, # 2 servings
|
|
is_override=False,
|
|
is_deleted=False
|
|
)
|
|
db_session.add(tracked_food)
|
|
db_session.commit()
|
|
db_session.refresh(tracked_food)
|
|
|
|
# Calculate nutrition
|
|
nutrition = calculate_tracked_meal_nutrition(tracked_meal, db_session)
|
|
|
|
# Assertions
|
|
assert nutrition['calories'] == 200.0
|
|
assert nutrition['protein'] == 20.0
|
|
assert nutrition['carbs'] == 40.0
|
|
assert nutrition['fat'] == 10.0
|
|
assert nutrition['fiber'] == 10.0
|
|
assert nutrition['sugar'] == 20.0
|
|
assert nutrition['sodium'] == 200.0
|
|
assert nutrition['calcium'] == 100.0
|
|
assert nutrition['net_carbs'] == 30.0
|
|
assert nutrition['protein_pct'] == 40.0 # (20 * 4) / 200 = 80 / 200 = 40%
|
|
assert nutrition['carbs_pct'] == 80.0 # (40 * 4) / 200 = 160 / 200 = 80%
|
|
assert nutrition['fat_pct'] == 45.0 # (10 * 9) / 200 = 90 / 200 = 45%
|
|
|
|
def test_tracker_add_food_api_no_new_meal(client, db_session: Session):
|
|
"""Test /tracker/add_food endpoint to ensure it doesn't create redundant Meal templates"""
|
|
# Create a food
|
|
food = Food(
|
|
name="API Test Food",
|
|
serving_size=100.0,
|
|
serving_unit="g",
|
|
calories=100.0,
|
|
protein=10.0,
|
|
carbs=20.0,
|
|
fat=5.0
|
|
)
|
|
db_session.add(food)
|
|
db_session.commit()
|
|
db_session.refresh(food)
|
|
|
|
from app.database import Meal
|
|
initial_meal_count = db_session.query(Meal).count()
|
|
|
|
# Call the API
|
|
response = client.post("/tracker/add_food", json={
|
|
"person": "Sarah",
|
|
"date": "2025-02-24",
|
|
"food_id": food.id,
|
|
"quantity": 150.0,
|
|
"meal_time": "Snack"
|
|
})
|
|
|
|
assert response.status_code == 200
|
|
assert response.json()["status"] == "success"
|
|
|
|
# Verify NO new Meal was created
|
|
assert db_session.query(Meal).count() == initial_meal_count
|
|
|
|
# Verify TrackedMeal exists with meal_id=None and correct name
|
|
from app.database import TrackedMeal, TrackedDay
|
|
tracked_day = db_session.query(TrackedDay).filter(TrackedDay.date == "2025-02-24").first()
|
|
assert tracked_day is not None
|
|
|
|
tracked_meal = db_session.query(TrackedMeal).filter(TrackedMeal.tracked_day_id == tracked_day.id).first()
|
|
assert tracked_meal is not None
|
|
assert tracked_meal.meal_id is None
|
|
assert tracked_meal.name == "API Test Food"
|
|
|
|
# Verify TrackedMealFood exists
|
|
from app.database import TrackedMealFood
|
|
tmf = db_session.query(TrackedMealFood).filter(TrackedMealFood.tracked_meal_id == tracked_meal.id).first()
|
|
assert tmf is not None
|
|
assert tmf.food_id == food.id
|
|
assert tmf.quantity == 150.0
|