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()