75 lines
2.7 KiB
Python
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)
|