60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
from dataclasses import replace
|
|
|
|
import pytest
|
|
|
|
from mywhoosh_garmin_sync.garmin import GarminUploadBlocked, GarminUploader
|
|
|
|
|
|
class FakeGarminClient:
|
|
def __init__(self, *args, **kwargs):
|
|
self.prompt_mfa = kwargs.get("prompt_mfa")
|
|
self.logged_in = False
|
|
|
|
def login(self, tokenstore=None):
|
|
self.logged_in = True
|
|
|
|
def upload_activity(self, activity_path):
|
|
return {"activityId": 12345, "path": activity_path}
|
|
|
|
|
|
class DuplicateGarminClient(FakeGarminClient):
|
|
def upload_activity(self, activity_path):
|
|
raise RuntimeError("409 duplicate activity already exists")
|
|
|
|
|
|
def test_garmin_uploader_success(settings, tmp_path):
|
|
fit = tmp_path / "activity.fit"
|
|
fit.write_bytes(b"fit")
|
|
uploader = GarminUploader(settings, client_factory=FakeGarminClient)
|
|
|
|
result = uploader.upload(fit)
|
|
|
|
assert result.status == "uploaded"
|
|
assert result.garmin_activity_id == "12345"
|
|
|
|
|
|
def test_garmin_uploader_duplicate(settings, tmp_path):
|
|
fit = tmp_path / "activity.fit"
|
|
fit.write_bytes(b"fit")
|
|
uploader = GarminUploader(settings, client_factory=DuplicateGarminClient)
|
|
|
|
result = uploader.upload(fit)
|
|
|
|
assert result.duplicate is True
|
|
assert result.status == "duplicate"
|
|
|
|
|
|
def test_mfa_prompt_blocks_without_code(settings):
|
|
uploader = GarminUploader(settings, client_factory=FakeGarminClient)
|
|
|
|
with pytest.raises(GarminUploadBlocked):
|
|
uploader._prompt_mfa()
|
|
|
|
|
|
def test_mfa_prompt_returns_env_code(settings):
|
|
settings = replace(settings, garmin_mfa_code="123456")
|
|
uploader = GarminUploader(settings, client_factory=FakeGarminClient)
|
|
|
|
assert uploader._prompt_mfa() == "123456"
|
|
|