mirror of
https://github.com/sstent/foodplanner.git
synced 2025-12-06 08:01:47 +00:00
sync - build workin
This commit is contained in:
184
tests/test_plans.py
Normal file
184
tests/test_plans.py
Normal file
@@ -0,0 +1,184 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user