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) 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) 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) assert granularity == "week" assert weeks >= 20 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