API - return ascent/descent to null when no elevation data in gpx file
This commit is contained in:
		
							
								
								
									
										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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user