Files
openrun/tests/unit/test_weekly_tiz.py
2026-05-19 08:34:22 -04:00

75 lines
2.7 KiB
Python

"""Tests for `weekly_time_in_zone`."""
from __future__ import annotations
import pandas as pd
from openrun.model import weekly_time_in_zone
def _seed(conn, aid: int, when: str, *, atype: str = "running",
z1=0.0, z2=0.0, z3=0.0, z4=0.0, z5=0.0) -> None:
conn.execute(
"""INSERT INTO activities
(activity_id, start_time_local, activity_type, raw, fetched_at)
VALUES (?, ?, ?, '{}', 'now')""",
(aid, when, atype),
)
conn.execute(
"""INSERT INTO activity_time_in_zone
(activity_id, z1_s, z2_s, z3_s, z4_s, z5_s, total_s, source, computed_at)
VALUES (?, ?, ?, ?, ?, ?, ?, 'fit', 'now')""",
(aid, z1, z2, z3, z4, z5, z1 + z2 + z3 + z4 + z5),
)
conn.commit()
def test_weekly_tiz_sums_within_week(tmp_conn) -> None:
"""Three running activities in the same ISO week sum into one row."""
# 2026-05-04 is Mon, 2026-05-06 Wed, 2026-05-10 Sun — all the same Mon-anchored week.
_seed(tmp_conn, 1, "2026-05-04 06:00:00", z1=600, z2=1200)
_seed(tmp_conn, 2, "2026-05-06 06:00:00", z2=300, z3=900)
_seed(tmp_conn, 3, "2026-05-10 06:00:00", z4=400)
out = weekly_time_in_zone(tmp_conn)
assert len(out) == 1
row = out.iloc[0]
assert row["z1_s"] == 600
assert row["z2_s"] == 1500
assert row["z3_s"] == 900
assert row["z4_s"] == 400
assert row["z5_s"] == 0
assert row["total_s"] == 600 + 1200 + 300 + 900 + 400
assert row["n_activities"] == 3
def test_weekly_tiz_splits_across_weeks(tmp_conn) -> None:
_seed(tmp_conn, 1, "2026-05-04 06:00:00", z2=1000) # week of 2026-05-04
_seed(tmp_conn, 2, "2026-05-12 06:00:00", z3=2000) # week of 2026-05-11
out = weekly_time_in_zone(tmp_conn)
assert len(out) == 2
assert out.index.min() == pd.Timestamp("2026-05-04")
assert out.index.max() == pd.Timestamp("2026-05-11")
def test_weekly_tiz_filters_by_activity_type(tmp_conn) -> None:
_seed(tmp_conn, 1, "2026-05-04 06:00:00", atype="running", z2=1000)
_seed(tmp_conn, 2, "2026-05-04 18:00:00", atype="cycling", z2=2000)
out = weekly_time_in_zone(tmp_conn)
assert out.iloc[0]["z2_s"] == 1000 # cycling excluded by default
def test_weekly_tiz_date_window(tmp_conn) -> None:
_seed(tmp_conn, 1, "2026-04-01 06:00:00", z2=100)
_seed(tmp_conn, 2, "2026-05-04 06:00:00", z2=500)
_seed(tmp_conn, 3, "2026-06-01 06:00:00", z2=900)
out = weekly_time_in_zone(tmp_conn, start="2026-05-01", end="2026-05-31")
assert len(out) == 1
assert out.iloc[0]["z2_s"] == 500
def test_weekly_tiz_empty_returns_empty_frame_with_columns(tmp_conn) -> None:
out = weekly_time_in_zone(tmp_conn)
assert out.empty
assert {"z1_s", "z2_s", "z3_s", "z4_s", "z5_s", "total_s", "n_activities"} <= set(out.columns)