API - get sports with authenticated user preferences
This commit is contained in:
14
fittrackee/tests/fixtures/fixtures_users.py
vendored
14
fittrackee/tests/fixtures/fixtures_users.py
vendored
@ -96,3 +96,17 @@ def user_sport_1_preference(
|
||||
db.session.add(user_sport)
|
||||
db.session.commit()
|
||||
return user_sport
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def user_admin_sport_1_preference(
|
||||
user_1_admin: User, sport_1_cycling: Sport
|
||||
) -> UserSportPreference:
|
||||
user_sport = UserSportPreference(
|
||||
user_id=user_1_admin.id,
|
||||
sport_id=sport_1_cycling.id,
|
||||
stopped_speed_threshold=sport_1_cycling.stopped_speed_threshold,
|
||||
)
|
||||
db.session.add(user_sport)
|
||||
db.session.commit()
|
||||
return user_sport
|
||||
|
@ -2,7 +2,8 @@ import json
|
||||
|
||||
from flask import Flask
|
||||
|
||||
from fittrackee.users.models import User
|
||||
from fittrackee import db
|
||||
from fittrackee.users.models import User, UserSportPreference
|
||||
from fittrackee.workouts.models import Sport, Workout
|
||||
|
||||
from ..api_test_case import ApiTestCaseMixin
|
||||
@ -11,6 +12,9 @@ expected_sport_1_cycling_result = {
|
||||
'id': 1,
|
||||
'label': 'Cycling',
|
||||
'is_active': True,
|
||||
'is_active_for_user': True,
|
||||
'color': None,
|
||||
'stopped_speed_threshold': 1,
|
||||
}
|
||||
expected_sport_1_cycling_admin_result = expected_sport_1_cycling_result.copy()
|
||||
expected_sport_1_cycling_admin_result['has_workouts'] = False
|
||||
@ -19,6 +23,9 @@ expected_sport_2_running_result = {
|
||||
'id': 2,
|
||||
'label': 'Running',
|
||||
'is_active': True,
|
||||
'is_active_for_user': True,
|
||||
'color': None,
|
||||
'stopped_speed_threshold': 0.1,
|
||||
}
|
||||
expected_sport_2_running_admin_result = expected_sport_2_running_result.copy()
|
||||
expected_sport_2_running_admin_result['has_workouts'] = False
|
||||
@ -27,6 +34,9 @@ expected_sport_1_cycling_inactive_result = {
|
||||
'id': 1,
|
||||
'label': 'Cycling',
|
||||
'is_active': False,
|
||||
'is_active_for_user': False,
|
||||
'color': None,
|
||||
'stopped_speed_threshold': 1,
|
||||
}
|
||||
expected_sport_1_cycling_inactive_admin_result = (
|
||||
expected_sport_1_cycling_inactive_result.copy()
|
||||
@ -108,6 +118,39 @@ class TestGetSports(ApiTestCaseMixin):
|
||||
data['data']['sports'][1] == expected_sport_2_running_admin_result
|
||||
)
|
||||
|
||||
def test_it_gets_sports_with_auth_user_preferences(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1_admin: User,
|
||||
sport_1_cycling: Sport,
|
||||
sport_2_running: Sport,
|
||||
user_admin_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
user_admin_sport_1_preference.color = '#000000'
|
||||
user_admin_sport_1_preference.stopped_speed_threshold = 0.5
|
||||
user_admin_sport_1_preference.is_active = False
|
||||
db.session.commit()
|
||||
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, as_admin=True
|
||||
)
|
||||
|
||||
response = client.get(
|
||||
'/api/sports',
|
||||
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']['sports']) == 2
|
||||
assert data['data']['sports'][0]['color'] == '#000000'
|
||||
assert data['data']['sports'][0]['stopped_speed_threshold'] == 0.5
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is False
|
||||
assert (
|
||||
data['data']['sports'][1] == expected_sport_2_running_admin_result
|
||||
)
|
||||
|
||||
|
||||
class TestGetSport(ApiTestCaseMixin):
|
||||
def test_it_gets_a_sport(
|
||||
@ -126,6 +169,26 @@ class TestGetSport(ApiTestCaseMixin):
|
||||
assert len(data['data']['sports']) == 1
|
||||
assert data['data']['sports'][0] == expected_sport_1_cycling_result
|
||||
|
||||
def test_it_gets_a_sport_with_preferences(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(app)
|
||||
|
||||
response = client.get(
|
||||
'/api/sports/1',
|
||||
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']['sports']) == 1
|
||||
assert data['data']['sports'][0] == expected_sport_1_cycling_result
|
||||
|
||||
def test_it_returns_404_if_sport_does_not_exist(
|
||||
self, app: Flask, user_1: User
|
||||
) -> None:
|
||||
@ -202,6 +265,7 @@ class TestUpdateSport(ApiTestCaseMixin):
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is False
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is False
|
||||
assert data['data']['sports'][0]['has_workouts'] is False
|
||||
|
||||
def test_it_enables_a_sport(
|
||||
@ -224,6 +288,7 @@ class TestUpdateSport(ApiTestCaseMixin):
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is True
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is True
|
||||
assert data['data']['sports'][0]['has_workouts'] is False
|
||||
|
||||
def test_it_disables_a_sport_with_workouts(
|
||||
@ -249,6 +314,7 @@ class TestUpdateSport(ApiTestCaseMixin):
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is False
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is False
|
||||
assert data['data']['sports'][0]['has_workouts'] is True
|
||||
|
||||
def test_it_enables_a_sport_with_workouts(
|
||||
@ -275,8 +341,63 @@ class TestUpdateSport(ApiTestCaseMixin):
|
||||
assert 'success' in data['status']
|
||||
assert len(data['data']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is True
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is True
|
||||
assert data['data']['sports'][0]['has_workouts'] is True
|
||||
|
||||
def test_it_disables_a_sport_with_preferences(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1_admin: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_admin_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, as_admin=True
|
||||
)
|
||||
|
||||
response = client.patch(
|
||||
'/api/sports/1',
|
||||
content_type='application/json',
|
||||
data=json.dumps(dict(is_active=False)),
|
||||
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']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is False
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is False
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is False
|
||||
assert data['data']['sports'][0]['has_workouts'] is False
|
||||
|
||||
def test_it_enables_a_sport_with_preferences(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1_admin: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_admin_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
sport_1_cycling.is_active = False
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, as_admin=True
|
||||
)
|
||||
|
||||
response = client.patch(
|
||||
'/api/sports/1',
|
||||
content_type='application/json',
|
||||
data=json.dumps(dict(is_active=True)),
|
||||
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']['sports']) == 1
|
||||
assert data['data']['sports'][0]['is_active'] is True
|
||||
assert data['data']['sports'][0]['is_active_for_user'] is True
|
||||
assert data['data']['sports'][0]['has_workouts'] is False
|
||||
|
||||
def test_returns_error_if_user_has_no_admin_rights(
|
||||
self, app: Flask, user_1: User, sport_1_cycling: Sport
|
||||
) -> None:
|
||||
|
@ -2,7 +2,8 @@ from typing import Dict, Optional
|
||||
|
||||
from flask import Flask
|
||||
|
||||
from fittrackee.users.models import User
|
||||
from fittrackee import db
|
||||
from fittrackee.users.models import User, UserSportPreference
|
||||
from fittrackee.workouts.models import Sport, Workout
|
||||
|
||||
|
||||
@ -15,10 +16,13 @@ class TestSportModel:
|
||||
assert 'Cycling' == sport.label
|
||||
assert '<Sport \'Cycling\'>' == str(sport)
|
||||
|
||||
serialized_sport = sport.serialize(is_admin)
|
||||
serialized_sport = sport.serialize(is_admin=is_admin)
|
||||
assert 1 == serialized_sport['id']
|
||||
assert 'Cycling' == serialized_sport['label']
|
||||
assert serialized_sport['is_active'] is True
|
||||
assert serialized_sport['is_active_for_user'] is True
|
||||
assert serialized_sport['color'] is None
|
||||
assert serialized_sport['stopped_speed_threshold'] == 1
|
||||
return serialized_sport
|
||||
|
||||
def test_sport_model(self, app: Flask, sport_1_cycling: Sport) -> None:
|
||||
@ -44,3 +48,87 @@ class TestSportModel:
|
||||
) -> None:
|
||||
serialized_sport = self.assert_sport_model(sport_1_cycling, True)
|
||||
assert serialized_sport['has_workouts'] is True
|
||||
|
||||
|
||||
class TestSportModelWithPreferences:
|
||||
def test_sport_model_with_color_preference(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
user_sport_1_preference.color = '#00000'
|
||||
|
||||
serialized_sport = sport_1_cycling.serialize(
|
||||
sport_preferences=user_sport_1_preference.serialize()
|
||||
)
|
||||
assert serialized_sport['id'] == 1
|
||||
assert serialized_sport['label'] == 'Cycling'
|
||||
assert serialized_sport['is_active'] is True
|
||||
assert serialized_sport['is_active_for_user'] is True
|
||||
assert serialized_sport['color'] == '#00000'
|
||||
assert serialized_sport['stopped_speed_threshold'] == 1
|
||||
assert 'has_workouts' not in serialized_sport
|
||||
|
||||
def test_sport_model_with_is_active_preference(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
user_sport_1_preference.is_active = False
|
||||
|
||||
serialized_sport = sport_1_cycling.serialize(
|
||||
sport_preferences=user_sport_1_preference.serialize()
|
||||
)
|
||||
assert serialized_sport['id'] == 1
|
||||
assert serialized_sport['label'] == 'Cycling'
|
||||
assert serialized_sport['is_active'] is True
|
||||
assert serialized_sport['is_active_for_user'] is False
|
||||
assert serialized_sport['color'] is None
|
||||
assert serialized_sport['stopped_speed_threshold'] == 1
|
||||
assert 'has_workouts' not in serialized_sport
|
||||
|
||||
def test_inactive_sport_model_with_is_active_preference(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
sport_1_cycling.is_active = False
|
||||
user_sport_1_preference.is_active = True
|
||||
|
||||
serialized_sport = sport_1_cycling.serialize(
|
||||
sport_preferences=user_sport_1_preference.serialize()
|
||||
)
|
||||
assert serialized_sport['id'] == 1
|
||||
assert serialized_sport['label'] == 'Cycling'
|
||||
assert serialized_sport['is_active'] is False
|
||||
assert serialized_sport['is_active_for_user'] is False
|
||||
assert serialized_sport['color'] is None
|
||||
assert serialized_sport['stopped_speed_threshold'] == 1
|
||||
assert 'has_workouts' not in serialized_sport
|
||||
|
||||
def test_sport_model_with_threshold_preference(
|
||||
self,
|
||||
app: Flask,
|
||||
user_1: User,
|
||||
sport_1_cycling: Sport,
|
||||
user_sport_1_preference: UserSportPreference,
|
||||
) -> None:
|
||||
user_sport_1_preference.stopped_speed_threshold = 0.5
|
||||
db.session.commit()
|
||||
|
||||
serialized_sport = sport_1_cycling.serialize(
|
||||
sport_preferences=user_sport_1_preference.serialize()
|
||||
)
|
||||
assert serialized_sport['id'] == 1
|
||||
assert serialized_sport['label'] == 'Cycling'
|
||||
assert serialized_sport['is_active'] is True
|
||||
assert serialized_sport['is_active_for_user'] is True
|
||||
assert serialized_sport['color'] is None
|
||||
assert serialized_sport['stopped_speed_threshold'] == 0.5
|
||||
assert 'has_workouts' not in serialized_sport
|
||||
|
Reference in New Issue
Block a user