From a116f2c14148f84593cdd09b98cd40665ffe9955 Mon Sep 17 00:00:00 2001 From: Matthew Elwell Date: Thu, 13 Feb 2025 12:58:40 +0000 Subject: [PATCH] fix(feature-export): handle unsuccessful feature export download exception (#5086) --- api/features/import_export/views.py | 10 +++++- .../test_unit_features_import_export_views.py | 31 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/api/features/import_export/views.py b/api/features/import_export/views.py index 42b162ed7ae7..79208c6a3006 100644 --- a/api/features/import_export/views.py +++ b/api/features/import_export/views.py @@ -4,7 +4,7 @@ from django.db.models import QuerySet from django.http import Http404 from drf_yasg.utils import swagger_auto_schema -from rest_framework import permissions +from rest_framework import permissions, serializers from rest_framework.decorators import api_view, permission_classes from rest_framework.generics import ListAPIView, get_object_or_404 from rest_framework.request import Request @@ -12,6 +12,7 @@ from environments.models import Environment +from .constants import SUCCESS from .models import ( FeatureExport, FeatureImport, @@ -73,6 +74,13 @@ def feature_import(request: Request, environment_id: int) -> Response: def download_feature_export(request: Request, feature_export_id: int) -> Response: feature_export = get_object_or_404(FeatureExport, id=feature_export_id) + if feature_export.status != SUCCESS: + raise serializers.ValidationError( + { + "detail": f"Unable to download export with status '{feature_export.status}'." + } + ) + response = Response( json.loads(feature_export.data), content_type="application/json" ) diff --git a/api/tests/unit/features/import_export/test_unit_features_import_export_views.py b/api/tests/unit/features/import_export/test_unit_features_import_export_views.py index 55dd5551674d..c1282dbd2b0d 100644 --- a/api/tests/unit/features/import_export/test_unit_features_import_export_views.py +++ b/api/tests/unit/features/import_export/test_unit_features_import_export_views.py @@ -10,7 +10,12 @@ from environments.models import Environment from environments.permissions.models import UserEnvironmentPermission -from features.import_export.constants import OVERWRITE_DESTRUCTIVE, PROCESSING +from features.import_export.constants import ( + FAILED, + OVERWRITE_DESTRUCTIVE, + PROCESSING, + SUCCESS, +) from features.import_export.models import ( FeatureExport, FeatureImport, @@ -136,6 +141,7 @@ def test_download_feature_export( feature_export = FeatureExport.objects.create( environment=environment, data='[{"feature": "data"}]', + status=SUCCESS, ) url = reverse("api-v1:features:download-feature-export", args=[feature_export.id]) # When @@ -166,6 +172,29 @@ def test_download_feature_export_unauthorized( assert response.status_code == 403 +@pytest.mark.parametrize("status", (PROCESSING, FAILED)) +def test_cannot_download_non_success_feature_export( + admin_client_new: APIClient, + environment: Environment, + status: str, +) -> None: + # Given + feature_export = FeatureExport.objects.create( + environment=environment, + status=status, + ) + url = reverse("api-v1:features:download-feature-export", args=[feature_export.id]) + + # When + response = admin_client_new.get(url) + + # Then + assert response.status_code == 400 + assert response.json() == { + "detail": f"Unable to download export with status '{status}'." + } + + def test_feature_import( admin_client: APIClient, environment: Environment,