Skip to content

Commit

Permalink
Merge f19c528 into 6b1083c
Browse files Browse the repository at this point in the history
  • Loading branch information
drixselecta committed Oct 21, 2020
2 parents 6b1083c + f19c528 commit 8d7d950
Show file tree
Hide file tree
Showing 21 changed files with 926 additions and 263 deletions.
16 changes: 11 additions & 5 deletions config/settings/base.py
Expand Up @@ -265,10 +265,16 @@
GARMIN_CONNECT_PASSWORD = get_env_variable("GARMIN_CONNECT_PASSWORD", "")
GARMIN_ACTIVITY_URL = get_env_variable("GARMIN_ACTIVITY_URL", "")

##############################
# Swiss public transport API #
##############################
#################
# ELEVATION API #
#################

# http://transport.opendata.ch/docs.html
# https://elevation-api.io/

ELEVATION_API_KEY = get_env_variable("ELEVATION_API_KEY", "")
ELEVATION_API_RESOLUTION = get_env_variable("ELEVATION_API_RESOLUTION", "")

# https://developers.google.com/maps/documentation/elevation/overview

GOOGLE_API_KEY = get_env_variable("GOOGLE_API_KEY", "")

SWISS_PUBLIC_TRANSPORT_API_URL = get_env_variable("SWISS_PUBLIC_TRANSPORT_API_URL", "")
119 changes: 119 additions & 0 deletions homebytwo/conftest.py
Expand Up @@ -2,6 +2,7 @@
from pathlib import Path

from django.core.files.uploadedfile import SimpleUploadedFile
from django.shortcuts import resolve_url

import responses
from pytest import fixture
Expand All @@ -16,6 +17,8 @@
"delete": responses.DELETE,
}

STRAVA_API_BASE_URL = "https://www.strava.com/api/v3/"


@fixture(autouse=True)
def media_storage(settings, tmpdir):
Expand Down Expand Up @@ -73,6 +76,25 @@ def mocked_responses():
yield response


@fixture
def mock_json_response(read_file, mocked_responses):
def _mock_json_response(
url,
response_json,
method="get",
status=200,
):
mocked_responses.add(
METHODS.get(method),
url=url,
content_type="application/json",
body=read_file(response_json),
status=status,
)

return _mock_json_response


@fixture
def mock_call_response(mocked_responses):
def _mock_call_response(
Expand Down Expand Up @@ -155,3 +177,100 @@ def server_error(mock_call_json_response):
@fixture
def not_found(mock_call_json_response):
return partial(mock_call_json_response, status=404)


@fixture
def mock_strava_streams_response(mock_json_response):
def _mock_strava_streams_response(
source_id,
streams_json="strava_streams.json",
api_streams_status=200,
):
mock_json_response(
STRAVA_API_BASE_URL + "routes/%d/streams" % source_id,
response_json=streams_json,
status=api_streams_status,
)

return _mock_strava_streams_response


@fixture
def mock_route_details_responses(
settings, mock_json_response, mock_strava_streams_response
):
def _mock_route_details_responses(
data_source,
source_ids,
api_response_json=None,
api_response_status=200,
api_streams_json="strava_streams.json",
api_streams_status=200,
):

# intercept the API call
api_request_url = {
"strava": STRAVA_API_BASE_URL + "routes/%d",
"switzerland_mobility": settings.SWITZERLAND_MOBILITY_ROUTE_DATA_URL,
}
default_api_response_json = {
"strava": "strava_route_detail.json",
"switzerland_mobility": "2191833_show.json",
}

api_response_file = api_response_json or default_api_response_json[data_source]

for source_id in source_ids:
print(mocked_responses)
mock_json_response(
url=api_request_url[data_source] % source_id,
response_json=api_response_file,
status=api_response_status,
)

if data_source == "strava":
mock_strava_streams_response(
source_id, api_streams_json, api_streams_status
)

return _mock_route_details_responses


@fixture
def mock_route_details_response(mock_route_details_responses):
def _mock_route_details_response(data_source, source_id, *args, **kwargs):
source_ids = [source_id]
return mock_route_details_responses(data_source, source_ids, *args, **kwargs)

return _mock_route_details_response


@fixture
def mock_import_route_response_call(mock_route_details_response, client):
def _mock_import_route_response_call(
data_source,
source_id,
api_response_json=None,
api_response_status=200,
api_streams_json="strava_streams.json",
method="get",
post_data=None,
follow_redirect=False,
):

mock_route_details_response(
data_source,
source_id,
api_response_json=api_response_json,
api_response_status=api_response_status,
api_streams_json=api_streams_json,
)

# call import url
url = resolve_url("import_route", data_source=data_source, source_id=source_id)
if method == "get":
return client.get(url, follow=follow_redirect)
if method == "post":
return client.post(url, post_data, follow=follow_redirect)

return _mock_import_route_response_call
6 changes: 6 additions & 0 deletions homebytwo/importers/exceptions.py
Expand Up @@ -21,3 +21,9 @@ class SwitzerlandMobilityMissingCredentials(Exception):
"""

pass


class ElevationAPIError(Exception):
"""
the request to the elevation API returned bad results
"""
77 changes: 77 additions & 0 deletions homebytwo/importers/tests/data/bad_strava_streams.json
@@ -0,0 +1,77 @@
[
{
"type": "latlng",
"data": [
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
],
[
46.31703,
6.961
]
]
},
{
"type": "distance",
"data": [
0.0,
0.1,
0.2,
0.3,
0.4,
0.5,
0.6,
0.7,
0.8,
0.9
]
},
{
"type": "altitude",
"data": [
404.0,
408.0,
410.38,
412.0,
414.0,
417.00000000000006,
417.00000000000006,
417.00000000000006,
418.00000000000006,
418.00000000000006
]
}
]
6 changes: 4 additions & 2 deletions homebytwo/importers/tests/factories.py
@@ -1,3 +1,5 @@
from factory import Sequence

from ...importers import models
from ...routes.tests.factories import RouteFactory

Expand All @@ -6,11 +8,11 @@ class SwitzerlandMobilityRouteFactory(RouteFactory):
class Meta:
model = models.SwitzerlandMobilityRoute

source_id = 2191833
source_id = Sequence(lambda n: 10000 + n)


class StravaRouteFactory(RouteFactory):
class Meta:
model = models.StravaRoute

source_id = 2325453
source_id = Sequence(lambda n: 10000 + n)

0 comments on commit 8d7d950

Please sign in to comment.