import unittest from datetime import date, datetime, time, timezone from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from app.db.models import Base, FoodLog, User from app.fitness.service import FitnessService class FitnessLogEditorTests(unittest.TestCase): def setUp(self) -> None: self.engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(self.engine) self.Session = sessionmaker(bind=self.engine) with Session(self.engine) as db: user = User(username="u1", api_token_hash="x") db.add(user) db.commit() self.user_id = user.id def _service(self) -> FitnessService: return FitnessService(Session(self.engine), self.user_id) def test_log_steps_replace_clears_same_day(self) -> None: svc = self._service() day = date(2026, 6, 18) svc.log_steps(3000, day=day) svc.log_steps(5000, day=day, replace=True) summary = svc.get_daily_summary(day) self.assertEqual(summary["steps_total"], 5000) self.assertEqual(len(summary["steps"]), 1) def test_delete_last_water(self) -> None: svc = self._service() day = datetime.now(timezone.utc).date() svc.log_water(200) svc.log_water(300) result = svc.delete_last_log("water", day=day) self.assertIsNotNone(result) assert result is not None self.assertEqual(result["deleted"]["amount_ml"], 300) summary = svc.get_daily_summary(day) self.assertEqual(summary["totals"]["water_ml"], 200) def test_merge_food_logs(self) -> None: svc = self._service() a = svc.log_meal(description="Овсянка", calories=300, protein_g=10, fat_g=5, carbs_g=40, fiber_g=4) b = svc.log_meal(description="Яблоко", calories=80, protein_g=0, fat_g=0, carbs_g=20, fiber_g=3) merged = svc.merge_food_logs(a["meal"]["id"], b["meal"]["id"]) self.assertIsNotNone(merged) assert merged is not None self.assertEqual(merged["merged"]["calories"], 380) self.assertEqual(merged["merged"]["protein_g"], 10) self.assertIn("Овсянка", merged["merged"]["description"]) self.assertIn("Яблоко", merged["merged"]["description"]) def test_compare_days(self) -> None: svc = self._service() d1 = date(2026, 6, 17) d2 = date(2026, 6, 18) with Session(self.engine) as db: db.add( FoodLog( user_id=self.user_id, description="Обед", calories=600, logged_at=datetime.combine(d1, time(12), tzinfo=timezone.utc), ) ) db.add( FoodLog( user_id=self.user_id, description="Ужин", calories=400, logged_at=datetime.combine(d2, time(12), tzinfo=timezone.utc), ) ) db.commit() result = svc.compare_days([d1, d2]) self.assertTrue(result["ok"]) self.assertEqual(len(result["days"]), 2) self.assertEqual(result["days"][0]["totals"]["calories"], 600) self.assertEqual(result["days"][1]["totals"]["calories"], 400) def test_update_food_log(self) -> None: svc = self._service() created = svc.log_meal(description="Суп", calories=200, protein_g=8, fat_g=6, carbs_g=20, fiber_g=2) updated = svc.update_food_log( created["meal"]["id"], {"calories": 250, "protein_g": 12, "estimated": False}, ) self.assertIsNotNone(updated) assert updated is not None self.assertEqual(updated["meal"]["calories"], 250) self.assertFalse(updated["meal"]["estimated"]) if __name__ == "__main__": unittest.main()