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

185 lines
6.5 KiB
Python

"""
Tests for Plans CRUD operations
"""
import pytest
from datetime import date, timedelta
class TestPlansRoutes:
"""Test plan-related routes"""
def test_get_plan_page(self, client):
"""Test GET /plan page"""
response = client.get("/plan?person=Sarah")
assert response.status_code == 200
assert b"Plan" in response.content or b"plan" in response.content
def test_get_plan_page_with_date(self, client):
"""Test GET /plan page with specific date"""
test_date = date.today().isoformat()
response = client.get(f"/plan?person=Stuart&week_start_date={test_date}")
assert response.status_code == 200
def test_add_to_plan(self, client, sample_meal):
"""Test POST /plan/add"""
test_date = date.today().isoformat()
response = client.post("/plan/add", data={
"person": "Sarah",
"plan_date": test_date,
"meal_id": str(sample_meal.id),
"meal_time": "Breakfast"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_add_to_plan_missing_fields(self, client):
"""Test adding to plan with missing fields"""
response = client.post("/plan/add", data={
"person": "Sarah"
# Missing plan_date, meal_id, meal_time
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
def test_add_to_plan_invalid_meal(self, client):
"""Test adding non-existent meal to plan"""
test_date = date.today().isoformat()
response = client.post("/plan/add", data={
"person": "Sarah",
"plan_date": test_date,
"meal_id": "99999",
"meal_time": "Breakfast"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
def test_get_day_plan(self, client, sample_plan):
"""Test GET /plan/{person}/{date}"""
test_date = sample_plan.date.isoformat()
response = client.get(f"/plan/{sample_plan.person}/{test_date}")
assert response.status_code == 200
data = response.json()
assert "meals" in data
assert "day_totals" in data
assert isinstance(data["meals"], list)
def test_get_day_plan_empty(self, client):
"""Test getting plan for day with no meals"""
future_date = (date.today() + timedelta(days=365)).isoformat()
response = client.get(f"/plan/Sarah/{future_date}")
assert response.status_code == 200
data = response.json()
assert "meals" in data
assert len(data["meals"]) == 0
def test_update_day_plan(self, client, sample_meal):
"""Test POST /plan/update_day"""
test_date = date.today().isoformat()
response = client.post("/plan/update_day", data={
"person": "Stuart",
"date": test_date,
"meal_ids": f"{sample_meal.id}"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_update_day_plan_multiple_meals(self, client, sample_meal, sample_foods, db_session):
"""Test updating plan with multiple meals"""
from main import Meal
# Create another meal
meal2 = Meal(name="Second Meal", meal_type="lunch", meal_time="Lunch")
db_session.add(meal2)
db_session.commit()
db_session.refresh(meal2)
test_date = date.today().isoformat()
response = client.post("/plan/update_day", data={
"person": "Sarah",
"date": test_date,
"meal_ids": f"{sample_meal.id},{meal2.id}"
})
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_remove_from_plan(self, client, sample_plan):
"""Test DELETE /plan/{plan_id}"""
response = client.delete(f"/plan/{sample_plan.id}")
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
def test_remove_nonexistent_plan(self, client):
"""Test removing non-existent plan"""
response = client.delete("/plan/99999")
assert response.status_code == 200
data = response.json()
assert data["status"] == "error"
class TestPlanNavigation:
"""Test plan navigation functionality"""
def test_plan_week_navigation(self, client, sample_meal):
"""Test navigating between weeks"""
# Get current week
response = client.get("/plan?person=Sarah")
assert response.status_code == 200
# Add meal to today
test_date = date.today().isoformat()
client.post("/plan/add", data={
"person": "Sarah",
"plan_date": test_date,
"meal_id": str(sample_meal.id),
"meal_time": "Breakfast"
})
# Get next week
next_week = (date.today() + timedelta(days=7)).isoformat()
response = client.get(f"/plan?person=Sarah&week_start_date={next_week}")
assert response.status_code == 200
# Get previous week
prev_week = (date.today() - timedelta(days=7)).isoformat()
response = client.get(f"/plan?person=Sarah&week_start_date={prev_week}")
assert response.status_code == 200
class TestDayNutrition:
"""Test day nutrition calculations"""
def test_calculate_day_nutrition(self, client, sample_plan, db_session):
"""Test day nutrition calculation"""
from main import calculate_day_nutrition, Plan
plans = db_session.query(Plan).filter(
Plan.person == sample_plan.person,
Plan.date == sample_plan.date
).all()
nutrition = calculate_day_nutrition(plans, db_session)
assert "calories" in nutrition
assert "protein" in nutrition
assert "carbs" in nutrition
assert "fat" in nutrition
assert "protein_pct" in nutrition
assert "carbs_pct" in nutrition
assert "fat_pct" in nutrition
def test_empty_day_nutrition(self, db_session):
"""Test nutrition calculation for day with no meals"""
from main import calculate_day_nutrition
nutrition = calculate_day_nutrition([], db_session)
assert nutrition["calories"] == 0
assert nutrition["protein"] == 0
assert nutrition["protein_pct"] == 0