87 lines
2.6 KiB
Python
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
|