66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
|
|
"""Tests for the `run_sync` orchestrator in `openrun.ingest.garmin_api`.
|
||
|
|
|
||
|
|
`run_sync` is the auth-free body shared by the CLI and the web "Sync now"
|
||
|
|
button. We stub every network-touching sub-sync so the test verifies only the
|
||
|
|
orchestration contract: which steps run, what the summary holds, that progress
|
||
|
|
is streamed, and that `last_sync_utc` is recorded.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import openrun.ingest.garmin_api as g
|
||
|
|
from openrun.db import get_state
|
||
|
|
|
||
|
|
|
||
|
|
def _stub_subsyncs(monkeypatch, tmp_path):
|
||
|
|
monkeypatch.setattr(g, "sync_activities", lambda conn, **kw: 3)
|
||
|
|
monkeypatch.setattr(g, "backfill_fits", lambda conn, **kw: 2)
|
||
|
|
monkeypatch.setattr(g, "_fit_dir", lambda: tmp_path)
|
||
|
|
for name in (
|
||
|
|
"sync_steps", "sync_sleep", "sync_stress", "sync_hrv",
|
||
|
|
"sync_intensity_minutes", "sync_resting_hr", "sync_body_battery",
|
||
|
|
):
|
||
|
|
monkeypatch.setattr(g, name, lambda conn, end, period: 1)
|
||
|
|
|
||
|
|
|
||
|
|
def test_run_sync_default_pass(tmp_conn, tmp_path, monkeypatch) -> None:
|
||
|
|
_stub_subsyncs(monkeypatch, tmp_path)
|
||
|
|
msgs: list[str] = []
|
||
|
|
|
||
|
|
summary = g.run_sync(tmp_conn, progress=msgs.append)
|
||
|
|
|
||
|
|
assert summary["activities"] == 3
|
||
|
|
assert "fit_backfill" not in summary # off by default
|
||
|
|
assert summary["steps"] == 1 and summary["body battery"] == 1
|
||
|
|
assert any("activities" in m for m in msgs)
|
||
|
|
assert get_state(tmp_conn, "last_sync_utc") is not None
|
||
|
|
|
||
|
|
|
||
|
|
def test_run_sync_includes_backfill_when_requested(tmp_conn, tmp_path, monkeypatch) -> None:
|
||
|
|
_stub_subsyncs(monkeypatch, tmp_path)
|
||
|
|
summary = g.run_sync(tmp_conn, fit_backfill=True, progress=lambda _m: None)
|
||
|
|
assert summary["fit_backfill"] == 2
|
||
|
|
|
||
|
|
|
||
|
|
def test_run_sync_skip_activities(tmp_conn, tmp_path, monkeypatch) -> None:
|
||
|
|
_stub_subsyncs(monkeypatch, tmp_path)
|
||
|
|
# If activities ran, the stub would put a key in the summary — assert it didn't.
|
||
|
|
summary = g.run_sync(tmp_conn, skip_activities=True, progress=lambda _m: None)
|
||
|
|
assert "activities" not in summary
|
||
|
|
assert summary["HRV"] == 1 # wellness still runs
|
||
|
|
|
||
|
|
|
||
|
|
def test_run_sync_forwards_fit_flag(tmp_conn, tmp_path, monkeypatch) -> None:
|
||
|
|
seen: dict = {}
|
||
|
|
monkeypatch.setattr(g, "sync_activities", lambda conn, **kw: seen.update(kw) or 0)
|
||
|
|
monkeypatch.setattr(g, "_fit_dir", lambda: tmp_path)
|
||
|
|
for name in (
|
||
|
|
"sync_steps", "sync_sleep", "sync_stress", "sync_hrv",
|
||
|
|
"sync_intensity_minutes", "sync_resting_hr", "sync_body_battery",
|
||
|
|
):
|
||
|
|
monkeypatch.setattr(g, name, lambda conn, end, period: 0)
|
||
|
|
|
||
|
|
g.run_sync(tmp_conn, fetch_fit=False, full=True, progress=lambda _m: None)
|
||
|
|
assert seen["fetch_fit"] is False
|
||
|
|
assert seen["full"] is True
|