Skip to content

Commit

Permalink
delete user analysis (#317)
Browse files Browse the repository at this point in the history
* delete user analysis

* delete user analysis

* delete user analysis

* delete user analysis

---------

Co-authored-by: tinashe <tinashec@saya-setona.co.za>
  • Loading branch information
tinashechiraya and tinashe authored Feb 6, 2025
1 parent b49f7c2 commit 2e5eeae
Show file tree
Hide file tree
Showing 6 changed files with 1,027 additions and 695 deletions.
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

0 comments on commit 2e5eeae

Please sign in to comment.