API - return ascent/descent to null when no elevation data in gpx file
This commit is contained in:
parent
303463cb44
commit
7d30fba00b
90
fittrackee/tests/fixtures/fixtures_workouts.py
vendored
90
fittrackee/tests/fixtures/fixtures_workouts.py
vendored
@ -575,6 +575,96 @@ def gpx_file_with_offset() -> str:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def gpx_file_without_elevation() -> str:
|
||||||
|
return (
|
||||||
|
'<?xml version=\'1.0\' encoding=\'UTF-8\'?>'
|
||||||
|
'<gpx xmlns:gpxdata="http://www.cluetrust.com/XML/GPXDATA/1/0" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxext="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns="http://www.topografix.com/GPX/1/1">' # noqa
|
||||||
|
' <metadata/>'
|
||||||
|
' <trk>'
|
||||||
|
' <name>just a workout</name>'
|
||||||
|
' <trkseg>'
|
||||||
|
' <trkpt lat="44.68095" lon="6.07367">'
|
||||||
|
' <time>2018-03-13T12:44:45Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68091" lon="6.07367">'
|
||||||
|
' <time>2018-03-13T12:44:50Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.6808" lon="6.07364">'
|
||||||
|
' <time>2018-03-13T12:45:00Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68075" lon="6.07364">'
|
||||||
|
' <time>2018-03-13T12:45:05Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68071" lon="6.07364">'
|
||||||
|
' <time>2018-03-13T12:45:10Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68049" lon="6.07361">'
|
||||||
|
' <time>2018-03-13T12:45:30Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68019" lon="6.07356">'
|
||||||
|
' <time>2018-03-13T12:45:55Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.68014" lon="6.07355">'
|
||||||
|
' <time>2018-03-13T12:46:00Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67995" lon="6.07358">'
|
||||||
|
' <time>2018-03-13T12:46:15Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67977" lon="6.07364">'
|
||||||
|
' <time>2018-03-13T12:46:30Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67972" lon="6.07367">'
|
||||||
|
' <time>2018-03-13T12:46:35Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67966" lon="6.07368">'
|
||||||
|
' <time>2018-03-13T12:46:40Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67961" lon="6.0737">'
|
||||||
|
' <time>2018-03-13T12:46:45Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67938" lon="6.07377">'
|
||||||
|
' <time>2018-03-13T12:47:05Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67933" lon="6.07381">'
|
||||||
|
' <time>2018-03-13T12:47:10Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67922" lon="6.07385">'
|
||||||
|
' <time>2018-03-13T12:47:20Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67911" lon="6.0739">'
|
||||||
|
' <time>2018-03-13T12:47:30Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.679" lon="6.07399">'
|
||||||
|
' <time>2018-03-13T12:47:40Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67896" lon="6.07402">'
|
||||||
|
' <time>2018-03-13T12:47:45Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67884" lon="6.07408">'
|
||||||
|
' <time>2018-03-13T12:47:55Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67863" lon="6.07423">'
|
||||||
|
' <time>2018-03-13T12:48:15Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67858" lon="6.07425">'
|
||||||
|
' <time>2018-03-13T12:48:20Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67842" lon="6.07434">'
|
||||||
|
' <time>2018-03-13T12:48:35Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67837" lon="6.07435">'
|
||||||
|
' <time>2018-03-13T12:48:40Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' <trkpt lat="44.67822" lon="6.07442">'
|
||||||
|
' <time>2018-03-13T12:48:55Z</time>'
|
||||||
|
' </trkpt>'
|
||||||
|
' </trkseg>'
|
||||||
|
' </trk>'
|
||||||
|
'</gpx>'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def gpx_file_wo_track() -> str:
|
def gpx_file_wo_track() -> str:
|
||||||
return (
|
return (
|
||||||
|
@ -499,6 +499,45 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin):
|
|||||||
assert len(data['data']['workouts']) == 1
|
assert len(data['data']['workouts']) == 1
|
||||||
assert_workout_data_with_gpx(data)
|
assert_workout_data_with_gpx(data)
|
||||||
|
|
||||||
|
def test_it_adds_a_workout_without_elevation(
|
||||||
|
self,
|
||||||
|
app: Flask,
|
||||||
|
user_1: User,
|
||||||
|
sport_1_cycling: Sport,
|
||||||
|
gpx_file_without_elevation: str,
|
||||||
|
) -> None:
|
||||||
|
client, auth_token = self.get_test_client_and_auth_token(
|
||||||
|
app, user_1.email
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.post(
|
||||||
|
'/api/workouts',
|
||||||
|
data=dict(
|
||||||
|
file=(
|
||||||
|
BytesIO(str.encode(gpx_file_without_elevation)),
|
||||||
|
'example.gpx',
|
||||||
|
),
|
||||||
|
data='{"sport_id": 1}',
|
||||||
|
),
|
||||||
|
headers=dict(
|
||||||
|
content_type='multipart/form-data',
|
||||||
|
Authorization=f'Bearer {auth_token}',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
data = json.loads(response.data.decode())
|
||||||
|
assert response.status_code == 201
|
||||||
|
workout = data['data']['workouts'][0]
|
||||||
|
assert workout['duration'] == '0:04:10'
|
||||||
|
assert workout['ascent'] is None
|
||||||
|
assert workout['ave_speed'] == 4.57
|
||||||
|
assert workout['descent'] is None
|
||||||
|
assert workout['distance'] == 0.317
|
||||||
|
assert workout['max_alt'] is None
|
||||||
|
assert workout['max_speed'] == 5.1
|
||||||
|
assert workout['min_alt'] is None
|
||||||
|
assert workout['with_gpx'] is True
|
||||||
|
|
||||||
def test_it_returns_400_when_quotes_are_not_escaped_in_notes(
|
def test_it_returns_400_when_quotes_are_not_escaped_in_notes(
|
||||||
self,
|
self,
|
||||||
app: Flask,
|
app: Flask,
|
||||||
|
@ -42,9 +42,14 @@ def get_gpx_data(
|
|||||||
gpx_data['elevation_max'] = ele.maximum
|
gpx_data['elevation_max'] = ele.maximum
|
||||||
gpx_data['elevation_min'] = ele.minimum
|
gpx_data['elevation_min'] = ele.minimum
|
||||||
|
|
||||||
|
# gpx file contains elevation datat (<ele> element)
|
||||||
|
if ele.maximum is not None:
|
||||||
hill = parsed_gpx.get_uphill_downhill()
|
hill = parsed_gpx.get_uphill_downhill()
|
||||||
gpx_data['uphill'] = hill.uphill
|
gpx_data['uphill'] = hill.uphill
|
||||||
gpx_data['downhill'] = hill.downhill
|
gpx_data['downhill'] = hill.downhill
|
||||||
|
else:
|
||||||
|
gpx_data['uphill'] = None
|
||||||
|
gpx_data['downhill'] = None
|
||||||
|
|
||||||
moving_data = parsed_gpx.get_moving_data(
|
moving_data = parsed_gpx.get_moving_data(
|
||||||
stopped_speed_threshold=stopped_speed_threshold
|
stopped_speed_threshold=stopped_speed_threshold
|
||||||
|
Loading…
Reference in New Issue
Block a user