Files
Home_assistant/backend/tests/test_fitness_charts.py
T
2026-07-01 11:20:13 +03:00

87 lines
2.6 KiB
Python

from datetime import date
from app.fitness.charts import (
_resolve_chart_range,
build_fitness_charts,
linear_regression,
week_start,
)
def test_week_start_monday():
assert week_start(date(2026, 6, 13)) == date(2026, 6, 8)
def test_linear_regression_increasing():
points = [(0.0, 1.0), (1.0, 2.0), (2.0, 3.0)]
fit = linear_regression(points)
assert fit is not None
assert abs(fit["slope"] - 1.0) < 1e-9
assert abs(fit["intercept"] - 1.0) < 1e-9
def test_linear_regression_requires_two_points():
assert linear_regression([(0.0, 5.0)]) is None
assert linear_regression([]) is None
def test_resolve_chart_range_auto_no_data():
weeks, granularity, lookback, label, span = _resolve_chart_range(0, date(2026, 6, 18), None, 0)
assert weeks == 4
assert granularity == "day"
assert lookback == 7
assert label == "7 дней"
assert span == 0
def test_resolve_chart_range_auto_short_span():
first = date(2026, 6, 1)
end = date(2026, 6, 18)
weeks, granularity, lookback, label, span = _resolve_chart_range(0, end, first, 18)
assert granularity == "day"
assert span == 18
assert lookback == 18
assert "дн." in label
def test_resolve_chart_range_auto_long_span():
first = date(2026, 1, 1)
end = date(2026, 6, 18)
weeks, granularity, lookback, label, span = _resolve_chart_range(0, end, first, 60)
assert granularity == "week"
assert weeks >= 9
assert "нед." in label
assert span > 35
def test_build_fitness_charts_auto_granularity():
from datetime import datetime, timezone
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from app.db.models import Base, FoodLog, User
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
SessionLocal = sessionmaker(bind=engine)
with Session(engine) as db:
user = User(username="charts", api_token_hash="h")
db.add(user)
db.commit()
uid = user.id
day = date(2026, 6, 10)
db.add(
FoodLog(
user_id=uid,
description="lunch",
calories=500,
logged_at=datetime.combine(day, datetime.min.time(), tzinfo=timezone.utc),
)
)
db.commit()
result = build_fitness_charts(db, uid, weeks=0, end_day=day)
assert result["granularity"] == "day"
assert result["range_label"]
assert result["daily_series"] is not None