101 lines
3.9 KiB
Python
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()
|