Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

delete user analysis #317

Merged
merged 4 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ docker-compose.override.yml

webpack-stats.dev.json
webpack-stats.prod.json

frontend/package-lock.json
86 changes: 85 additions & 1 deletion django_project/analysis/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,87 @@
from django.test import TestCase # noqa: F401
from analysis.models import UserAnalysisResults
from rest_framework.test import APITestCase
from rest_framework import status
from django.contrib.auth import get_user_model
from dashboard.models import Dashboard

# Create your tests here.
User = get_user_model()


class DeleteAnalysisTestCase(APITestCase):

def setUp(self):
# Create a test user
self.user = User.objects.create_user(
username="testuser",
password="testpassword"
)
self.client.force_authenticate(user=self.user) # Authenticate user

# Create test analyses
self.analysis1 = UserAnalysisResults.objects.create(
created_by=self.user,
analysis_results={"data": "test1"}
)
self.analysis2 = UserAnalysisResults.objects.create(
created_by=self.user,
analysis_results={"data": "test2"}
)

# Create dashboards
self.dashboard1 = Dashboard.objects.create(
title="Dashboard 1",
created_by=self.user
)
self.dashboard2 = Dashboard.objects.create(
title="Dashboard 2",
created_by=self.user
)

# Associate analysis with dashboards
self.dashboard1.analysis_results.add(self.analysis1)
self.dashboard2.analysis_results.add(self.analysis1, self.analysis2)

def test_delete_analysis_removes_from_dashboards(self):

response = self.client.delete(
f"/user_analysis_results/{self.analysis1.id}/")
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

# Ensure the analysis is deleted
self.assertFalse(
UserAnalysisResults.objects.filter(
id=self.analysis1.id).exists())

# Ensure dashboard2 still has analysis2
self.dashboard2.refresh_from_db()
self.assertIn(self.analysis2, self.dashboard2.analysis_results.all())

def test_delete_analysis_deletes_dashboard_if_no_other_analysis(self):

response = self.client.delete(
f"/user_analysis_results/{self.analysis1.id}/")
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

# Dashboard2 should still exist as it has analysis2
self.assertTrue(Dashboard.objects.filter
(pk=self.dashboard2.pk).exists())

def test_delete_analysis_not_associated_with_any_dashboard(self):
# Create an analysis that is not linked to any dashboard
independent_analysis = UserAnalysisResults.objects.create(
created_by=self.user, analysis_results={"data": "independent"})

response = self.client.delete(
f"/user_analysis_results/{independent_analysis.id}/")
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

# Ensure the analysis is deleted
self.assertFalse(UserAnalysisResults.objects.filter(
id=independent_analysis.id).exists())

def test_delete_non_existent_analysis(self):
"""Test that deleting a non-existent analysis returns 404."""

response = self.client.delete("/user_analysis_results/99999/")
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
16 changes: 16 additions & 0 deletions django_project/analysis/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from dashboard.models import Dashboard
from rest_framework import viewsets
from .models import UserAnalysisResults
from .serializer import UserAnalysisResultsSerializer
Expand Down Expand Up @@ -32,3 +33,18 @@ def save_analysis_results(self, request):
serializer.save(created_by=request.user)
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)

def destroy(self, request, *args, **kwargs):
instance = self.get_object()

# Remove the analysis from associated dashboards
dashboards = Dashboard.objects.filter(analysis_results=instance)
for dashboard in dashboards:
dashboard.analysis_results.remove(instance)

# Delete the analysis
instance.delete()
return Response(
{
"message": "Analysis deleted successfully"
}, status=204)
Loading