diff --git a/atdb/taskdatabase/tests/test_views.py b/atdb/taskdatabase/tests/test_views.py index a44a776bff3080bff519ba87baa170fecee94e3f..f0211a3d4a7fe65c6c06213f5570428b82ec5b5a 100644 --- a/atdb/taskdatabase/tests/test_views.py +++ b/atdb/taskdatabase/tests/test_views.py @@ -1,10 +1,14 @@ from django.test import TestCase, RequestFactory from django.urls import reverse -from django.http import HttpResponse -from django.shortcuts import redirect + +from django.contrib.auth.models import User +from django.contrib.sessions.middleware import SessionMiddleware from taskdatabase.models import Task, Workflow -from taskdatabase.views import SortTasks +from taskdatabase.views import SortTasks, TaskMultiStatus +from taskdatabase.forms import DiscardAnnotationForm + +from unittest.mock import patch, MagicMock class TestViews(TestCase): def setUp(self): @@ -15,22 +19,86 @@ class TestViews(TestCase): workflow_requantisation.save() # Create a test task - self.task1 = Task.objects.create(filter='a',sas_id=456, status='stored', workflow=workflow_requantisation, priority=1) - self.task2 = Task.objects.create(filter='b',sas_id=123, status='stored', workflow=workflow_requantisation, priority=1) - - # def test_sort(self): - # # Set up the URL for the view - # #url = reverse('sort-tasks', kwargs={'sort': 'sas_id', 'redirect_to_page': 'atdb'}) - # - # # Create a request object - # request = self.factory.get('/dummy-url') - # - # # Call the function with sort='priority' and redirect_to_page='tasks_list' - # response = SortTasks(request, sort='sas_id', redirect_to_page='atdb') - # - # # Check if the sort field is correctly stored in the session - # self.assertEqual(request.session['sort'], 'name') - # - # # Check if it redirects to the 'index' page - # self.assertEqual(response.status_code, 302) - # self.assertEqual(response.url, reverse('atdb')) \ No newline at end of file + self.task1 = Task.objects.create(sas_id=456, status='defined', workflow=workflow_requantisation) + self.task2 = Task.objects.create(sas_id=123, status='defined', workflow=workflow_requantisation) + + self.user = User.objects.create_user(username='testuser', password='testpass') + + self.session_data = { + 'filtered_tasks_as_list': [self.task1.id, self.task2.id], + 'current_query_params': 'status=defined' + } + + def _set_up_session(self, request): + """Helper function to set up session for the request""" + middleware = SessionMiddleware(get_response=lambda r: None) + middleware.process_request(request) + request.session.update(self.session_data) + request.session.save() + + def test_sort(self): + # Set up the URL for the view + + # Arrange + # Create a request object + request = self.factory.get('/dummy-url') + self._set_up_session(request) + + # Act + # Call the function with sort='priority' and redirect_to_page='tasks_list' + response = SortTasks(request, sort='sas_id', redirect_to_page='atdb') + + # Assert + # Check if the sort field is correctly stored in the session + self.assertEqual(request.session['sort'], 'sas_id') + + # Check if it redirects to the 'index' page + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, reverse('index')) + + @patch('taskdatabase.views.Task.objects.get') + @patch('taskdatabase.views.DiscardAnnotationForm.is_valid') + def test_task_multi_status_post_discard(self, mock_is_valid, mock_get): + + # Arrange + # Mock the Task.objects.get method to return mock tasks + mock_get.side_effect = lambda id: self.task1 if id == self.task1.id else self.task2 + mock_is_valid.return_value = True + + request = self.factory.post('/dummy-url', data={'annotation': 'test annotation'}) + self._set_up_session(request) + request.user = self.user + + # Act + # Call the function with new_status='discarded' + response = TaskMultiStatus(request, new_status='discarded', query_params='status=defined') + + # Assert + # Check that the tasks were updated correctly + self.assertEqual(self.task1.status, 'discarded') + self.assertEqual(self.task2.status, 'discarded') + self.assertEqual(self.task1.remarks['discard_reason'], 'test annotation') + self.assertEqual(self.task2.remarks['discard_reason'], 'test annotation') + + # Check if it redirects to the correct URL + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, reverse('query') + '?' + 'status=defined') + + @patch('taskdatabase.views.convert_query_params_to_url') + def test_task_multi_status_get_discard(self,mock_query_params): + + # Arrange + mock_query_params.return_value = "&status=defined" + + request = self.factory.get('/dummy-url') + self._set_up_session(request) + request.user = self.user + expected_params_on_session = "&status=defined" + + # Act + # Call the function with new_status='discarded' + response = TaskMultiStatus(request, new_status='discarded', query_params='status=defined') + + # Assert + self.assertEqual(response.status_code, 200) + self.assertEqual(request.session['current_query_params'], expected_params_on_session) \ No newline at end of file