Merge branch 'dev' into alternate_weather_api
This commit is contained in:
@ -3,7 +3,7 @@ import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from io import BytesIO
|
||||
from typing import Dict, Optional
|
||||
from typing import Any, Dict, Optional
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
@ -446,12 +446,37 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin):
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert_workout_data_with_gpx(data)
|
||||
|
||||
def test_it_returns_400_when_quotes_are_not_escaped_in_notes(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
gpx_file: 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)), 'example.gpx'),
|
||||
data='{{"sport_id": 1, "notes": "test "workout""}}',
|
||||
),
|
||||
headers=dict(
|
||||
content_type='multipart/form-data',
|
||||
Authorization=f'Bearer {auth_token}',
|
||||
),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'input_description,input_notes',
|
||||
[
|
||||
('empty notes', ''),
|
||||
('short notes', 'test workout'),
|
||||
('notes with special characters', 'test \nworkout'),
|
||||
('notes with special characters', "test \n'workout'"),
|
||||
],
|
||||
)
|
||||
def test_it_adds_a_workout_with_gpx_notes(
|
||||
@ -861,8 +886,21 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert_workout_data_wo_gpx(data)
|
||||
|
||||
def test_it_returns_400_if_workout_date_is_missing(
|
||||
self, app: Flask, user_1: User, sport_1_cycling: Sport
|
||||
@pytest.mark.parametrize(
|
||||
'input_ascent, input_descent',
|
||||
[
|
||||
(100, 150),
|
||||
(0, 150),
|
||||
(100, 0),
|
||||
],
|
||||
)
|
||||
def test_it_adds_workout_with_ascent_and_descent_when_provided(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
input_ascent: int,
|
||||
input_descent: int,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
@ -871,13 +909,157 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
response = client.post(
|
||||
'/api/workouts/no_gpx',
|
||||
content_type='application/json',
|
||||
data=json.dumps(dict(sport_id=1, duration=3600, distance=10)),
|
||||
data=json.dumps(
|
||||
dict(
|
||||
sport_id=1,
|
||||
duration=3600,
|
||||
workout_date='2018-05-15 14:05',
|
||||
distance=10,
|
||||
ascent=input_ascent,
|
||||
descent=input_descent,
|
||||
)
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
data = json.loads(response.data.decode())
|
||||
assert response.status_code == 201
|
||||
assert 'created' in data['status']
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert data['data']['workouts'][0]['ascent'] == input_ascent
|
||||
assert data['data']['workouts'][0]['descent'] == input_descent
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'description,input_data',
|
||||
[
|
||||
(
|
||||
"'sport_id' is missing",
|
||||
{
|
||||
"duration": 3600,
|
||||
"workout_date": '2018-05-15 14:05',
|
||||
"distance": 10,
|
||||
},
|
||||
),
|
||||
(
|
||||
"'duration' is missing",
|
||||
{
|
||||
"sport_id": 1,
|
||||
"workout_date": '2018-05-15 14:05',
|
||||
"distance": 10,
|
||||
},
|
||||
),
|
||||
(
|
||||
"'workout_date' is missing",
|
||||
{"sport_id": 1, "duration": 3600, "distance": 10},
|
||||
),
|
||||
(
|
||||
"'distance' is missing",
|
||||
{
|
||||
"sport_id": 1,
|
||||
"duration": 3600,
|
||||
"workout_date": '2018-05-15 14:05',
|
||||
},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_it_returns_400_if_key_is_missing(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
description: str,
|
||||
input_data: Dict,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.post(
|
||||
'/api/workouts/no_gpx',
|
||||
content_type='application/json',
|
||||
data=json.dumps(input_data),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
def test_it_returns_500_if_workout_format_is_invalid(
|
||||
@pytest.mark.parametrize(
|
||||
'description,input_data',
|
||||
[
|
||||
("only ascent", {"ascent": 100}),
|
||||
("only descent", {"descent": 150}),
|
||||
],
|
||||
)
|
||||
def test_it_returns_400_when_ascent_or_descent_are_missing(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
description: str,
|
||||
input_data: Dict,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.post(
|
||||
'/api/workouts/no_gpx',
|
||||
content_type='application/json',
|
||||
data=json.dumps(
|
||||
{
|
||||
'sport_id': 1,
|
||||
'duration': 3600,
|
||||
'workout_date': '2018-05-15 14:05',
|
||||
'distance': 10,
|
||||
**input_data,
|
||||
}
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'description,input_data',
|
||||
[
|
||||
("ascent is below 0", {"ascent": -100, "descent": 100}),
|
||||
("descent is below 0", {"ascent": 150, "descent": -100}),
|
||||
("ascent is None", {"ascent": None, "descent": 100}),
|
||||
("descent is None", {"ascent": 150, "descent": None}),
|
||||
("ascent is invalid", {"ascent": "a", "descent": 100}),
|
||||
("descent is invalid", {"ascent": 150, "descent": "b"}),
|
||||
],
|
||||
)
|
||||
def test_it_returns_400_when_ascent_or_descent_are_invalid(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
description: str,
|
||||
input_data: Dict,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.post(
|
||||
'/api/workouts/no_gpx',
|
||||
content_type='application/json',
|
||||
data=json.dumps(
|
||||
{
|
||||
'sport_id': 1,
|
||||
'duration': 3600,
|
||||
'workout_date': '2018-05-15 14:05',
|
||||
'distance': 10,
|
||||
**input_data,
|
||||
}
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
def test_it_returns_500_if_workout_date_format_is_invalid(
|
||||
self, app: Flask, user_1: User, sport_1_cycling: Sport
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
@ -900,12 +1082,13 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
|
||||
self.assert_500(response, 'Error during workout save.', status='fail')
|
||||
|
||||
def test_it_adds_workout_with_zero_value(
|
||||
@pytest.mark.parametrize('input_distance', [0, '', None])
|
||||
def test_it_returns_400_when_distance_is_invalid(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
sport_2_running: Sport,
|
||||
input_distance: Any,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
@ -917,41 +1100,43 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
data=json.dumps(
|
||||
dict(
|
||||
sport_id=1,
|
||||
duration=0,
|
||||
workout_date='2018-05-14 14:05',
|
||||
distance=0,
|
||||
title='Workout test',
|
||||
duration=3600,
|
||||
workout_date='2018-05-15 14:05',
|
||||
distance=input_distance,
|
||||
)
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
data = json.loads(response.data.decode())
|
||||
assert response.status_code == 201
|
||||
assert 'created' in data['status']
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert 'creation_date' in data['data']['workouts'][0]
|
||||
assert (
|
||||
data['data']['workouts'][0]['workout_date']
|
||||
== 'Mon, 14 May 2018 14:05:00 GMT'
|
||||
)
|
||||
assert data['data']['workouts'][0]['user'] == 'test'
|
||||
assert data['data']['workouts'][0]['sport_id'] == 1
|
||||
assert data['data']['workouts'][0]['duration'] is None
|
||||
assert data['data']['workouts'][0]['title'] == 'Workout test'
|
||||
assert data['data']['workouts'][0]['ascent'] is None
|
||||
assert data['data']['workouts'][0]['ave_speed'] is None
|
||||
assert data['data']['workouts'][0]['descent'] is None
|
||||
assert data['data']['workouts'][0]['distance'] is None
|
||||
assert data['data']['workouts'][0]['max_alt'] is None
|
||||
assert data['data']['workouts'][0]['max_speed'] is None
|
||||
assert data['data']['workouts'][0]['min_alt'] is None
|
||||
assert data['data']['workouts'][0]['moving'] is None
|
||||
assert data['data']['workouts'][0]['pauses'] is None
|
||||
assert data['data']['workouts'][0]['with_gpx'] is False
|
||||
self.assert_400(response)
|
||||
|
||||
assert len(data['data']['workouts'][0]['segments']) == 0
|
||||
assert len(data['data']['workouts'][0]['records']) == 0
|
||||
@pytest.mark.parametrize('input_duration', [0, '', None])
|
||||
def test_it_returns_400_when_duration_is_invalid(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
input_duration: Any,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.post(
|
||||
'/api/workouts/no_gpx',
|
||||
content_type='application/json',
|
||||
data=json.dumps(
|
||||
dict(
|
||||
sport_id=1,
|
||||
duration=input_duration,
|
||||
workout_date='2018-05-15 14:05',
|
||||
distance=10,
|
||||
)
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'client_scope, can_access',
|
||||
@ -1112,7 +1297,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin):
|
||||
data = self.assert_500(response, 'error during gpx processing')
|
||||
assert 'data' not in data
|
||||
|
||||
def test_it_imports_only_max_number_of_files(
|
||||
def test_it_returns_400_when_files_in_archive_exceed_limit(
|
||||
self,
|
||||
app_with_max_workouts: Flask,
|
||||
user_1: User,
|
||||
@ -1127,7 +1312,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin):
|
||||
app_with_max_workouts, user_1.email
|
||||
)
|
||||
|
||||
client.post(
|
||||
response = client.post(
|
||||
'/api/workouts',
|
||||
data=dict(
|
||||
file=(zip_file, 'gpx_test.zip'), data='{"sport_id": 1}'
|
||||
@ -1138,12 +1323,11 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin):
|
||||
),
|
||||
)
|
||||
|
||||
response = client.get(
|
||||
'/api/workouts',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
self.assert_400(
|
||||
response,
|
||||
'the number of files in the archive exceeds the limit',
|
||||
'fail',
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
assert len(data['data']['workouts']) == 2
|
||||
|
||||
def test_it_returns_error_if_archive_size_exceeds_limit(
|
||||
self,
|
||||
@ -1178,6 +1362,40 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin):
|
||||
)
|
||||
assert 'data' not in data
|
||||
|
||||
def test_it_returns_error_if_a_file_from_archive_size_exceeds_limit(
|
||||
self,
|
||||
app_with_max_file_size: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
) -> None:
|
||||
file_path = os.path.join(
|
||||
app_with_max_file_size.root_path, 'tests/files/gpx_test.zip'
|
||||
)
|
||||
# 'gpx_test.zip' contains 3 gpx files (same data) and 1 non-gpx file
|
||||
with open(file_path, 'rb') as zip_file:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app_with_max_file_size, user_1.email
|
||||
)
|
||||
|
||||
response = client.post(
|
||||
'/api/workouts',
|
||||
data=dict(
|
||||
file=(zip_file, 'gpx_test.zip'), data='{"sport_id": 1}'
|
||||
),
|
||||
headers=dict(
|
||||
content_type='multipart/form-data',
|
||||
Authorization=f'Bearer {auth_token}',
|
||||
),
|
||||
)
|
||||
|
||||
data = self.assert_400(
|
||||
response,
|
||||
'at least one file in zip archive exceeds size limit, '
|
||||
'please check the archive',
|
||||
'fail',
|
||||
)
|
||||
assert 'data' not in data
|
||||
|
||||
|
||||
class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin):
|
||||
def workout_assertion(
|
||||
|
@ -578,6 +578,93 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
assert records[3]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[3]['value'] == 20.0
|
||||
|
||||
def test_it_updates_ascent_and_descent_values(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
workout_cycling_user_1: Workout,
|
||||
) -> None:
|
||||
workout_short_id = workout_cycling_user_1.short_id
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
ascent = 10
|
||||
descent = 0
|
||||
|
||||
response = client.patch(
|
||||
f'/api/workouts/{workout_short_id}',
|
||||
content_type='application/json',
|
||||
data=json.dumps(dict(ascent=ascent, descent=descent)),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
data = json.loads(response.data.decode())
|
||||
assert response.status_code == 200
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert data['data']['workouts'][0]['ascent'] == ascent
|
||||
assert data['data']['workouts'][0]['descent'] == descent
|
||||
|
||||
records = data['data']['workouts'][0]['records']
|
||||
assert len(records) == 5
|
||||
assert records[0]['sport_id'] == sport_1_cycling.id
|
||||
assert records[0]['workout_id'] == workout_short_id
|
||||
assert records[0]['record_type'] == 'HA'
|
||||
assert records[0]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[0]['value'] == ascent
|
||||
assert records[1]['sport_id'] == sport_1_cycling.id
|
||||
assert records[1]['workout_id'] == workout_short_id
|
||||
assert records[1]['record_type'] == 'MS'
|
||||
assert records[1]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[1]['value'] == 10.0
|
||||
assert records[2]['sport_id'] == sport_1_cycling.id
|
||||
assert records[2]['workout_id'] == workout_short_id
|
||||
assert records[2]['record_type'] == 'LD'
|
||||
assert records[2]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[2]['value'] == '1:00:00'
|
||||
assert records[3]['sport_id'] == sport_1_cycling.id
|
||||
assert records[3]['workout_id'] == workout_short_id
|
||||
assert records[3]['record_type'] == 'FD'
|
||||
assert records[3]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[3]['value'] == 10.0
|
||||
assert records[4]['sport_id'] == sport_1_cycling.id
|
||||
assert records[4]['workout_id'] == workout_short_id
|
||||
assert records[4]['record_type'] == 'AS'
|
||||
assert records[4]['workout_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT'
|
||||
assert records[4]['value'] == 10.0
|
||||
|
||||
def test_it_empties_ascent_and_descent_values(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
workout_cycling_user_1: Workout,
|
||||
) -> None:
|
||||
workout_short_id = workout_cycling_user_1.short_id
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
workout_cycling_user_1.ascent = 100
|
||||
workout_cycling_user_1.descent = 150
|
||||
|
||||
response = client.patch(
|
||||
f'/api/workouts/{workout_short_id}',
|
||||
content_type='application/json',
|
||||
data=json.dumps(dict(ascent=None, descent=None)),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
data = json.loads(response.data.decode())
|
||||
assert response.status_code == 200
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['workouts']) == 1
|
||||
assert data['data']['workouts'][0]['ascent'] is None
|
||||
assert data['data']['workouts'][0]['descent'] is None
|
||||
records = data['data']['workouts'][0]['records']
|
||||
assert len(records) == 4
|
||||
assert 'HA' not in [record['record_type'] for record in records]
|
||||
|
||||
def test_it_returns_400_if_payload_is_empty(
|
||||
self,
|
||||
app: Flask,
|
||||
@ -646,3 +733,64 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin):
|
||||
|
||||
data = self.assert_404(response)
|
||||
assert len(data['data']['workouts']) == 0
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'input_ascent, input_descent',
|
||||
[
|
||||
(100, None),
|
||||
(None, 150),
|
||||
(100, -10),
|
||||
(-100, 150),
|
||||
(100, 'O'),
|
||||
('O', 150),
|
||||
],
|
||||
)
|
||||
def test_it_returns_400_if_ascent_or_descent_are_invalid(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
workout_cycling_user_1: Workout,
|
||||
input_ascent: int,
|
||||
input_descent: int,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
response = client.patch(
|
||||
f'/api/workouts/{workout_cycling_user_1.short_id}',
|
||||
content_type='application/json',
|
||||
data=json.dumps(
|
||||
dict(
|
||||
ascent=input_ascent,
|
||||
descent=input_descent,
|
||||
)
|
||||
),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'input_key',
|
||||
['ascent', 'descent'],
|
||||
)
|
||||
def test_it_returns_400_if_only_one_value_ascent_or_descent_is_provided(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
workout_cycling_user_1: Workout,
|
||||
input_key: str,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
response = client.patch(
|
||||
f'/api/workouts/{workout_cycling_user_1.short_id}',
|
||||
content_type='application/json',
|
||||
data=json.dumps({input_key: 100}),
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_400(response)
|
||||
|
@ -75,6 +75,48 @@ class TestWorkoutModel:
|
||||
assert serialized_workout['with_gpx'] is False
|
||||
assert str(serialized_workout['workout_date']) == '2018-01-01 00:00:00'
|
||||
|
||||
def test_serialize_for_workout_without_gpx_and_with_ascent_and_descent(
|
||||
self,
|
||||
app: Flask,
|
||||
sport_1_cycling: Sport,
|
||||
user_1: User,
|
||||
workout_cycling_user_1: Workout,
|
||||
) -> None:
|
||||
workout = workout_cycling_user_1
|
||||
workout.ascent = 0
|
||||
workout.descent = 10
|
||||
|
||||
serialized_workout = workout.serialize()
|
||||
assert serialized_workout['ascent'] == workout.ascent
|
||||
assert serialized_workout['ave_speed'] == float(workout.ave_speed)
|
||||
assert serialized_workout['bounds'] == []
|
||||
assert 'creation_date' in serialized_workout
|
||||
assert serialized_workout['descent'] == workout.descent
|
||||
assert serialized_workout['distance'] == float(workout.distance)
|
||||
assert serialized_workout['duration'] == str(workout.duration)
|
||||
assert serialized_workout['id'] == workout.short_id
|
||||
assert serialized_workout['map'] is None
|
||||
assert serialized_workout['max_alt'] is None
|
||||
assert serialized_workout['max_speed'] == float(workout.max_speed)
|
||||
assert serialized_workout['min_alt'] is None
|
||||
assert serialized_workout['modification_date'] is not None
|
||||
assert serialized_workout['moving'] == str(workout.moving)
|
||||
assert serialized_workout['next_workout'] is None
|
||||
assert serialized_workout['notes'] is None
|
||||
assert serialized_workout['pauses'] is None
|
||||
assert serialized_workout['previous_workout'] is None
|
||||
assert serialized_workout['records'] == [
|
||||
record.serialize() for record in workout.records
|
||||
]
|
||||
assert serialized_workout['segments'] == []
|
||||
assert serialized_workout['sport_id'] == workout.sport_id
|
||||
assert serialized_workout['title'] == workout.title
|
||||
assert serialized_workout['user'] == workout.user.username
|
||||
assert serialized_workout['weather_end'] is None
|
||||
assert serialized_workout['weather_start'] is None
|
||||
assert serialized_workout['with_gpx'] is False
|
||||
assert str(serialized_workout['workout_date']) == '2018-01-01 00:00:00'
|
||||
|
||||
def test_serialize_for_workout_with_gpx(
|
||||
self,
|
||||
app: Flask,
|
||||
|
Reference in New Issue
Block a user