Files
foodplanner/test_tracker.py
2025-09-29 09:08:24 -07:00

216 lines
7.8 KiB
Python

"""
Tests for Tracker CRUD operations
"""
import pytest
from datetime import date, timedelta
class TestTrackerRoutes:
"""Test tracker-related routes"""
def test_get_tracker_page(self, client):
"""Test GET /tracker page"""
response = client.get("/tracker?person=Sarah")
assert response.status_code == 200
assert b"Tracker" in response.content or b"tracker" in response.content
def test_get_tracker_page_with_date(self, client):
"""Test GET /tracker page with specific date"""
test_date = date.today().isoformat()
response = client.get(f"/tracker?person=Stuart&date={test_date}")
assert response.status_code == 200
def test_tracker_add_meal(self, client, sample_meal):
"""Test POST /tracker/add_meal"""
test_date = date.today().isoformat()
response = client.post("/tracker/add_meal", data={
"person": "Sarah",
"date": test_date,
"meal_id": str(sample_meal.id),
"meal_time": "Breakfast",
"quantity": "1.5"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_tracker_add_meal_default_quantity(self, client, sample_meal):
"""Test adding meal with default quantity"""
test_date = date.today().isoformat()
response = client.post("/tracker/add_meal", data={
"person": "Stuart",
"date": test_date,
"meal_id": str(sample_meal.id),
"meal_time": "Lunch"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
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
).first()
if tracked_meal:
response = client.delete(f"/tracker/remove_meal/{tracked_meal.id}")
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_tracker_remove_nonexistent_meal(self, client):
"""Test removing non-existent tracked meal"""
response = client.delete("/tracker/remove_meal/99999")
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
class TestTrackerTemplates:
"""Test tracker template functionality"""
def test_tracker_save_template(self, client, sample_tracked_day):
"""Test POST /tracker/save_template"""
test_date = sample_tracked_day.date.isoformat()
response = client.post("/tracker/save_template", data={
"person": sample_tracked_day.person,
"date": test_date,
"template_name": "New Saved Template"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_tracker_save_template_no_meals(self, client):
"""Test saving template from day with no meals"""
future_date = (date.today() + timedelta(days=365)).isoformat()
response = client.post("/tracker/save_template", data={
"person": "Sarah",
"date": future_date,
"template_name": "Empty Template"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
def test_tracker_apply_template(self, client, sample_template):
"""Test POST /tracker/apply_template"""
test_date = date.today().isoformat()
response = client.post("/tracker/apply_template", data={
"person": "Sarah",
"date": test_date,
"template_id": str(sample_template.id)
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_tracker_apply_nonexistent_template(self, client):
"""Test applying non-existent template"""
test_date = date.today().isoformat()
response = client.post("/tracker/apply_template", data={
"person": "Sarah",
"date": test_date,
"template_id": "99999"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
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)
db_session.commit()
db_session.refresh(empty_template)
test_date = date.today().isoformat()
response = client.post("/tracker/apply_template", data={
"person": "Sarah",
"date": test_date,
"template_id": str(empty_template.id)
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
class TestTrackerReset:
"""Test tracker reset functionality"""
def test_tracker_reset_to_plan(self, client, sample_tracked_day):
"""Test POST /tracker/reset_to_plan"""
test_date = sample_tracked_day.date.isoformat()
response = client.post("/tracker/reset_to_plan", data={
"person": sample_tracked_day.person,
"date": test_date
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_tracker_reset_nonexistent_day(self, client):
"""Test resetting non-existent tracked day"""
future_date = (date.today() + timedelta(days=365)).isoformat()
response = client.post("/tracker/reset_to_plan", data={
"person": "Sarah",
"date": future_date
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
class TestTrackerNutrition:
"""Test tracker nutrition calculations"""
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
).all()
nutrition = calculate_day_nutrition_tracked(tracked_meals, db_session)
assert "calories" in nutrition
assert "protein" in nutrition
assert "carbs" in nutrition
assert "fat" in nutrition
assert nutrition["calories"] >= 0
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(
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=2.0
)
db_session.add(tracked_meal)
db_session.commit()
tracked_meals = [tracked_meal]
nutrition = calculate_day_nutrition_tracked(tracked_meals, db_session)
# Should be double the base meal nutrition
assert nutrition["calories"] > 0