help-desk/backend/chat/tests/test_services.py

69 lines
2.8 KiB
Python

from django.test import TestCase
from unittest.mock import MagicMock, patch
from django.contrib.auth import get_user_model
from django.utils import timezone
from chat.services.message_service import MessageService
from chat.models import Message
from helpdesk.services.ticket_service import TicketService # Service ที่ถูกเรียก
UserModel = get_user_model()
class MessageServiceTest(TestCase):
def setUp(self):
# Mock Repository
self.mock_repo = MagicMock()
# Mock TicketService
self.mock_ticket_service = MagicMock(spec=TicketService)
self.mock_ticket_service.get_ticket_ref.return_value = {
"id": 100,
"last_message_at": timezone.now(),
"last_message_content": "",
"is_read": False
}
# Inject Mock เข้าไปใน Service
self.service = MessageService(message_repo=self.mock_repo)
self.service.ticket_service = self.mock_ticket_service
# User จำลอง
self.user = UserModel.objects.create_user(
username='svc_tester', email='svc_tester@test.com', password='p', is_staff=True
)
# Message Data
self.message_data = {
'ticket_id': 100,
'sender': self.user,
'content': 'Test Message Content',
'message_type': 'T'
}
# Mock create_message ให้คืนค่า Message
self.mock_repo.create_message.return_value = Message(
id=1, **self.message_data, timestamp=timezone.now()
)
@patch('chat.services.message_service.MessageService._send_realtime_update')
def test_create_and_send_message_calls_ticket_service_contract(self, mock_send_realtime):
# ACT
new_message = self.service.create_and_send_message(
ticket_id=self.message_data['ticket_id'],
sender=self.message_data['sender'],
content=self.message_data['content'],
message_type=self.message_data['message_type']
)
# ASSERT 1 Repository ถูกเรียกเพื่อบันทึก Message
self.mock_repo.create_message.assert_called_once_with(**self.message_data)
# ASSERT 2 TicketService ถูกเรียกถูกต้อง
self.mock_ticket_service.update_ticket_on_new_message.assert_called_once()
args, kwargs = self.mock_ticket_service.update_ticket_on_new_message.call_args
self.assertEqual(kwargs['ticket_id'], self.message_data['ticket_id'])
self.assertIsInstance(kwargs['timestamp'], timezone.datetime)
self.assertEqual(kwargs['sender_is_agent'], self.user.is_staff)
# ASSERT 3 Realtime Broadcast ถูกเรียก
mock_send_realtime.assert_called_once()