mirror of
https://github.com/sstent/foodplanner.git
synced 2025-12-05 23:51:46 +00:00
185 lines
6.5 KiB
Python
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
|