from app.garmin.uploader import UploadResult class FakeMyWhooshClient: def __init__(self, activities, fit_bytes: bytes) -> None: self.activities = activities self.fit_bytes = fit_bytes self.list_calls = 0 self.download_calls = 0 async def list_activities(self, email: str, password: str): self.list_calls += 1 return list(self.activities) async def download_fit(self, activity_file_id: str, email: str, password: str) -> bytes: self.download_calls += 1 return self.fit_bytes class FakeGarminUploader: def __init__(self, result: UploadResult | None = None, error: Exception | None = None) -> None: self.result = result or UploadResult("imported", False, "g-1", {"activityId": "g-1"}) self.error = error self.calls = 0 def import_fit(self, fit_path, mfa_code=None): self.calls += 1 if self.error is not None: raise self.error return self.result class FakeNotifier: def __init__(self) -> None: self.sent: list[dict] = [] def send(self, *, to_address: str, subject: str, body: str) -> None: self.sent.append({"to_address": to_address, "subject": subject, "body": body})