Files
mariomitte 7acaef941f feat: integritet zatvaranja taska i putnog naloga
Dodaje status 'spreman_za_zavrsetak' i backend provjeru koja blokira zatvaranje taska kada je povezani putni nalog otvoren, uz 409 odgovor i opcionalni auto-close flow.\n\nPri zatvaranju putnog naloga taskovi u statusu 'servis' automatski prelaze u 'spreman_za_zavrsetak'. Frontend modal sada podržava potvrdu i retry s auto_close_work_order=true.\n\nUključeni su i ciljani testovi za novi behavior, te ažuriran prikaz statusa u dashboardu.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-17 19:20:33 +02:00

92 lines
4.1 KiB
Python

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))