From 1245a64e182eedfee90c6c2ee207f1ba1cf95180 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 12 Mar 2022 17:56:06 +0100 Subject: [PATCH 1/2] API - test refacto (auth method to get client and token) --- fittrackee/tests/api_test_case.py | 11 +- .../tests/application/test_app_config_api.py | 28 +-- fittrackee/tests/users/test_auth_api.py | 116 +++++++++---- fittrackee/tests/users/test_users_api.py | 134 ++++++++++----- fittrackee/tests/workouts/test_records_api.py | 20 ++- fittrackee/tests/workouts/test_sports_api.py | 50 ++++-- fittrackee/tests/workouts/test_stats_api.py | 96 ++++++++--- .../tests/workouts/test_workouts_api_0_get.py | 160 +++++++++++++----- .../workouts/test_workouts_api_1_post.py | 132 +++++++++++---- .../workouts/test_workouts_api_2_patch.py | 36 +++- .../workouts/test_workouts_api_3_delete.py | 8 +- 11 files changed, 570 insertions(+), 221 deletions(-) diff --git a/fittrackee/tests/api_test_case.py b/fittrackee/tests/api_test_case.py index e62fffcc..8021f097 100644 --- a/fittrackee/tests/api_test_case.py +++ b/fittrackee/tests/api_test_case.py @@ -8,15 +8,20 @@ from flask.testing import FlaskClient class ApiTestCaseMixin: @staticmethod def get_test_client_and_auth_token( - app: Flask, as_admin: bool = False + app: Flask, user_email: str ) -> Tuple[FlaskClient, str]: + """user_email must be user_1 or user_2 email""" client = app.test_client() resp_login = client.post( '/api/auth/login', data=json.dumps( dict( - email='admin@example.com' if as_admin else 'test@test.com', - password='12345678', + email=user_email, + password=( + '87654321' + if user_email == 'toto@toto.com' + else '12345678' + ), ) ), content_type='application/json', diff --git a/fittrackee/tests/application/test_app_config_api.py b/fittrackee/tests/application/test_app_config_api.py index c17dac1c..a52dc422 100644 --- a/fittrackee/tests/application/test_app_config_api.py +++ b/fittrackee/tests/application/test_app_config_api.py @@ -12,7 +12,9 @@ class TestGetConfig(ApiTestCaseMixin): def test_it_gets_application_config( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/config', @@ -38,7 +40,7 @@ class TestGetConfig(ApiTestCaseMixin): self, app_no_config: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_no_config, as_admin=True + app_no_config, user_1_admin.email ) response = client.get( @@ -56,7 +58,7 @@ class TestGetConfig(ApiTestCaseMixin): self, app: Flask, app_config: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -76,7 +78,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( '/api/config', @@ -98,7 +100,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -127,7 +129,9 @@ class TestUpdateConfig(ApiTestCaseMixin): def test_it_returns_403_when_user_is_not_an_admin( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( '/api/config', @@ -146,7 +150,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -165,7 +169,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app_no_config: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_no_config, as_admin=True + app_no_config, user_1_admin.email ) response = client.patch( @@ -184,7 +188,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -213,7 +217,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app_with_max_file_size_equals_0: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_max_file_size_equals_0, as_admin=True + app_with_max_file_size_equals_0, user_1_admin.email ) response = client.patch( @@ -239,7 +243,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -265,7 +269,7 @@ class TestUpdateConfig(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( diff --git a/fittrackee/tests/users/test_auth_api.py b/fittrackee/tests/users/test_auth_api.py index 75241be2..010a696d 100644 --- a/fittrackee/tests/users/test_auth_api.py +++ b/fittrackee/tests/users/test_auth_api.py @@ -420,7 +420,9 @@ class TestUserLogin: class TestUserLogout(ApiTestCaseMixin): def test_user_can_logout(self, app: Flask, user_1: User) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/auth/logout', @@ -436,7 +438,9 @@ class TestUserLogout(ApiTestCaseMixin): self, app: Flask, user_1: User ) -> None: now = datetime.utcnow() - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) with freeze_time(now + timedelta(seconds=4)): response = client.get( @@ -471,7 +475,9 @@ class TestUserProfile(ApiTestCaseMixin): def test_it_returns_user_minimal_profile( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/auth/profile', @@ -500,7 +506,9 @@ class TestUserProfile(ApiTestCaseMixin): def test_it_returns_user_full_profile( self, app: Flask, user_1_full: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_full.email + ) response = client.get( '/api/auth/profile', @@ -540,7 +548,9 @@ class TestUserProfile(ApiTestCaseMixin): workout_cycling_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/auth/profile', @@ -577,7 +587,9 @@ class TestUserProfile(ApiTestCaseMixin): class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_updates_user_profile(self, app: Flask, user_1: User) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -623,7 +635,9 @@ class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_updates_user_profile_without_password( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -667,7 +681,9 @@ class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_returns_error_if_fields_are_missing( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -684,7 +700,9 @@ class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_returns_error_if_payload_is_empty( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -701,7 +719,9 @@ class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_returns_error_if_passwords_mismatch( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -731,7 +751,9 @@ class TestUserProfileUpdate(ApiTestCaseMixin): def test_it_returns_error_if_password_confirmation_is_missing( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit', @@ -762,7 +784,9 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin): def test_it_updates_user_preferences( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/preferences', @@ -805,7 +829,9 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_fields_are_missing( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/preferences', @@ -822,7 +848,9 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_payload_is_empty( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/preferences', @@ -841,7 +869,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_payload_is_empty( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -858,7 +888,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_sport_id_is_missing( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -875,7 +907,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_sport_not_found( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -892,7 +926,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_payload_contains_only_sport_id( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -909,7 +945,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_returns_error_if_color_is_invalid( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -939,7 +977,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): sport_2_running: Sport, input_color: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -966,7 +1006,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_disables_sport_for_auth_user( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -993,7 +1035,9 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): def test_it_updates_stopped_speed_threshold_for_auth_user( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/profile/edit/sports', @@ -1022,7 +1066,9 @@ class TestUserSportPreferencesReset(ApiTestCaseMixin): def test_it_returns_error_if_sport_does_not_exist( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( '/api/auth/profile/reset/sports/1', @@ -1041,7 +1087,9 @@ class TestUserSportPreferencesReset(ApiTestCaseMixin): sport_1_cycling: Sport, user_sport_1_preference: UserSportPreference, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( f'/api/auth/profile/reset/sports/{sport_1_cycling.id}', @@ -1060,7 +1108,9 @@ class TestUserSportPreferencesReset(ApiTestCaseMixin): def test_it_does_not_raise_error_if_sport_preferences_do_not_exist( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( f'/api/auth/profile/reset/sports/{sport_1_cycling.id}', @@ -1072,7 +1122,9 @@ class TestUserSportPreferencesReset(ApiTestCaseMixin): class TestUserPicture(ApiTestCaseMixin): def test_it_updates_user_picture(self, app: Flask, user_1: User) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/picture', @@ -1108,7 +1160,9 @@ class TestUserPicture(ApiTestCaseMixin): def test_it_returns_error_if_file_is_missing( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/picture', @@ -1126,7 +1180,9 @@ class TestUserPicture(ApiTestCaseMixin): def test_it_returns_error_if_file_is_invalid( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/auth/picture', @@ -1150,7 +1206,7 @@ class TestUserPicture(ApiTestCaseMixin): gpx_file: str, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_max_file_size + app_with_max_file_size, user_1.email ) response = client.post( @@ -1181,7 +1237,7 @@ class TestUserPicture(ApiTestCaseMixin): gpx_file: str, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_max_zip_file_size + app_with_max_zip_file_size, user_1.email ) response = client.post( diff --git a/fittrackee/tests/users/test_users_api.py b/fittrackee/tests/users/test_users_api.py index d6c41b52..6fc6432c 100644 --- a/fittrackee/tests/users/test_users_api.py +++ b/fittrackee/tests/users/test_users_api.py @@ -15,7 +15,9 @@ class TestGetUser(ApiTestCaseMixin): def test_it_gets_single_user_without_workouts( self, app: Flask, user_1: User, user_2: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/users/{user_2.username}', @@ -57,7 +59,9 @@ class TestGetUser(ApiTestCaseMixin): workout_cycling_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/users/{user_1.username}', @@ -93,7 +97,9 @@ class TestGetUser(ApiTestCaseMixin): def test_it_returns_error_if_user_does_not_exist( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users/not_existing', @@ -111,7 +117,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_get_users_list( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users', @@ -181,7 +189,9 @@ class TestGetUsers(ApiTestCaseMixin): workout_running_user_1: Workout, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users', @@ -244,7 +254,9 @@ class TestGetUsers(ApiTestCaseMixin): user_2: User, user_3: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?page=1', @@ -271,7 +283,9 @@ class TestGetUsers(ApiTestCaseMixin): user_2: User, user_3: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?page=2', @@ -297,7 +311,9 @@ class TestGetUsers(ApiTestCaseMixin): user_2: User, user_3: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?page=2', @@ -323,7 +339,9 @@ class TestGetUsers(ApiTestCaseMixin): user_2: User, user_3: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?per_page=2', @@ -349,7 +367,9 @@ class TestGetUsers(ApiTestCaseMixin): user_2: User, user_3: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?page=2&per_page=2', @@ -371,7 +391,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_gets_users_list_ordered_by_username( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=username', @@ -396,7 +418,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_gets_users_list_ordered_by_username_ascending( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=username&order=asc', @@ -421,7 +445,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_gets_users_list_ordered_by_username_descending( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=username&order=desc', @@ -450,7 +476,7 @@ class TestGetUsers(ApiTestCaseMixin): user_3.created_at = datetime.utcnow() - timedelta(hours=1) user_1_admin.created_at = datetime.utcnow() client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -480,7 +506,7 @@ class TestGetUsers(ApiTestCaseMixin): user_3.created_at = datetime.utcnow() - timedelta(hours=1) user_1_admin.created_at = datetime.utcnow() client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -510,7 +536,7 @@ class TestGetUsers(ApiTestCaseMixin): user_3.created_at = datetime.utcnow() - timedelta(hours=1) user_1_admin.created_at = datetime.utcnow() client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -537,7 +563,7 @@ class TestGetUsers(ApiTestCaseMixin): self, app: Flask, user_2: User, user_1_admin: User, user_3: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -564,7 +590,7 @@ class TestGetUsers(ApiTestCaseMixin): self, app: Flask, user_2: User, user_1_admin: User, user_3: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -591,7 +617,7 @@ class TestGetUsers(ApiTestCaseMixin): self, app: Flask, user_2: User, user_3: User, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -623,7 +649,9 @@ class TestGetUsers(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=workouts_count', @@ -657,7 +685,9 @@ class TestGetUsers(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=workouts_count&order=asc', @@ -691,7 +721,9 @@ class TestGetUsers(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=workouts_count&order=desc', @@ -719,7 +751,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_gets_users_list_filtering_on_username( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?q=toto', @@ -742,7 +776,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_returns_empty_users_list_filtering_on_username( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?q=not_existing', @@ -764,7 +800,9 @@ class TestGetUsers(ApiTestCaseMixin): def test_it_users_list_with_complex_query( self, app: Flask, user_1: User, user_2: User, user_3: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/users?order_by=username&order=desc&page=2&per_page=2', @@ -816,7 +854,7 @@ class TestUpdateUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -838,7 +876,7 @@ class TestUpdateUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -861,7 +899,7 @@ class TestUpdateUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -880,7 +918,7 @@ class TestUpdateUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -901,7 +939,9 @@ class TestUpdateUser(ApiTestCaseMixin): def test_it_returns_error_if_user_can_not_change_admin_rights( self, app: Flask, user_1: User, user_2: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( '/api/users/toto', @@ -920,7 +960,9 @@ class TestDeleteUser(ApiTestCaseMixin): def test_user_can_delete_its_own_account( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( '/api/users/test', @@ -932,7 +974,9 @@ class TestDeleteUser(ApiTestCaseMixin): def test_user_with_workout_can_delete_its_own_account( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) client.post( '/api/workouts', data=dict( @@ -959,7 +1003,9 @@ class TestDeleteUser(ApiTestCaseMixin): sport_1_cycling: Sport, user_sport_1_preference: UserSportPreference, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( '/api/users/test', @@ -971,7 +1017,9 @@ class TestDeleteUser(ApiTestCaseMixin): def test_user_with_picture_can_delete_its_own_account( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) client.post( '/api/auth/picture', data=dict(file=(BytesIO(b'avatar'), 'avatar.png')), @@ -991,7 +1039,9 @@ class TestDeleteUser(ApiTestCaseMixin): def test_user_can_not_delete_another_user_account( self, app: Flask, user_1: User, user_2: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( '/api/users/toto', @@ -1006,7 +1056,9 @@ class TestDeleteUser(ApiTestCaseMixin): def test_it_returns_error_when_deleting_non_existing_user( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( '/api/users/not_existing', @@ -1022,7 +1074,7 @@ class TestDeleteUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.delete( @@ -1036,7 +1088,7 @@ class TestDeleteUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.delete( @@ -1050,7 +1102,7 @@ class TestDeleteUser(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.delete( @@ -1074,7 +1126,7 @@ class TestDeleteUser(ApiTestCaseMixin): user_3: User, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_3_users_max, as_admin=True + app_with_3_users_max, user_1_admin.email ) client.delete( '/api/users/toto', @@ -1104,7 +1156,7 @@ class TestDeleteUser(ApiTestCaseMixin): user_1_paris: User, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_3_users_max, as_admin=True + app_with_3_users_max, user_1_admin.email ) client.delete( diff --git a/fittrackee/tests/workouts/test_records_api.py b/fittrackee/tests/workouts/test_records_api.py index f6e6f259..eb7ce221 100644 --- a/fittrackee/tests/workouts/test_records_api.py +++ b/fittrackee/tests/workouts/test_records_api.py @@ -19,7 +19,9 @@ class TestGetRecords(ApiTestCaseMixin): workout_cycling_user_1: Workout, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/records', @@ -92,7 +94,9 @@ class TestGetRecords(ApiTestCaseMixin): sport_2_running: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/records', @@ -111,7 +115,9 @@ class TestGetRecords(ApiTestCaseMixin): sport_1_cycling: Sport, sport_2_running: Sport, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) client.post( '/api/workouts/no_gpx', @@ -141,7 +147,9 @@ class TestGetRecords(ApiTestCaseMixin): def test_it_gets_updated_records_after_workouts_post_and_patch( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + 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', @@ -628,7 +636,9 @@ class TestGetRecords(ApiTestCaseMixin): sport_1_cycling: Sport, sport_2_running: Sport, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', diff --git a/fittrackee/tests/workouts/test_sports_api.py b/fittrackee/tests/workouts/test_sports_api.py index 765e883e..cdce3e52 100644 --- a/fittrackee/tests/workouts/test_sports_api.py +++ b/fittrackee/tests/workouts/test_sports_api.py @@ -52,7 +52,9 @@ class TestGetSports(ApiTestCaseMixin): sport_1_cycling: Sport, sport_2_running: Sport, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports', @@ -73,7 +75,9 @@ class TestGetSports(ApiTestCaseMixin): sport_1_cycling_inactive: Sport, sport_2_running: Sport, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports', @@ -98,7 +102,7 @@ class TestGetSports(ApiTestCaseMixin): sport_2_running: Sport, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -132,7 +136,7 @@ class TestGetSports(ApiTestCaseMixin): db.session.commit() client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -156,7 +160,9 @@ class TestGetSport(ApiTestCaseMixin): def test_it_gets_a_sport( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports/1', @@ -176,7 +182,9 @@ class TestGetSport(ApiTestCaseMixin): sport_1_cycling: Sport, user_sport_1_preference: UserSportPreference, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports/1', @@ -192,7 +200,9 @@ class TestGetSport(ApiTestCaseMixin): def test_it_returns_404_if_sport_does_not_exist( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports/1', @@ -207,7 +217,9 @@ class TestGetSport(ApiTestCaseMixin): def test_it_gets_a_inactive_sport( self, app: Flask, user_1: User, sport_1_cycling_inactive: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/sports/1', @@ -227,7 +239,7 @@ class TestGetSport(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, sport_1_cycling_inactive: Sport ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -250,7 +262,7 @@ class TestUpdateSport(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, sport_1_cycling: Sport ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -273,7 +285,7 @@ class TestUpdateSport(ApiTestCaseMixin): ) -> None: sport_1_cycling.is_active = False client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -299,7 +311,7 @@ class TestUpdateSport(ApiTestCaseMixin): workout_cycling_user_1: Workout, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -326,7 +338,7 @@ class TestUpdateSport(ApiTestCaseMixin): ) -> None: sport_1_cycling.is_active = False client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -352,7 +364,7 @@ class TestUpdateSport(ApiTestCaseMixin): user_admin_sport_1_preference: UserSportPreference, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -380,7 +392,7 @@ class TestUpdateSport(ApiTestCaseMixin): ) -> None: sport_1_cycling.is_active = False client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -401,7 +413,9 @@ class TestUpdateSport(ApiTestCaseMixin): def test_returns_error_if_user_has_no_admin_rights( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( '/api/sports/1', @@ -420,7 +434,7 @@ class TestUpdateSport(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( @@ -439,7 +453,7 @@ class TestUpdateSport(ApiTestCaseMixin): self, app: Flask, user_1_admin: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.patch( diff --git a/fittrackee/tests/workouts/test_stats_api.py b/fittrackee/tests/workouts/test_stats_api.py index 810fe50c..9421345c 100644 --- a/fittrackee/tests/workouts/test_stats_api.py +++ b/fittrackee/tests/workouts/test_stats_api.py @@ -12,7 +12,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): def test_it_gets_no_stats_when_user_has_no_workouts( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time', @@ -27,7 +29,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): def test_it_returns_error_when_user_does_not_exists( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/stats/1000/by_time', @@ -48,7 +52,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( ( @@ -75,7 +81,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30&time=day', # noqa @@ -96,7 +104,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time', @@ -146,7 +156,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30', # noqa @@ -186,7 +198,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_paris.email + ) response = client.get( f'/api/stats/{user_1_paris.username}/by_time?' @@ -227,7 +241,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?time=year', @@ -277,7 +293,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30&time=year', # noqa @@ -318,7 +336,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_paris.email + ) response = client.get( f'/api/stats/{user_1_paris.username}/by_time?from=2018-04-01&to=2018-04-30&time=year', # noqa @@ -358,7 +378,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?time=month', @@ -448,7 +470,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_full.email + ) response = client.get( f'/api/stats/{user_1_full.username}/by_time?time=month', @@ -538,7 +562,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30&time=month', # noqa @@ -578,7 +604,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_full.email + ) response = client.get( f'/api/stats/{user_1_full.username}/by_time?time=week', @@ -668,7 +696,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30&time=week', # noqa @@ -708,7 +738,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?time=weekm', @@ -798,7 +830,9 @@ class TestGetStatsByTime(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_time?from=2018-04-01&to=2018-04-30&time=weekm', # noqa @@ -840,7 +874,9 @@ class TestGetStatsBySport(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_sport', @@ -878,7 +914,9 @@ class TestGetStatsBySport(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_sport?sport_id=1', @@ -908,7 +946,9 @@ class TestGetStatsBySport(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/stats/1000/by_sport?sport_id=1', @@ -929,7 +969,9 @@ class TestGetStatsBySport(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_sport?sport_id=999', @@ -950,7 +992,9 @@ class TestGetStatsBySport(ApiTestCaseMixin): seven_workouts_user_1: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/stats/{user_1.username}/by_sport?sport_id="999', @@ -971,7 +1015,7 @@ class TestGetAllStats(ApiTestCaseMixin): self, app: Flask, user_1_admin: User, user_2: User ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -1000,7 +1044,7 @@ class TestGetAllStats(ApiTestCaseMixin): workout_running_user_1: Workout, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app, as_admin=True + app, user_1_admin.email ) response = client.get( @@ -1028,7 +1072,9 @@ class TestGetAllStats(ApiTestCaseMixin): workout_cycling_user_2: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/stats/all', diff --git a/fittrackee/tests/workouts/test_workouts_api_0_get.py b/fittrackee/tests/workouts/test_workouts_api_0_get.py index 5aa08b0e..ba4c0ac9 100644 --- a/fittrackee/tests/workouts/test_workouts_api_0_get.py +++ b/fittrackee/tests/workouts/test_workouts_api_0_get.py @@ -23,7 +23,9 @@ class TestGetWorkouts(ApiTestCaseMixin): workout_cycling_user_2: Workout, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts', @@ -119,7 +121,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts', @@ -157,7 +161,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?page=1', @@ -195,7 +201,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?page=2', @@ -233,7 +241,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?page=3', @@ -259,7 +269,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?page=A', @@ -282,7 +294,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?per_page=10', @@ -317,7 +331,9 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?per_page=3', @@ -353,7 +369,9 @@ class TestGetWorkoutsWithOrder(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts', @@ -387,7 +405,9 @@ class TestGetWorkoutsWithOrder(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order=asc', @@ -421,7 +441,9 @@ class TestGetWorkoutsWithOrder(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order=desc', @@ -457,7 +479,9 @@ class TestGetWorkoutsWithOrderBy(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order_by=workout_date', @@ -491,7 +515,9 @@ class TestGetWorkoutsWithOrderBy(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order_by=distance', @@ -519,7 +545,9 @@ class TestGetWorkoutsWithOrderBy(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order_by=duration', @@ -547,7 +575,9 @@ class TestGetWorkoutsWithOrderBy(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?order_by=ave_speed', @@ -577,7 +607,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?from=2018-02-01&to=2018-02-28', @@ -615,7 +647,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?from=2018-03-01&to=2018-03-30', @@ -641,7 +675,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?from=2018-04-01', @@ -676,7 +712,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?to=2017-12-31', @@ -710,7 +748,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?distance_from=5&distance_to=8.1', @@ -744,7 +784,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?duration_from=00:52&duration_to=01:20', @@ -774,7 +816,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?ave_speed_from=5&ave_speed_to=10', @@ -808,7 +852,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): ) -> None: workout_cycling_user_1.max_speed = 25 workout_running_user_1.max_speed = 11 - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?max_speed_from=10&max_speed_to=20', @@ -840,7 +886,9 @@ class TestGetWorkoutsWithFilters(ApiTestCaseMixin): sport_2_running: Sport, workout_running_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?sport_id=2', @@ -872,7 +920,9 @@ class TestGetWorkoutsWithFiltersAndPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?from=2017-01-01&page=2', @@ -906,7 +956,9 @@ class TestGetWorkoutsWithFiltersAndPagination(ApiTestCaseMixin): sport_1_cycling: Sport, seven_workouts_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( '/api/workouts?from=2017-01-01&page=2&order=asc', @@ -942,7 +994,9 @@ class TestGetWorkout(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_1.short_id}', @@ -971,7 +1025,9 @@ class TestGetWorkout(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_2.short_id}', @@ -986,7 +1042,9 @@ class TestGetWorkout(ApiTestCaseMixin): def test_it_returns_404_if_workout_does_not_exist( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{get_random_short_id()}', @@ -1002,7 +1060,9 @@ class TestGetWorkout(ApiTestCaseMixin): self, app: Flask, user_1: User ) -> None: random_short_id = get_random_short_id() - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{random_short_id}/gpx', @@ -1019,7 +1079,9 @@ class TestGetWorkout(ApiTestCaseMixin): self, app: Flask, user_1: User ) -> None: random_short_id = get_random_short_id() - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{random_short_id}/chart_data', @@ -1040,7 +1102,9 @@ class TestGetWorkout(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_short_id}/gpx', @@ -1063,7 +1127,9 @@ class TestGetWorkout(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_short_id}/chart_data', @@ -1086,7 +1152,9 @@ class TestGetWorkout(ApiTestCaseMixin): workout_cycling_user_1: Workout, ) -> None: workout_cycling_user_1.gpx = "some path" - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_1.short_id}/gpx', @@ -1110,7 +1178,9 @@ class TestGetWorkout(ApiTestCaseMixin): workout_cycling_user_1: Workout, ) -> None: workout_cycling_user_1.gpx = 'some path' - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_1.short_id}/chart_data', @@ -1129,7 +1199,9 @@ class TestGetWorkout(ApiTestCaseMixin): def test_it_returns_404_if_workout_has_no_map( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/map/{uuid4().hex}', headers=dict(Authorization=f'Bearer {auth_token}'), @@ -1147,7 +1219,9 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): app: Flask, user_1: User, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{get_random_short_id()}/gpx/download', @@ -1166,7 +1240,9 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_1.short_id}/gpx/download', @@ -1186,7 +1262,9 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.get( f'/api/workouts/{workout_cycling_user_2.short_id}/gpx/download', @@ -1209,7 +1287,9 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): workout_cycling_user_1.gpx = gpx_file_path with patch('fittrackee.workouts.workouts.send_from_directory') as mock: mock.return_value = 'file' - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) client.get( ( diff --git a/fittrackee/tests/workouts/test_workouts_api_1_post.py b/fittrackee/tests/workouts/test_workouts_api_1_post.py index 740581f8..bce80688 100644 --- a/fittrackee/tests/workouts/test_workouts_api_1_post.py +++ b/fittrackee/tests/workouts/test_workouts_api_1_post.py @@ -210,7 +210,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): def test_it_adds_an_workout_with_gpx_file( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -238,7 +240,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): sport_1_cycling: Sport, gpx_file_wo_name: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -270,7 +274,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): gpx_file_wo_name: str, ) -> None: user_1.timezone = 'Europe/Paris' - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -311,7 +317,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): sport_1_cycling: Sport, gpx_file: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -339,7 +347,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): gpx_file: str, static_map_get_mock: Mock, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) client.post( '/api/workouts', data=dict( @@ -369,7 +379,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): static_map_get_mock: Mock, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_default_static_map + app_default_static_map, user_1.email ) client.post( '/api/workouts', @@ -398,7 +408,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): sport_1_cycling: Sport, gpx_file_wo_track: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -425,7 +437,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): sport_1_cycling: Sport, gpx_file_invalid_xml: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -451,7 +465,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): def test_it_returns_400_if_workout_gpx_has_invalid_extension( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -473,7 +489,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): def test_it_returns_400_if_sport_id_is_not_provided( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -494,7 +512,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): def test_it_returns_500_if_sport_id_does_not_exists( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -516,7 +536,9 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): def test_returns_400_if_no_gpx_file_is_provided( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -540,7 +562,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): gpx_file: str, ) -> None: client, auth_token = self.get_test_client_and_auth_token( - app_with_max_file_size + app_with_max_file_size, user_1.email ) response = client.post( @@ -568,7 +590,9 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_adds_an_workout_without_gpx( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -593,7 +617,9 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_returns_400_if_workout_date_is_missing( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -610,7 +636,9 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_returns_500_if_workout_format_is_invalid( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -638,7 +666,9 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, sport_2_running: Sport, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -690,7 +720,9 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): file_path = os.path.join(app.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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -719,7 +751,9 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): # 'gpx_test_folder.zip' contains 3 gpx files (same data) and 1 non-gpx # file in a folder with open(file_path, 'rb') as zip_file: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -746,7 +780,9 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): ) # 'gpx_test_incorrect.zip' contains 2 gpx files, one is incorrect with open(file_path, 'rb') as zip_file: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -778,7 +814,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): # '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_workouts + app_with_max_workouts, user_1.email ) client.post( @@ -811,7 +847,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): # '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_zip_file_size + app_with_max_zip_file_size, user_1.email ) response = client.post( @@ -836,9 +872,11 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): def workout_assertion( - self, app: Flask, gpx_file: str, with_segments: bool + self, app: Flask, user_1: User, gpx_file: str, with_segments: bool ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', data=dict( @@ -917,7 +955,7 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): def test_it_gets_an_workout_created_with_gpx( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str ) -> None: - return self.workout_assertion(app, gpx_file, False) + return self.workout_assertion(app, user_1, gpx_file, False) def test_it_gets_an_workout_created_with_gpx_with_segments( self, @@ -926,12 +964,16 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): sport_1_cycling: Sport, gpx_file_with_segments: str, ) -> None: - return self.workout_assertion(app, gpx_file_with_segments, True) + return self.workout_assertion( + app, user_1, gpx_file_with_segments, True + ) def test_it_gets_chart_data_for_an_workout_created_with_gpx( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -960,7 +1002,9 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): def test_it_gets_segment_chart_data_for_an_workout_created_with_gpx( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -994,7 +1038,9 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): sport_1_cycling: Sport, gpx_file: str, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', data=dict( @@ -1030,7 +1076,9 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): def test_it_returns_500_on_invalid_segment_id( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -1059,7 +1107,9 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): def test_it_returns_404_if_segment_id_does_not_exist( 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts', @@ -1090,7 +1140,9 @@ class TestPostAndGetWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_add_and_gets_an_workout_wo_gpx( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -1121,7 +1173,9 @@ class TestPostAndGetWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_adds_and_gets_an_workout_wo_gpx_notes( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -1156,7 +1210,9 @@ class TestPostAndGetWorkoutUsingTimezones(ApiTestCaseMixin): self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: user_1.timezone = 'Europe/Paris' - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.post( '/api/workouts/no_gpx', @@ -1194,7 +1250,9 @@ class TestPostAndGetWorkoutUsingTimezones(ApiTestCaseMixin): def test_it_adds_and_gets_workouts_date_filter_with_timezone_new_york( self, app: Flask, user_1_full: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_full.email + ) client.post( '/api/workouts/no_gpx', @@ -1234,7 +1292,9 @@ class TestPostAndGetWorkoutUsingTimezones(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_paris.email + ) client.post( '/api/workouts/no_gpx', diff --git a/fittrackee/tests/workouts/test_workouts_api_2_patch.py b/fittrackee/tests/workouts/test_workouts_api_2_patch.py index 45676536..d9055f00 100644 --- a/fittrackee/tests/workouts/test_workouts_api_2_patch.py +++ b/fittrackee/tests/workouts/test_workouts_api_2_patch.py @@ -250,7 +250,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{workout_short_id}', @@ -337,7 +339,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{workout_short_id}', @@ -361,7 +365,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): ) -> None: workout_short_id = workout_cycling_user_1.short_id workout_cycling_user_1.notes = uuid4().hex - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{workout_short_id}', @@ -384,7 +390,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_2: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{workout_cycling_user_2.short_id}', @@ -415,7 +423,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1_paris.email + ) response = client.patch( f'/api/workouts/{workout_short_id}', @@ -488,7 +498,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): 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) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{workout_short_id}', @@ -551,7 +563,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + 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}', @@ -572,7 +586,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + 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', @@ -599,7 +615,9 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): def test_it_returns_404_if_edited_workout_does_not_exists( self, app: Flask, user_1: User, sport_1_cycling: Sport ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.patch( f'/api/workouts/{get_random_short_id()}', content_type='application/json', diff --git a/fittrackee/tests/workouts/test_workouts_api_3_delete.py b/fittrackee/tests/workouts/test_workouts_api_3_delete.py index 4b1aba91..b739ead4 100644 --- a/fittrackee/tests/workouts/test_workouts_api_3_delete.py +++ b/fittrackee/tests/workouts/test_workouts_api_3_delete.py @@ -63,7 +63,9 @@ class TestDeleteWorkoutWithGpx(ApiTestCaseMixin): def test_it_returns_404_if_workout_does_not_exist( self, app: Flask, user_1: User ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( f'/api/workouts/{get_random_short_id()}', headers=dict(Authorization=f'Bearer {auth_token}'), @@ -104,7 +106,9 @@ class TestDeleteWorkoutWithoutGpx(ApiTestCaseMixin): sport_1_cycling: Sport, workout_cycling_user_1: Workout, ) -> None: - client, auth_token = self.get_test_client_and_auth_token(app) + client, auth_token = self.get_test_client_and_auth_token( + app, user_1.email + ) response = client.delete( f'/api/workouts/{workout_cycling_user_1.short_id}', headers=dict(Authorization=f'Bearer {auth_token}'), From 2de9cb1857530050f498f7ef116b005b3077e521 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 13 Mar 2022 08:36:49 +0100 Subject: [PATCH 2/2] API - test refacto (response errors assertion) --- fittrackee/tests/api_test_case.py | 73 ++++- .../tests/application/test_app_config_api.py | 64 ++-- fittrackee/tests/conftest.py | 8 + fittrackee/tests/custom_asserts.py | 24 ++ fittrackee/tests/users/test_auth_api.py | 289 +++++------------- fittrackee/tests/users/test_users_api.py | 59 +--- fittrackee/tests/workouts/test_sports_api.py | 19 +- fittrackee/tests/workouts/test_stats_api.py | 42 +-- .../tests/workouts/test_workouts_api_0_get.py | 88 ++---- .../workouts/test_workouts_api_1_post.py | 100 ++---- .../workouts/test_workouts_api_2_patch.py | 41 +-- .../workouts/test_workouts_api_3_delete.py | 26 +- 12 files changed, 281 insertions(+), 552 deletions(-) create mode 100644 fittrackee/tests/custom_asserts.py diff --git a/fittrackee/tests/api_test_case.py b/fittrackee/tests/api_test_case.py index 8021f097..9683a933 100644 --- a/fittrackee/tests/api_test_case.py +++ b/fittrackee/tests/api_test_case.py @@ -1,8 +1,11 @@ import json -from typing import Any, Tuple +from typing import Any, Dict, Optional, Tuple from flask import Flask from flask.testing import FlaskClient +from werkzeug.test import TestResponse + +from .custom_asserts import assert_errored_response class ApiTestCaseMixin: @@ -29,6 +32,74 @@ class ApiTestCaseMixin: auth_token = json.loads(resp_login.data.decode())['auth_token'] return client, auth_token + @staticmethod + def assert_400( + response: TestResponse, + error_message: Optional[str] = 'invalid payload', + status: Optional[str] = 'error', + ) -> Dict: + return assert_errored_response( + response, 400, error_message=error_message, status=status + ) + + @staticmethod + def assert_401(response: TestResponse, error_message: str) -> Dict: + return assert_errored_response( + response, 401, error_message=error_message + ) + + @staticmethod + def assert_403( + response: TestResponse, + error_message: Optional[str] = 'you do not have permissions', + ) -> Dict: + return assert_errored_response(response, 403, error_message) + + @staticmethod + def assert_404(response: TestResponse) -> Dict: + return assert_errored_response(response, 404, status='not found') + + @staticmethod + def assert_404_with_entity(response: TestResponse, entity: str) -> Dict: + error_message = f'{entity} does not exist' + return assert_errored_response( + response, 404, error_message=error_message, status='not found' + ) + + @staticmethod + def assert_404_with_message( + response: TestResponse, error_message: str + ) -> Dict: + return assert_errored_response( + response, 404, error_message=error_message, status='not found' + ) + + @staticmethod + def assert_413( + response: TestResponse, + error_message: Optional[str] = None, + match: Optional[str] = None, + ) -> Dict: + return assert_errored_response( + response, + 413, + error_message=error_message, + status='fail', + match=match, + ) + + @staticmethod + def assert_500( + response: TestResponse, + error_message: Optional[str] = ( + 'error, please try again or contact the administrator' + ), + status: Optional[str] = 'error', + ) -> Dict: + return assert_errored_response( + response, 500, error_message=error_message, status=status + ) + class CallArgsMixin: @staticmethod diff --git a/fittrackee/tests/application/test_app_config_api.py b/fittrackee/tests/application/test_app_config_api.py index a52dc422..9cfddaa0 100644 --- a/fittrackee/tests/application/test_app_config_api.py +++ b/fittrackee/tests/application/test_app_config_api.py @@ -49,10 +49,7 @@ class TestGetConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'error on getting configuration' in data['message'] + self.assert_500(response, 'error on getting configuration') def test_it_returns_error_if_application_has_several_config( self, app: Flask, app_config: Flask, user_1_admin: User @@ -67,10 +64,7 @@ class TestGetConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'error on getting configuration' in data['message'] + self.assert_500(response, 'error on getting configuration') class TestUpdateConfig(ApiTestCaseMixin): @@ -140,11 +134,7 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'success' not in data['status'] - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_returns_400_if_invalid_is_payload( self, app: Flask, user_1_admin: User @@ -160,10 +150,7 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_returns_error_on_update_if_application_has_no_config( self, app_no_config: Flask, user_1_admin: User @@ -179,10 +166,7 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'error when updating configuration' in data['message'] + self.assert_500(response, 'error when updating configuration') def test_it_raises_error_if_archive_max_size_is_below_files_max_size( self, app: Flask, user_1_admin: User @@ -205,13 +189,13 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert ( - 'Max. size of zip archive must be equal or greater than max. size ' - 'of uploaded files' - ) in data['message'] + self.assert_400( + response, + ( + 'Max. size of zip archive must be equal or greater than max.' + ' size of uploaded files' + ), + ) def test_it_raises_error_if_archive_max_size_equals_0( self, app_with_max_file_size_equals_0: Flask, user_1_admin: User @@ -231,12 +215,8 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert ( - 'Max. size of zip archive must be greater than 0' - in data['message'] + self.assert_400( + response, 'Max. size of zip archive must be greater than 0' ) def test_it_raises_error_if_files_max_size_equals_0( @@ -257,12 +237,8 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert ( - 'Max. size of uploaded files must be greater than 0' - in data['message'] + self.assert_400( + response, 'Max. size of uploaded files must be greater than 0' ) def test_it_raises_error_if_gpx_limit_import_equals_0( @@ -283,10 +259,6 @@ class TestUpdateConfig(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert ( - 'Max. files in a zip archive must be greater than 0' - in data['message'] + self.assert_400( + response, 'Max. files in a zip archive must be greater than 0' ) diff --git a/fittrackee/tests/conftest.py b/fittrackee/tests/conftest.py index 46b610fd..2cc0ae74 100644 --- a/fittrackee/tests/conftest.py +++ b/fittrackee/tests/conftest.py @@ -1,5 +1,8 @@ import os +import pytest +from werkzeug.test import TestResponse + os.environ['FLASK_ENV'] = 'testing' os.environ['APP_SETTINGS'] = 'fittrackee.config.TestingConfig' # to avoid resetting dev database during tests @@ -10,3 +13,8 @@ pytest_plugins = [ 'fittrackee.tests.fixtures.fixtures_workouts', 'fittrackee.tests.fixtures.fixtures_users', ] + +pytest.register_assert_rewrite('fittrackee.tests.custom_asserts') + +# Prevent pytest from collecting TestResponse as test +TestResponse.__test__ = False # type: ignore diff --git a/fittrackee/tests/custom_asserts.py b/fittrackee/tests/custom_asserts.py new file mode 100644 index 00000000..168dd073 --- /dev/null +++ b/fittrackee/tests/custom_asserts.py @@ -0,0 +1,24 @@ +import json +import re +from typing import Dict, Optional + +from werkzeug.test import TestResponse + + +def assert_errored_response( + response: TestResponse, + status_code: int, + error_message: Optional[str] = None, + status: Optional[str] = 'error', + match: Optional[str] = None, +) -> Dict: + assert response.content_type == 'application/json' + assert response.status_code == status_code + + data = json.loads(response.data.decode()) + assert status in data['status'] + if error_message is not None: + assert error_message in data['message'] + if match is not None: + assert re.match(match, data['message']) + return data diff --git a/fittrackee/tests/users/test_auth_api.py b/fittrackee/tests/users/test_auth_api.py index 010a696d..79c67e50 100644 --- a/fittrackee/tests/users/test_auth_api.py +++ b/fittrackee/tests/users/test_auth_api.py @@ -14,7 +14,7 @@ from fittrackee.workouts.models import Sport, Workout from ..api_test_case import ApiTestCaseMixin -class TestUserRegistration: +class TestUserRegistration(ApiTestCaseMixin): def test_user_can_register(self, app: Flask) -> None: client = app.test_client() @@ -58,11 +58,8 @@ class TestUserRegistration: ), content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'sorry, that user already exists' - assert response.content_type == 'application/json' - assert response.status_code == 400 + + self.assert_400(response, 'sorry, that user already exists') @pytest.mark.parametrize( 'input_email', @@ -84,11 +81,8 @@ class TestUserRegistration: ), content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'sorry, that user already exists' - assert response.content_type == 'application/json' - assert response.status_code == 400 + + self.assert_400(response, 'sorry, that user already exists') def test_it_returns_error_if_username_is_too_short( self, app: Flask @@ -108,11 +102,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == "username: 3 to 12 characters required\n" - assert response.content_type == 'application/json' - assert response.status_code == 400 + self.assert_400(response, "username: 3 to 12 characters required\n") def test_it_returns_error_if_username_is_too_long( self, app: Flask @@ -130,11 +120,8 @@ class TestUserRegistration: ), content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == "username: 3 to 12 characters required\n" - assert response.content_type == 'application/json' - assert response.status_code == 400 + + self.assert_400(response, "username: 3 to 12 characters required\n") def test_it_returns_error_if_email_is_invalid(self, app: Flask) -> None: client = app.test_client() @@ -152,11 +139,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == "email: valid email must be provided\n" - assert response.content_type == 'application/json' - assert response.status_code == 400 + self.assert_400(response, "email: valid email must be provided\n") def test_it_returns_error_if_password_is_too_short( self, app: Flask @@ -176,11 +159,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == "password: 8 characters required\n" - assert response.content_type == 'application/json' - assert response.status_code == 400 + self.assert_400(response, "password: 8 characters required\n") def test_it_returns_error_if_passwords_mismatch(self, app: Flask) -> None: client = app.test_client() @@ -198,14 +177,10 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert ( - data['message'] - == "password: password and password confirmation do not match\n" + self.assert_400( + response, + "password: password and password confirmation do not match\n", ) - assert response.content_type == 'application/json' - assert response.status_code == 400 def test_it_returns_error_if_payload_is_invalid(self, app: Flask) -> None: client = app.test_client() @@ -234,10 +209,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + self.assert_400(response) def test_it_returns_error_if_email_is_missing(self, app: Flask) -> None: client = app.test_client() @@ -254,10 +226,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + self.assert_400(response) def test_it_returns_error_if_password_is_missing(self, app: Flask) -> None: client = app.test_client() @@ -274,10 +243,7 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload', data['message'] - assert 'error', data['status'] + self.assert_400(response) def test_it_returns_error_if_password_confirmation_is_missing( self, app: Flask @@ -292,10 +258,8 @@ class TestUserRegistration: ), content_type='application/json', ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + + self.assert_400(response) def test_it_returns_error_if_username_is_invalid(self, app: Flask) -> None: client = app.test_client() @@ -313,16 +277,10 @@ class TestUserRegistration: content_type='application/json', ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) - assert 'error' in data['status'] + self.assert_500(response) -class TestUserLogin: +class TestUserLogin(ApiTestCaseMixin): @pytest.mark.parametrize( 'input_email', ['test@test.com', 'TEST@TEST.COM'], @@ -378,11 +336,7 @@ class TestUserLogin: content_type='application/json', ) - assert response.content_type == 'application/json' - assert response.status_code == 401 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid credentials' + self.assert_401(response, 'invalid credentials') def test_it_returns_error_on_invalid_payload(self, app: Flask) -> None: client = app.test_client() @@ -393,11 +347,7 @@ class TestUserLogin: content_type='application/json', ) - assert response.content_type == 'application/json' - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_error_if_password_is_invalid( self, app: Flask, user_1: User @@ -410,11 +360,7 @@ class TestUserLogin: content_type='application/json', ) - assert response.content_type == 'application/json' - assert response.status_code == 401 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid credentials' + self.assert_401(response, 'invalid credentials') class TestUserLogout(ApiTestCaseMixin): @@ -441,34 +387,30 @@ class TestUserLogout(ApiTestCaseMixin): client, auth_token = self.get_test_client_and_auth_token( app, user_1.email ) - with freeze_time(now + timedelta(seconds=4)): + response = client.get( '/api/auth/logout', headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'signature expired, please log in again' - assert response.status_code == 401 + + self.assert_401(response, 'signature expired, please log in again') def test_it_returns_error_with_invalid_token(self, app: Flask) -> None: client = app.test_client() + response = client.get( '/api/auth/logout', headers=dict(Authorization='Bearer invalid') ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid token, please log in again' - assert response.status_code == 401 + + self.assert_401(response, 'invalid token, please log in again') def test_it_returns_error_with_invalid_headers(self, app: Flask) -> None: client = app.test_client() + response = client.get('/api/auth/logout', headers=dict()) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'provide a valid auth token' - assert response.status_code == 401 + + self.assert_401(response, 'provide a valid auth token') class TestUserProfile(ApiTestCaseMixin): @@ -576,13 +518,12 @@ class TestUserProfile(ApiTestCaseMixin): def test_it_returns_error_if_headers_are_invalid(self, app: Flask) -> None: client = app.test_client() + response = client.get( '/api/auth/profile', headers=dict(Authorization='Bearer invalid') ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid token, please log in again' - assert response.status_code == 401 + + self.assert_401(response, 'invalid token, please log in again') class TestUserProfileUpdate(ApiTestCaseMixin): @@ -692,10 +633,7 @@ class TestUserProfileUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' - assert response.status_code == 400 + self.assert_400(response) def test_it_returns_error_if_payload_is_empty( self, app: Flask, user_1: User @@ -711,10 +649,7 @@ class TestUserProfileUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + self.assert_400(response) def test_it_returns_error_if_passwords_mismatch( self, app: Flask, user_1: User @@ -740,13 +675,10 @@ class TestUserProfileUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert ( - data['message'] - == 'password: password and password confirmation do not match\n' + self.assert_400( + response, + 'password: password and password confirmation do not match\n', ) - assert response.status_code == 400 def test_it_returns_error_if_password_confirmation_is_missing( self, app: Flask, user_1: User @@ -771,13 +703,10 @@ class TestUserProfileUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert ( - data['message'] - == 'password: password and password confirmation do not match\n' + self.assert_400( + response, + 'password: password and password confirmation do not match\n', ) - assert response.status_code == 400 class TestUserPreferencesUpdate(ApiTestCaseMixin): @@ -840,10 +769,7 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' - assert response.status_code == 400 + self.assert_400(response) def test_it_returns_error_if_payload_is_empty( self, app: Flask, user_1: User @@ -859,10 +785,7 @@ class TestUserPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + self.assert_400(response) class TestUserSportPreferencesUpdate(ApiTestCaseMixin): @@ -880,10 +803,7 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'invalid payload' in data['message'] - assert 'error' in data['status'] + self.assert_400(response) def test_it_returns_error_if_sport_id_is_missing( self, app: Flask, user_1: User @@ -899,10 +819,7 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' - assert response.status_code == 400 + self.assert_400(response) def test_it_returns_error_if_sport_not_found( self, app: Flask, user_1: User @@ -918,10 +835,7 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'sport does not exist' in data['message'] + self.assert_404_with_entity(response, 'sport') def test_it_returns_error_if_payload_contains_only_sport_id( self, app: Flask, user_1: User, sport_1_cycling: Sport @@ -937,10 +851,7 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' - assert response.status_code == 400 + self.assert_400(response) def test_it_returns_error_if_color_is_invalid( self, app: Flask, user_1: User, sport_1_cycling: Sport @@ -961,10 +872,7 @@ class TestUserSportPreferencesUpdate(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid hexadecimal color' - assert response.status_code == 400 + self.assert_400(response, 'invalid hexadecimal color') @pytest.mark.parametrize( 'input_color', @@ -1075,10 +983,7 @@ class TestUserSportPreferencesReset(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - assert response.status_code == 404 - data = json.loads(response.data.decode()) - assert 'not found' in data['status'] - assert 'sport does not exist' in data['message'] + self.assert_404_with_entity(response, 'sport') def test_it_resets_sport_preferences( self, @@ -1172,10 +1077,7 @@ class TestUserPicture(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'fail' - assert data['message'] == 'no file part' - assert response.status_code == 400 + self.assert_400(response, 'no file part', 'fail') def test_it_returns_error_if_file_is_invalid( self, app: Flask, user_1: User @@ -1193,10 +1095,7 @@ class TestUserPicture(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert data['status'] == 'fail' - assert data['message'] == 'file extension not allowed' - assert response.status_code == 400 + self.assert_400(response, 'file extension not allowed', 'fail') def test_it_returns_error_if_image_size_exceeds_file_limit( self, @@ -1220,12 +1119,9 @@ class TestUserPicture(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 413 - assert 'fail' in data['status'] - assert ( - 'Error during picture upload, file size (1.2KB) exceeds 1.0KB.' - in data['message'] + data = self.assert_413( + response, + 'Error during picture upload, file size (1.2KB) exceeds 1.0KB.', ) assert 'data' not in data @@ -1251,17 +1147,14 @@ class TestUserPicture(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 413 - assert 'fail' in data['status'] - assert ( - 'Error during picture upload, file size (1.2KB) exceeds 1.0KB.' - in data['message'] + data = self.assert_413( + response, + 'Error during picture upload, file size (1.2KB) exceeds 1.0KB.', ) assert 'data' not in data -class TestRegistrationConfiguration: +class TestRegistrationConfiguration(ApiTestCaseMixin): def test_it_returns_error_if_it_exceeds_max_users( self, app_with_3_users_max: Flask, @@ -1284,11 +1177,7 @@ class TestRegistrationConfiguration: content_type='application/json', ) - assert response.content_type == 'application/json' - assert response.status_code == 403 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'error, registration is disabled' + self.assert_403(response, 'error, registration is disabled') def test_it_disables_registration_on_user_registration( self, @@ -1323,10 +1212,7 @@ class TestRegistrationConfiguration: content_type='application/json', ) - assert response.status_code == 403 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'error, registration is disabled' + self.assert_403(response, 'error, registration is disabled') def test_it_does_not_disable_registration_on_user_registration( self, @@ -1361,7 +1247,7 @@ class TestRegistrationConfiguration: assert response.status_code == 201 -class TestPasswordResetRequest: +class TestPasswordResetRequest(ApiTestCaseMixin): @patch('smtplib.SMTP_SSL') @patch('smtplib.SMTP') def test_it_requests_password_reset_when_user_exists( @@ -1404,10 +1290,7 @@ class TestPasswordResetRequest: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['message'] == 'invalid payload' - assert data['status'] == 'error' + self.assert_400(response) def test_it_returns_error_on_empty_payload(self, app: Flask) -> None: client = app.test_client() @@ -1418,13 +1301,10 @@ class TestPasswordResetRequest: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['message'] == 'invalid payload' - assert data['status'] == 'error' + self.assert_400(response) -class TestPasswordUpdate: +class TestPasswordUpdate(ApiTestCaseMixin): def test_it_returns_error_if_payload_is_empty(self, app: Flask) -> None: client = app.test_client() @@ -1439,10 +1319,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_error_if_token_is_missing(self, app: Flask) -> None: client = app.test_client() @@ -1458,10 +1335,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_error_if_password_is_missing(self, app: Flask) -> None: client = app.test_client() @@ -1477,10 +1351,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_error_if_password_confirmation_is_missing( self, app: Flask @@ -1498,10 +1369,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_error_if_token_is_invalid(self, app: Flask) -> None: token = get_user_token(1) @@ -1519,10 +1387,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 401 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'invalid token, please request a new token' + self.assert_401(response, 'invalid token, please request a new token') def test_it_returns_error_if_token_is_expired( self, app: Flask, user_1: User @@ -1544,11 +1409,8 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 401 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert ( - data['message'] == 'invalid token, please request a new token' + self.assert_401( + response, 'invalid token, please request a new token' ) def test_it_returns_error_if_password_is_invalid( @@ -1569,10 +1431,7 @@ class TestPasswordUpdate: content_type='application/json', ) - assert response.status_code == 400 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'password: 8 characters required\n' + self.assert_400(response, 'password: 8 characters required\n') def test_it_update_password(self, app: Flask, user_1: User) -> None: token = get_user_token(user_1.id, password_reset=True) diff --git a/fittrackee/tests/users/test_users_api.py b/fittrackee/tests/users/test_users_api.py index 6fc6432c..ee2cdcc3 100644 --- a/fittrackee/tests/users/test_users_api.py +++ b/fittrackee/tests/users/test_users_api.py @@ -106,11 +106,8 @@ class TestGetUser(ApiTestCaseMixin): content_type='application/json', headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'user does not exist' in data['message'] + self.assert_404_with_entity(response, 'user') class TestGetUsers(ApiTestCaseMixin): @@ -823,7 +820,7 @@ class TestGetUsers(ApiTestCaseMixin): } -class TestGetUserPicture: +class TestGetUserPicture(ApiTestCaseMixin): def test_it_return_error_if_user_has_no_picture( self, app: Flask, user_1: User ) -> None: @@ -831,10 +828,7 @@ class TestGetUserPicture: response = client.get(f'/api/users/{user_1.username}/picture') - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'No picture.' in data['message'] + self.assert_404_with_message(response, 'No picture.') def test_it_returns_error_if_user_does_not_exist( self, app: Flask, user_1: User @@ -843,10 +837,7 @@ class TestGetUserPicture: response = client.get('/api/users/not_existing/picture') - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'user does not exist' in data['message'] + self.assert_404_with_entity(response, 'user') class TestUpdateUser(ApiTestCaseMixin): @@ -909,10 +900,7 @@ class TestUpdateUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_returns_error_if_payload_for_admin_rights_is_invalid( self, app: Flask, user_1_admin: User, user_2: User @@ -928,13 +916,7 @@ class TestUpdateUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) def test_it_returns_error_if_user_can_not_change_admin_rights( self, app: Flask, user_1: User, user_2: User @@ -950,10 +932,7 @@ class TestUpdateUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) class TestDeleteUser(ApiTestCaseMixin): @@ -1048,10 +1027,7 @@ class TestDeleteUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_returns_error_when_deleting_non_existing_user( self, app: Flask, user_1: User @@ -1065,10 +1041,7 @@ class TestDeleteUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'user does not exist' in data['message'] + self.assert_404_with_entity(response, 'user') def test_admin_can_delete_another_user_account( self, app: Flask, user_1_admin: User, user_2: User @@ -1110,12 +1083,9 @@ class TestDeleteUser(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert ( - 'you can not delete your account, no other user has admin rights' - in data['message'] + self.assert_403( + response, + 'you can not delete your account, no other user has admin rights', ) def test_it_enables_registration_on_user_delete( @@ -1176,7 +1146,4 @@ class TestDeleteUser(ApiTestCaseMixin): content_type='application/json', ) - assert response.status_code == 403 - data = json.loads(response.data.decode()) - assert data['status'] == 'error' - assert data['message'] == 'error, registration is disabled' + self.assert_403(response, 'error, registration is disabled') diff --git a/fittrackee/tests/workouts/test_sports_api.py b/fittrackee/tests/workouts/test_sports_api.py index cdce3e52..4cc76157 100644 --- a/fittrackee/tests/workouts/test_sports_api.py +++ b/fittrackee/tests/workouts/test_sports_api.py @@ -209,9 +209,7 @@ class TestGetSport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] + data = self.assert_404(response) assert len(data['data']['sports']) == 0 def test_it_gets_a_inactive_sport( @@ -424,11 +422,7 @@ class TestUpdateSport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'success' not in data['status'] - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_returns_error_if_payload_is_invalid( self, app: Flask, user_1_admin: User @@ -444,10 +438,7 @@ class TestUpdateSport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_returns_error_if_sport_does_not_exist( self, app: Flask, user_1_admin: User @@ -463,7 +454,5 @@ class TestUpdateSport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] + data = self.assert_404(response) assert len(data['data']['sports']) == 0 diff --git a/fittrackee/tests/workouts/test_stats_api.py b/fittrackee/tests/workouts/test_stats_api.py index 9421345c..b9ed5442 100644 --- a/fittrackee/tests/workouts/test_stats_api.py +++ b/fittrackee/tests/workouts/test_stats_api.py @@ -38,10 +38,7 @@ class TestGetStatsByTime(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'user does not exist' in data['message'] + self.assert_404_with_entity(response, 'user') def test_it_returns_error_if_date_format_is_invalid( self, @@ -64,13 +61,7 @@ class TestGetStatsByTime(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) def test_it_returns_error_if_period_is_invalid( self, @@ -90,10 +81,7 @@ class TestGetStatsByTime(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'fail' in data['status'] - assert 'Invalid time period.' in data['message'] + self.assert_400(response, 'Invalid time period.', 'fail') def test_it_gets_stats_by_time_all_workouts( self, @@ -955,10 +943,7 @@ class TestGetStatsBySport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'user does not exist' in data['message'] + self.assert_404_with_entity(response, 'user') def test_it_returns_error_if_sport_does_not_exist( self, @@ -978,10 +963,7 @@ class TestGetStatsBySport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'sport does not exist' in data['message'] + self.assert_404_with_entity(response, 'sport') def test_it_returns_error_if_sport_id_is_invalid( self, @@ -1001,13 +983,7 @@ class TestGetStatsBySport(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) class TestGetAllStats(ApiTestCaseMixin): @@ -1081,8 +1057,4 @@ class TestGetAllStats(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'success' not in data['status'] - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) diff --git a/fittrackee/tests/workouts/test_workouts_api_0_get.py b/fittrackee/tests/workouts/test_workouts_api_0_get.py index ba4c0ac9..d6d537ff 100644 --- a/fittrackee/tests/workouts/test_workouts_api_0_get.py +++ b/fittrackee/tests/workouts/test_workouts_api_0_get.py @@ -107,10 +107,7 @@ class TestGetWorkouts(ApiTestCaseMixin): response = client.get('/api/workouts') - data = json.loads(response.data.decode()) - assert response.status_code == 401 - assert 'error' in data['status'] - assert 'provide a valid auth token' in data['message'] + self.assert_401(response, 'provide a valid auth token') class TestGetWorkoutsWithPagination(ApiTestCaseMixin): @@ -278,13 +275,7 @@ class TestGetWorkoutsWithPagination(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) @patch('fittrackee.workouts.workouts.MAX_WORKOUTS_PER_PAGE', 6) def test_it_gets_max_workouts_per_page_if_per_page_exceeds_max( @@ -1034,10 +1025,7 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_returns_404_if_workout_does_not_exist( self, app: Flask, user_1: User @@ -1051,9 +1039,7 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] + data = self.assert_404(response) assert len(data['data']['workouts']) == 0 def test_it_returns_404_on_getting_gpx_if_workout_does_not_exist( @@ -1069,10 +1055,9 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert f'workout not found (id: {random_short_id})' in data['message'] + data = self.assert_404_with_message( + response, f'workout not found (id: {random_short_id})' + ) assert data['data']['gpx'] == '' def test_it_returns_404_on_getting_chart_data_if_workout_does_not_exist( @@ -1088,10 +1073,9 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert f'workout not found (id: {random_short_id})' in data['message'] + data = self.assert_404_with_message( + response, f'workout not found (id: {random_short_id})' + ) assert data['data']['chart_data'] == '' def test_it_returns_404_on_getting_gpx_if_workout_have_no_gpx( @@ -1111,12 +1095,8 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert ( - f'no gpx file for this workout (id: {workout_short_id})' - in data['message'] + self.assert_404_with_message( + response, f'no gpx file for this workout (id: {workout_short_id})' ) def test_it_returns_404_if_workout_have_no_chart_data( @@ -1136,12 +1116,8 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert ( - f'no gpx file for this workout (id: {workout_short_id})' - in data['message'] + self.assert_404_with_message( + response, f'no gpx file for this workout (id: {workout_short_id})' ) def test_it_returns_500_on_getting_gpx_if_an_workout_has_invalid_gpx_pathname( # noqa @@ -1161,13 +1137,7 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + data = self.assert_500(response) assert 'data' not in data def test_it_returns_500_on_getting_chart_data_if_an_workout_has_invalid_gpx_pathname( # noqa @@ -1187,13 +1157,7 @@ class TestGetWorkout(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + data = self.assert_500(response) assert 'data' not in data def test_it_returns_404_if_workout_has_no_map( @@ -1206,11 +1170,8 @@ class TestGetWorkout(ApiTestCaseMixin): f'/api/workouts/map/{uuid4().hex}', headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'Map does not exist' in data['message'] + self.assert_404_with_message(response, 'Map does not exist') class TestDownloadWorkoutGpx(ApiTestCaseMixin): @@ -1228,10 +1189,7 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'workout not found' in data['message'] + self.assert_404_with_message(response, 'workout not found') def test_it_returns_404_if_workout_does_not_have_gpx( self, @@ -1249,10 +1207,7 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'no gpx file for workout' in data['message'] + self.assert_404_with_message(response, 'no gpx file for workout') def test_it_returns_404_if_workout_belongs_to_a_different_user( self, @@ -1271,10 +1226,7 @@ class TestDownloadWorkoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert 'workout not found' in data['message'] + self.assert_404_with_message(response, 'workout not found') def test_it_calls_send_from_directory_if_workout_has_gpx( self, diff --git a/fittrackee/tests/workouts/test_workouts_api_1_post.py b/fittrackee/tests/workouts/test_workouts_api_1_post.py index bce80688..a6e7693c 100644 --- a/fittrackee/tests/workouts/test_workouts_api_1_post.py +++ b/fittrackee/tests/workouts/test_workouts_api_1_post.py @@ -1,6 +1,5 @@ import json import os -import re from datetime import datetime from io import BytesIO from typing import Dict @@ -424,10 +423,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'Error during gpx processing.' in data['message'] + data = self.assert_500(response, 'Error during gpx processing.') assert 'data' not in data def test_it_returns_500_if_gpx_has_invalid_xml( @@ -456,10 +452,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'Error during gpx file parsing.' in data['message'] + data = self.assert_500(response, 'Error during gpx file parsing.') assert 'data' not in data def test_it_returns_400_if_workout_gpx_has_invalid_extension( @@ -481,10 +474,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert data['status'] == 'fail' - assert data['message'] == 'file extension not allowed' + self.assert_400(response, 'file extension not allowed', 'fail') def test_it_returns_400_if_sport_id_is_not_provided( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -504,10 +494,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert data['status'] == 'error' - assert data['message'] == 'invalid payload' + self.assert_400(response) def test_it_returns_500_if_sport_id_does_not_exists( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -528,10 +515,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert data['status'] == 'error' - assert data['message'] == 'Sport id: 2 does not exist' + self.assert_500(response, 'Sport id: 2 does not exist') def test_returns_400_if_no_gpx_file_is_provided( self, app: Flask, user_1: User, sport_1_cycling: Sport @@ -549,10 +533,7 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert data['status'] == 'fail' - assert data['message'] == 'no file part' + self.assert_400(response, 'no file part', 'fail') def test_it_returns_error_if_file_size_exceeds_limit( self, @@ -576,12 +557,13 @@ class TestPostWorkoutWithGpx(ApiTestCaseMixin, CallArgsMixin): Authorization=f'Bearer {auth_token}', ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 413 - assert 'fail' in data['status'] - assert re.match( - r'Error during workout upload, file size \((.*)\) exceeds 1.0KB.', - data['message'], + + data = self.assert_413( + response, + match=( + r'Error during workout upload, ' + r'file size \((.*)\) exceeds 1.0KB.' + ), ) assert 'data' not in data @@ -628,10 +610,7 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_returns_500_if_workout_format_is_invalid( self, app: Flask, user_1: User, sport_1_cycling: Sport @@ -654,10 +633,7 @@ class TestPostWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'fail' in data['status'] - assert 'Error during workout save.' in data['message'] + self.assert_500(response, 'Error during workout save.', status='fail') def test_it_adds_workout_with_zero_value( self, @@ -767,9 +743,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'fail' in data['status'] + data = self.assert_400(response, error_message=None, status='fail') assert len(data['data']['workouts']) == 0 def test_it_returns_500_if_one_file_in_zip_archive_is_invalid( @@ -796,10 +770,7 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert 'Error during gpx processing.' in data['message'] + data = self.assert_500(response, 'Error during gpx processing.') assert 'data' not in data def test_it_imports_only_max_number_of_files( @@ -860,12 +831,11 @@ class TestPostWorkoutWithZipArchive(ApiTestCaseMixin): Authorization=f'Bearer {auth_token}', ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 413 - assert 'fail' in data['status'] - assert ( - 'Error during workout upload, file size (2.5KB) exceeds 1.0KB.' - in data['message'] + + data = self.assert_413( + response, + 'Error during workout upload, ' + 'file size (2.5KB) exceeds 1.0KB.', ) assert 'data' not in data @@ -943,14 +913,8 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): f'/api/workouts/map/{map_id}', headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert data['status'] == 'error' - assert ( - data['message'] - == 'error, please try again or contact the administrator' - ) + self.assert_500(response) def test_it_gets_an_workout_created_with_gpx( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -1068,10 +1032,7 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert data['message'] == 'you do not have permissions' + self.assert_403(response) def test_it_returns_500_on_invalid_segment_id( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -1098,11 +1059,7 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert data['message'] == 'Incorrect segment id' - assert 'data' not in data + self.assert_500(response, 'Incorrect segment id') def test_it_returns_404_if_segment_id_does_not_exist( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -1129,10 +1086,9 @@ class TestPostAndGetWorkoutWithGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] - assert data['message'] == 'No segment with id \'999999\'' + data = self.assert_404_with_message( + response, 'No segment with id \'999999\'' + ) assert 'data' not in data diff --git a/fittrackee/tests/workouts/test_workouts_api_2_patch.py b/fittrackee/tests/workouts/test_workouts_api_2_patch.py index d9055f00..df84d2e9 100644 --- a/fittrackee/tests/workouts/test_workouts_api_2_patch.py +++ b/fittrackee/tests/workouts/test_workouts_api_2_patch.py @@ -169,10 +169,7 @@ class TestEditWorkoutWithGpx(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_updates_sport( self, @@ -213,10 +210,7 @@ class TestEditWorkoutWithGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_raises_500_if_sport_does_not_exists( self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str @@ -231,13 +225,7 @@ class TestEditWorkoutWithGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): @@ -409,10 +397,7 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_updates_an_workout_wo_gpx_with_timezone( self, @@ -574,10 +559,7 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 400 - assert 'error' in data['status'] - assert 'invalid payload' in data['message'] + self.assert_400(response) def test_it_returns_500_if_date_format_is_invalid( self, @@ -603,14 +585,7 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) def test_it_returns_404_if_edited_workout_does_not_exists( self, app: Flask, user_1: User, sport_1_cycling: Sport @@ -632,7 +607,5 @@ class TestEditWorkoutWithoutGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 - assert 'not found' in data['status'] + data = self.assert_404(response) assert len(data['data']['workouts']) == 0 diff --git a/fittrackee/tests/workouts/test_workouts_api_3_delete.py b/fittrackee/tests/workouts/test_workouts_api_3_delete.py index b739ead4..fae8e6c5 100644 --- a/fittrackee/tests/workouts/test_workouts_api_3_delete.py +++ b/fittrackee/tests/workouts/test_workouts_api_3_delete.py @@ -54,11 +54,7 @@ class TestDeleteWorkoutWithGpx(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response) def test_it_returns_404_if_workout_does_not_exist( self, app: Flask, user_1: User @@ -66,12 +62,13 @@ class TestDeleteWorkoutWithGpx(ApiTestCaseMixin): client, auth_token = self.get_test_client_and_auth_token( app, user_1.email ) + response = client.delete( f'/api/workouts/{get_random_short_id()}', headers=dict(Authorization=f'Bearer {auth_token}'), ) - data = json.loads(response.data.decode()) - assert response.status_code == 404 + + data = self.assert_404(response) assert 'not found' in data['status'] def test_it_returns_500_when_deleting_an_workout_with_gpx_invalid_file( @@ -88,14 +85,7 @@ class TestDeleteWorkoutWithGpx(ApiTestCaseMixin): headers=dict(Authorization=f'Bearer {token}'), ) - data = json.loads(response.data.decode()) - - assert response.status_code == 500 - assert 'error' in data['status'] - assert ( - 'error, please try again or contact the administrator' - in data['message'] - ) + self.assert_500(response) class TestDeleteWorkoutWithoutGpx(ApiTestCaseMixin): @@ -137,8 +127,4 @@ class TestDeleteWorkoutWithoutGpx(ApiTestCaseMixin): ), ) - data = json.loads(response.data.decode()) - - assert response.status_code == 403 - assert 'error' in data['status'] - assert 'you do not have permissions' in data['message'] + self.assert_403(response)