85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
import unittest
|
|
|
|
from app.fitness.activity_budget import (
|
|
compute_activity_bonus,
|
|
scale_targets,
|
|
steps_bonus_kcal,
|
|
)
|
|
|
|
|
|
PROFILE = {
|
|
"weight_kg": 70,
|
|
"activity_level": "moderate",
|
|
"weekly_workouts": 3,
|
|
"calorie_target": 2000,
|
|
"protein_g": 126,
|
|
"fat_g": 56,
|
|
"carbs_g": 250,
|
|
"water_l": 2.5,
|
|
}
|
|
|
|
|
|
class ActivityBudgetTests(unittest.TestCase):
|
|
def test_no_bonus_at_baseline(self) -> None:
|
|
bonus = compute_activity_bonus(
|
|
PROFILE,
|
|
steps_total=9000,
|
|
workouts=[{"active_calories": 85}],
|
|
)
|
|
self.assertEqual(bonus.steps_bonus_kcal, 0.0)
|
|
self.assertEqual(bonus.workout_bonus_kcal, 0.0)
|
|
self.assertEqual(bonus.total_bonus_kcal, 0.0)
|
|
self.assertEqual(bonus.scale_factor, 1.0)
|
|
|
|
def test_steps_and_workout_bonus(self) -> None:
|
|
bonus = compute_activity_bonus(
|
|
PROFILE,
|
|
steps_total=21800,
|
|
workouts=[{"active_calories": 155}],
|
|
)
|
|
self.assertGreater(bonus.steps_bonus_kcal, 0)
|
|
self.assertGreater(bonus.workout_bonus_kcal, 0)
|
|
self.assertEqual(
|
|
bonus.total_bonus_kcal,
|
|
round(bonus.steps_bonus_kcal + bonus.workout_bonus_kcal, 1),
|
|
)
|
|
self.assertGreater(bonus.scale_factor, 1.0)
|
|
|
|
def test_steps_bonus_formula(self) -> None:
|
|
kcal = steps_bonus_kcal(steps=21800, baseline_steps=9000, weight_kg=70)
|
|
self.assertEqual(kcal, round(12800 * 70 * 0.0005, 1))
|
|
|
|
def test_proportional_macro_scale(self) -> None:
|
|
base = {
|
|
"calories": 2000,
|
|
"protein_g": 100,
|
|
"fat_g": 50,
|
|
"carbs_g": 200,
|
|
"water_ml": 2500,
|
|
}
|
|
effective, targets_base = scale_targets(base, 500)
|
|
self.assertEqual(effective["calories"], 2500)
|
|
self.assertEqual(targets_base, base)
|
|
self.assertEqual(effective["water_ml"], 2500)
|
|
ratio = effective["calories"] / base["calories"]
|
|
self.assertAlmostEqual(effective["protein_g"] / base["protein_g"], ratio, places=1)
|
|
self.assertAlmostEqual(effective["fat_g"] / base["fat_g"], ratio, places=1)
|
|
self.assertAlmostEqual(effective["carbs_g"] / base["carbs_g"], ratio, places=1)
|
|
|
|
def test_floor_at_base_when_no_activity(self) -> None:
|
|
effective, _ = scale_targets(
|
|
{
|
|
"calories": 2045,
|
|
"protein_g": 156,
|
|
"fat_g": 57,
|
|
"carbs_g": 227,
|
|
"water_ml": 2900,
|
|
},
|
|
0,
|
|
)
|
|
self.assertEqual(effective["calories"], 2045)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|