81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
import unittest
|
|
from datetime import date, timedelta
|
|
|
|
from app.fitness.calculators import (
|
|
compute_daily_targets,
|
|
compute_expected_targets,
|
|
resolve_expected_activity,
|
|
)
|
|
|
|
PROFILE_LOSE = {
|
|
"sex": "male",
|
|
"age": 30,
|
|
"height_cm": 180,
|
|
"weight_kg": 86,
|
|
"goal": "lose",
|
|
"neat_base_kcal": 200,
|
|
"activity_level": "moderate",
|
|
"weekly_workouts": 3,
|
|
"baseline_steps": None,
|
|
"baseline_workout_kcal": None,
|
|
}
|
|
|
|
|
|
class ExpectedActivityTests(unittest.TestCase):
|
|
def test_weekly_avg_with_enough_history(self) -> None:
|
|
history = [
|
|
{"steps": 8000, "workout_kcal": 400.0},
|
|
{"steps": 9000, "workout_kcal": 500.0},
|
|
{"steps": 7000, "workout_kcal": 450.0},
|
|
{"steps": 0, "workout_kcal": 0.0},
|
|
]
|
|
steps, workout_kcal, source, days = resolve_expected_activity(PROFILE_LOSE, history=history)
|
|
self.assertEqual(source, "weekly_avg")
|
|
self.assertEqual(days, 3)
|
|
self.assertEqual(steps, 6000)
|
|
self.assertEqual(workout_kcal, 337.5)
|
|
|
|
def test_baseline_fallback(self) -> None:
|
|
profile = {
|
|
**PROFILE_LOSE,
|
|
"baseline_steps": 10000,
|
|
"baseline_workout_kcal": 2100.0,
|
|
}
|
|
history = [{"steps": 1000, "workout_kcal": 50.0}]
|
|
steps, workout_kcal, source, _ = resolve_expected_activity(profile, history=history)
|
|
self.assertEqual(source, "baseline")
|
|
self.assertEqual(steps, 10000)
|
|
self.assertEqual(workout_kcal, 300.0)
|
|
|
|
def test_defaults_fallback(self) -> None:
|
|
history = [{"steps": 0, "workout_kcal": 0.0}] * 7
|
|
steps, workout_kcal, source, _ = resolve_expected_activity(PROFILE_LOSE, history=history)
|
|
self.assertEqual(source, "defaults")
|
|
self.assertEqual(steps, 8000)
|
|
self.assertAlmostEqual(workout_kcal, 150.0, delta=0.1)
|
|
|
|
def test_history_excludes_current_day_for_expected(self) -> None:
|
|
"""Expected for day D uses only prior days in history list."""
|
|
day = date(2026, 6, 16)
|
|
prior_days = []
|
|
cursor = day - timedelta(days=7)
|
|
while cursor < day:
|
|
prior_days.append({"steps": 8000, "workout_kcal": 450.0})
|
|
cursor += timedelta(days=1)
|
|
expected = compute_expected_targets(PROFILE_LOSE, history=prior_days)
|
|
rest = compute_daily_targets(PROFILE_LOSE, steps_total=0, workouts=[])
|
|
self.assertEqual(expected["source"], "weekly_avg")
|
|
self.assertGreater(expected["tdee"], rest["tdee"])
|
|
self.assertGreater(expected["carbs_g"], rest["carbs_g"])
|
|
|
|
def test_morning_carbs_scenario(self) -> None:
|
|
rest = compute_daily_targets(PROFILE_LOSE, steps_total=0, workouts=[])
|
|
history = [{"steps": 8000, "workout_kcal": 450.0}] * 7
|
|
expected = compute_expected_targets(PROFILE_LOSE, history=history)
|
|
self.assertLess(rest["carbs_g"], 10)
|
|
self.assertGreater(expected["carbs_g"], 100)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|