from django.test import TestCase from django.contrib.auth import get_user_model from django.utils import timezone from unittest.mock import patch from helpdesk.models import Ticket from chat.services.message_service import MessageService from helpdesk.services.ticket_service import ticket_service as global_ticket_service UserModel = get_user_model() class MessageTicketIntegrationTest(TestCase): def setUp(self): # ผู้ใช้ Agent (ต้องใส่ email ให้ไม่ซ้ำ) self.user = UserModel.objects.create_user( username='tester', email='tester@example.com', password='testpassword', is_staff=True ) # Ticket เริ่มต้น (เก็บเวลาไว้เพื่อใช้เปรียบเทียบ) self.ticket = Ticket.objects.create( creator=self.user, title="Ticket for Chat Integration Test", last_message_at=timezone.now() ) # เก็บค่า datetime เดิมไว้ (ก่อนมีข้อความใหม่) self.original_last_message_at = self.ticket.last_message_at self.message_service = MessageService() self.message_service.ticket_service = global_ticket_service # ปิด Realtime ด้วย mock (เพื่อตัด websocket ออกจาก test) @patch('chat.services.message_service.MessageService._send_realtime_update') def test_message_creation_updates_ticket_data(self, mock_send_realtime): """ GIVEN: มี Ticket อยู่ก่อนแล้ว WHEN: Agent ส่งข้อความใหม่ผ่าน MessageService THEN: last_message_content, last_message_at, is_read ต้องถูกอัปเดตถูกต้อง """ new_content = "This is the newest message content from Agent." # ACT new_message = self.message_service.create_and_send_message( ticket_id=self.ticket.id, sender=self.user, content=new_content, message_type='T' ) # ASSERT 1 Message ถูกสร้างในฐานข้อมูล self.assertIsNotNone(new_message.id) # ดึง Ticket ใหม่จาก DB self.ticket.refresh_from_db() # ASSERT 2 เนื้อหาข้อความล่าสุดถูกอัปเดต self.assertEqual(self.ticket.last_message_content, new_content) # ASSERT 3 Agent ส่ง → is_read ต้องเป็น True self.assertEqual(self.ticket.is_read, True) # ASSERT 4 เวลา last_message_at ต้องใหม่กว่าเวลาของ ticket เดิม self.assertGreater(self.ticket.last_message_at, self.original_last_message_at) # ASSERT 5 realtime broadcast ถูกเรียก (เพราะ mock) mock_send_realtime.assert_called_once() @patch('chat.services.message_service.MessageService._send_realtime_update') def test_message_creation_handles_non_agent_message_correctly(self, mock_send_realtime): """ GIVEN: ผู้ส่งเป็น customer (is_staff=False) WHEN: ส่งข้อความใหม่เข้ามา THEN: Ticket.is_read ต้องเป็น False (รอ Agent อ่าน) """ customer = UserModel.objects.create_user( username='customer', email='customer@example.com', # ต้องใส่ email เพื่อไม่ให้ซ้ำ password='p', is_staff=False ) new_content = "Customer: I need help." # ACT self.message_service.create_and_send_message( ticket_id=self.ticket.id, sender=customer, content=new_content, message_type='T' ) # ASSERT: ดึงข้อมูลล่าสุดจาก DB self.ticket.refresh_from_db() # เนื้อหาต้องตรงกับข้อความใหม่ self.assertEqual(self.ticket.last_message_content, new_content) # ลูกค้าส่ง → Agent ยังไม่ได้อ่าน → is_read = False self.assertEqual(self.ticket.is_read, False)