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

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)