Skip to content

Commit

Permalink
Merge pull request #77 from CodeFerriCode/strava-type-filter-tests
Browse files Browse the repository at this point in the history
Add tests for strava activity type filter
  • Loading branch information
flopp authored Nov 14, 2020
2 parents e0703c5 + afc184b commit 57aa34f
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ coverage
mypy
pylint
pytest
pytest-mock~=3.3
python-dateutil
120 changes: 120 additions & 0 deletions tests/test_track_loader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import datetime
import json
from pathlib import Path
from typing import Union, Dict, List
from unittest.mock import MagicMock

import pytest
from pytest_mock import MockerFixture

from gpxtrackposter.track_loader import TrackLoader
from gpxtrackposter.units import Units


def mock_activity(mocker: MockerFixture, activity_type: Union[str, list]) -> MagicMock:
activity = mocker.MagicMock()
activity.type = activity_type
return activity


@pytest.fixture(name="mock_run_activity")
def fixture_mock_run_activity(mocker: MockerFixture) -> MagicMock:
return mock_activity(mocker, "Run")


@pytest.fixture(name="mock_walk_activity")
def fixture_mock_walk_activity(mocker: MockerFixture) -> MagicMock:
return mock_activity(mocker, "Walk")


@pytest.fixture(name="mock_hike_activity")
def fixture_mock_hike_activity(mocker: MockerFixture) -> MagicMock:
return mock_activity(mocker, "Hike")


def strava_config(tmp_path: Path, activity_type: Union[str, List[str]] = None) -> str:
config: Dict[str, Union[str, List[str]]] = {
"client_id": "YOUR STRAVA API CLIENT ID",
"client_secret": "YOUR STRAVA API CLIENT SECRET",
"refresh_token": "YOUR STRAVA REFRESH TOKEN",
}
if activity_type:
config["activity_type"] = activity_type
config_json = tmp_path / "strava-config.json"
config_json.write_text(json.dumps(config))
return str(config_json)


@pytest.fixture(name="strava_config_without_type_filter")
def fixture_strava_config_without_type_filter(tmp_path: Path) -> str:
return strava_config(tmp_path)


@pytest.fixture(name="strava_config_with_run_type_filter")
def fixture_strava_config_with_run_type_filter(tmp_path: Path) -> str:
return strava_config(tmp_path, "Run")


@pytest.fixture(name="strava_config_with_walk_hike_type_filter")
def fixture_strava_config_with_walk_hike_type_filter(tmp_path: Path) -> str:
return strava_config(tmp_path, ["Walk", "Hike"])


@pytest.fixture(name="loader")
def fixture_loader(
mocker: MockerFixture, mock_run_activity: MagicMock, mock_walk_activity: MagicMock, mock_hike_activity: MagicMock
) -> TrackLoader:
"""Return a :class:`gpxtrackposter.track_loader.TrackLoader` object."""
mock_client_class = mocker.patch("gpxtrackposter.track_loader.Client")
instance = mock_client_class.return_value
instance.get_activities.return_value = [mock_run_activity, mock_walk_activity, mock_hike_activity]
return TrackLoader()


@pytest.fixture(name="mock_track_instance")
def fixture_mock_track_instance(mocker: MockerFixture) -> MagicMock:
mock_track_class = mocker.patch("gpxtrackposter.track_loader.Track")
instance = mock_track_class.return_value
instance.length.return_value = 1 * Units().km
instance.start_time.return_value = datetime.datetime.now()
instance.end_time.return_value = datetime.datetime.now()
return instance


def test_load_strava_tracks_without_activity_type_filter(
loader: TrackLoader,
strava_config_without_type_filter: str,
mock_track_instance: MagicMock,
mock_run_activity: MagicMock,
mock_walk_activity: MagicMock,
mock_hike_activity: MagicMock,
) -> None:
loader.load_strava_tracks(strava_config_without_type_filter)

mock_track_instance.load_strava.assert_any_call(mock_run_activity)
mock_track_instance.load_strava.assert_any_call(mock_walk_activity)
mock_track_instance.load_strava.assert_any_call(mock_hike_activity)


def test_load_strava_tracks_with_str_activity_type_filter(
loader: TrackLoader,
strava_config_with_run_type_filter: str,
mock_track_instance: MagicMock,
mock_run_activity: MagicMock,
) -> None:
loader.load_strava_tracks(strava_config_with_run_type_filter)

mock_track_instance.load_strava.assert_called_once_with(mock_run_activity)


def test_load_strava_tracks_with_list_activity_type_filter(
loader: TrackLoader,
strava_config_with_walk_hike_type_filter: str,
mock_track_instance: MagicMock,
mock_walk_activity: MagicMock,
mock_hike_activity: MagicMock,
) -> None:
loader.load_strava_tracks(strava_config_with_walk_hike_type_filter)

mock_track_instance.load_strava.assert_any_call(mock_walk_activity)
mock_track_instance.load_strava.assert_any_call(mock_hike_activity)

0 comments on commit 57aa34f

Please sign in to comment.