from django.test import TestCase, RequestFactory from django.contrib.auth import get_user_model from unittest.mock import patch from rest_framework.test import APIClient from modules.task_management.views import TaskViewSet from modules.task_management.serializers import TaskSerializer from modules.task_management.models import Task, TaskTemplate, TaskTemplateEntry from modules.fleet.models import Vehicle class TaskViewSetTests(TestCase): def setUp(self): User = get_user_model() self.user = User.objects.create_user(username="u1", email="u1@example.test", password="pass") self.factory = RequestFactory() self.view = TaskViewSet() self.view.request = self.factory.post("/") self.view.request.user = self.user self.vehicle = Vehicle.objects.create(registration_number="ZG-TV-01", asset_type='crane') self.api_client = APIClient() self.api_client.force_authenticate(user=self.user) @patch("modules.task_management.views.TaskService.create_task_entry") def test_perform_create_calls_service(self, mock_create): data = {"title": "Task from view", "description": "", "status": "aktivan", "vehicle": str(self.vehicle.id)} serializer = TaskSerializer(data=data, context={"request": self.view.request}) assert serializer.is_valid(), serializer.errors # Call perform_create, which should delegate to TaskService.create_task_entry self.view.perform_create(serializer) mock_create.assert_called_once() args, kwargs = mock_create.call_args assert "data" in kwargs and kwargs["user"] == self.user @patch("modules.task_management.views.TaskService.update_task_entry") def test_perform_update_calls_service_and_saves(self, mock_update): # Create an instance and use serializer to update task = Task.objects.create(title="Old", description="", assigned_to=self.user) data = {"title": "Updated", "description": "new", "status": "aktivan"} serializer = TaskSerializer(instance=task, data=data, partial=True, context={"request": self.view.request}) assert serializer.is_valid(), serializer.errors # attach view.request and instance then call perform_update self.view.request = self.factory.put("/") self.view.request.user = self.user serializer.instance = task self.view.perform_update(serializer) mock_update.assert_called_once_with( instance=task, data=serializer.validated_data, user=self.view.request.user, auto_close_work_order=False, ) # confirm instance saved with new title task.refresh_from_db() assert task.title == "Updated" def test_perform_destroy_soft_deletes(self): task = Task.objects.create(title="ToDelete", description="", assigned_to=self.user) self.view.perform_destroy(task) task.refresh_from_db() assert task.is_active is False def test_template_created_task_is_visible_in_service_records_endpoint(self): template = TaskTemplate.objects.create( code='template-api-service-records', title='Template API', description='Opis', status='aktivan', ) TaskTemplateEntry.objects.create( task_template=template, sort_order=1, title='Korak API', work_description='Opis API koraka', ) response = self.api_client.post( "/api/tasks/tasks/", data={"template_id": str(template.id), "vehicle": str(self.vehicle.id)}, format="json", ) self.assertEqual(response.status_code, 201, response.content) created_task_id = str(response.json()["id"]) service_records_response = self.api_client.get("/api/fleet/service-records/") self.assertEqual(service_records_response.status_code, 200, service_records_response.content) payload = service_records_response.json() rows = payload if isinstance(payload, list) else payload.get("results", []) self.assertTrue(any(str(row.get("task") or "") == created_task_id for row in rows))