Files
Home_assistant/backend/tests/test_fitness_log_editor.py
T
2026-06-22 06:50:13 +00:00

101 lines
3.9 KiB
Python

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