API - add endpoint to download export archive
This commit is contained in:
@ -3064,3 +3064,85 @@ class TestGetUserDataExportRequest(ApiTestCaseMixin):
|
||||
assert data["request"] == jsonify_dict(
|
||||
completed_export_request.serialize()
|
||||
)
|
||||
|
||||
|
||||
class TestDownloadExportDataArchive(ApiTestCaseMixin):
|
||||
def test_it_returns_404_when_request_export_does_not_exist(
|
||||
self, app: Flask, user_1: User
|
||||
) -> None:
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.get(
|
||||
f'/api/auth/profile/export/{self.random_string()}',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_404_with_message(response, 'file not found')
|
||||
|
||||
def test_it_returns_404_when_request_export_from_another_user(
|
||||
self, app: Flask, user_1: User, user_2: User
|
||||
) -> None:
|
||||
archive_file_name = self.random_string()
|
||||
export_request = UserDataExport(user_id=user_2.id)
|
||||
db.session.add(export_request)
|
||||
export_request.completed = True
|
||||
export_request.file_name = archive_file_name
|
||||
db.session.commit()
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.get(
|
||||
f'/api/auth/profile/export/{archive_file_name}',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_404_with_message(response, 'file not found')
|
||||
|
||||
def test_it_returns_404_when_file_name_does_not_match(
|
||||
self, app: Flask, user_1: User
|
||||
) -> None:
|
||||
export_request = UserDataExport(user_id=user_1.id)
|
||||
db.session.add(export_request)
|
||||
export_request.completed = True
|
||||
export_request.file_name = self.random_string()
|
||||
db.session.commit()
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
|
||||
response = client.get(
|
||||
f'/api/auth/profile/export/{self.random_string()}',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
self.assert_404_with_message(response, 'file not found')
|
||||
|
||||
def test_it_calls_send_from_directory_if_request_exist(
|
||||
self, app: Flask, user_1: User
|
||||
) -> None:
|
||||
archive_file_name = self.random_string()
|
||||
export_request = UserDataExport(user_id=user_1.id)
|
||||
db.session.add(export_request)
|
||||
export_request.completed = True
|
||||
export_request.file_name = archive_file_name
|
||||
db.session.commit()
|
||||
client, auth_token = self.get_test_client_and_auth_token(
|
||||
app, user_1.email
|
||||
)
|
||||
with patch('fittrackee.users.auth.send_from_directory') as mock:
|
||||
mock.return_value = 'file'
|
||||
|
||||
client.get(
|
||||
f'/api/auth/profile/export/{archive_file_name}',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
mock.assert_called_once_with(
|
||||
f"{app.config['UPLOAD_FOLDER']}/exports/{user_1.id}",
|
||||
archive_file_name,
|
||||
mimetype='application/zip',
|
||||
as_attachment=True,
|
||||
)
|
||||
|
@ -6,7 +6,8 @@ from unittest.mock import MagicMock, patch
|
||||
import pytest
|
||||
from flask import Flask
|
||||
|
||||
from fittrackee.users.models import User, UserSportPreference
|
||||
from fittrackee import db
|
||||
from fittrackee.users.models import User, UserDataExport, UserSportPreference
|
||||
from fittrackee.utils import get_readable_duration
|
||||
from fittrackee.workouts.models import Sport, Workout
|
||||
|
||||
@ -1551,6 +1552,30 @@ class TestDeleteUser(ApiTestCaseMixin):
|
||||
|
||||
assert response.status_code == 204
|
||||
|
||||
def test_user_with_export_request_can_delete_its_own_account(
|
||||
self, app: Flask, user_1: User, sport_1_cycling: Sport, gpx_file: str
|
||||
) -> None:
|
||||
db.session.add(UserDataExport(user_1.id))
|
||||
db.session.commit()
|
||||
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')),
|
||||
headers=dict(
|
||||
content_type='multipart/form-data',
|
||||
Authorization=f'Bearer {auth_token}',
|
||||
),
|
||||
)
|
||||
|
||||
response = client.delete(
|
||||
'/api/users/test',
|
||||
headers=dict(Authorization=f'Bearer {auth_token}'),
|
||||
)
|
||||
|
||||
assert response.status_code == 204
|
||||
|
||||
def test_user_can_not_delete_another_user_account(
|
||||
self, app: Flask, user_1: User, user_2: User
|
||||
) -> None:
|
||||
|
@ -371,7 +371,7 @@ class TestExportUserData:
|
||||
f"Export id '{export_request.id}' already processed"
|
||||
)
|
||||
|
||||
def test_it_update_export_request_when_export_is_successful(
|
||||
def test_it_updates_export_request_when_export_is_successful(
|
||||
self,
|
||||
generate_archive_mock: Mock,
|
||||
logger_mock: Mock,
|
||||
@ -396,7 +396,7 @@ class TestExportUserData:
|
||||
assert export_request.file_name == archive_name
|
||||
assert export_request.file_size == archive_size
|
||||
|
||||
def test_it_update_export_request_when_export_fails(
|
||||
def test_it_updates_export_request_when_export_fails(
|
||||
self,
|
||||
generate_archive_mock: Mock,
|
||||
logger_mock: Mock,
|
||||
|
Reference in New Issue
Block a user