106 lines
4.4 KiB
Python
106 lines
4.4 KiB
Python
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)
|