Files
foodplanner/tests/test_charts.py
2025-10-01 14:36:42 -07:00

112 lines
3.1 KiB
Python

import pytest
from datetime import date, timedelta
from app.database import TrackedDay, TrackedMeal, Meal, MealFood, Food, calculate_day_nutrition_tracked
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
@pytest.fixture
def sample_chart_data(db_session):
"""Create sample tracked data for chart testing"""
# Create sample food
food = Food(
name="Sample 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)
# Create sample meal
meal = Meal(
name="Sample Meal",
meal_type="breakfast",
meal_time="Breakfast"
)
db_session.add(meal)
db_session.commit()
db_session.refresh(meal)
# Link meal to food
meal_food = MealFood(
meal_id=meal.id,
food_id=food.id,
quantity=100.0
)
db_session.add(meal_food)
db_session.commit()
# Create tracked days
person = "Sarah"
today = date.today()
tracked_days = []
for i in range(3): # Last 3 days
tracked_date = today - timedelta(days=i)
tracked_day = TrackedDay(
person=person,
date=tracked_date,
is_modified=False
)
db_session.add(tracked_day)
db_session.commit()
db_session.refresh(tracked_day)
# Add a tracked meal
tracked_meal = TrackedMeal(
tracked_day_id=tracked_day.id,
meal_id=meal.id,
meal_time="Breakfast"
)
db_session.add(tracked_meal)
db_session.commit()
tracked_days.append(tracked_day)
return tracked_days, meal
def test_get_charts_data(client, db_session, sample_chart_data):
"""Test the charts data endpoint returns correct calorie data"""
tracked_days, meal = sample_chart_data
# Expected calories: 100 per day
expected_data = [
{
"date": tracked_days[0].date.isoformat(),
"calories": 100.0
},
{
"date": tracked_days[1].date.isoformat(),
"calories": 100.0
},
{
"date": tracked_days[2].date.isoformat(),
"calories": 100.0
}
]
response = client.get("/api/charts?person=Sarah&days=3")
assert response.status_code == 200
data = response.json()
# Sort by date descending
data_sorted = sorted(data, key=lambda x: x["date"], reverse=True)
assert data_sorted == expected_data
def test_get_charts_data_default_days(client, db_session, sample_chart_data):
"""Test default days parameter"""
response = client.get("/api/charts?person=Sarah")
assert response.status_code == 200
data = response.json()
assert len(data) == 3 # Should return last 3 days
def test_get_charts_data_no_data(client, db_session):
"""Test endpoint when no tracked data exists"""
response = client.get("/api/charts?person=Sarah&days=7")
assert response.status_code == 200
data = response.json()
assert data == [] # Empty list if no data