60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
from django.test import TestCase
|
|
from unittest.mock import MagicMock
|
|
from django.utils import timezone
|
|
from helpdesk.services.ticket_service import TicketService
|
|
from helpdesk.models import TicketStatus, Ticket
|
|
from django.contrib.auth import get_user_model
|
|
|
|
UserModel = get_user_model()
|
|
|
|
class TicketServiceStatusTest(TestCase):
|
|
|
|
def setUp(self):
|
|
self.mock_repo = MagicMock()
|
|
self.service = TicketService(ticket_repo=self.mock_repo)
|
|
|
|
# Mock Ticket Object
|
|
self.mock_ticket = Ticket(
|
|
id=1,
|
|
title="Test Ticket",
|
|
status=TicketStatus.OPEN,
|
|
last_message_at=timezone.now(),
|
|
last_message_content="Initial message",
|
|
is_read=True,
|
|
)
|
|
|
|
self.mock_repo.get_ticket_by_id.return_value = self.mock_ticket
|
|
|
|
def test_allow_status_change_from_open_to_inprogress(self):
|
|
new_status = TicketStatus.IN_PROGRESS
|
|
|
|
# Mock update_ticket return value
|
|
updated_ticket = Ticket(
|
|
id=1,
|
|
title="Test Ticket",
|
|
status=new_status,
|
|
last_message_at=timezone.now(),
|
|
last_message_content="Initial message",
|
|
is_read=True,
|
|
)
|
|
self.mock_repo.update_ticket.return_value = updated_ticket
|
|
|
|
# ACT
|
|
result = self.service.update_ticket_status(1, new_status)
|
|
|
|
# ASSERT
|
|
self.assertEqual(result.status, new_status)
|
|
self.mock_repo.update_ticket.assert_called_once()
|
|
|
|
def test_prevent_status_change_from_closed_to_open(self):
|
|
self.mock_ticket.status = TicketStatus.CLOSED
|
|
|
|
with self.assertRaises(ValueError) as ctx:
|
|
self.service.update_ticket_status(
|
|
ticket_id=1,
|
|
new_status=TicketStatus.OPEN
|
|
)
|
|
|
|
self.assertIn("cannot transition from CLOSED to OPEN", str(ctx.exception))
|
|
self.mock_repo.update_ticket.assert_not_called()
|