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

94 lines
3.8 KiB
Python

# chat/tests/test_views.py
from django.urls import reverse
from rest_framework.test import APITestCase, APIClient
from rest_framework import status
from django.contrib.auth import get_user_model
from django.utils import timezone
from helpdesk.models import Ticket
from chat.models import Message
UserModel = get_user_model()
class MessageViewSetFunctionalTest(APITestCase):
"""Functional Test สำหรับ MessageViewSet"""
def setUp(self):
# 1. สร้าง Users
self.agent = UserModel.objects.create_user(
username="agent1",
email="agent1@example.com",
password="password123",
is_staff=True
)
self.customer = UserModel.objects.create_user(
username="customer1",
email="customer1@example.com",
password="password123",
is_staff=False
)
# 2. สร้าง APIClient และ force_authenticate
self.client_agent = APIClient()
self.client_agent.force_authenticate(user=self.agent)
self.client_customer = APIClient()
self.client_customer.force_authenticate(user=self.customer)
# 3. สร้าง Ticket ตัวอย่าง
self.ticket = Ticket.objects.create(
creator=self.customer,
title="Chat Functional Test Ticket",
last_message_at=timezone.now()
)
def test_message_list_and_create(self):
"""Test GET /messages/?ticket_id= และ POST /messages/"""
url = reverse('chat-messages-list') # ต้องตรงกับ router ของ MessageViewSet
# GET messages → ต้องว่างก่อนสร้าง
response = self.client_agent.get(url, {"ticket_id": self.ticket.id})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 0)
# POST ข้อความ Agent ส่ง
post_data_agent = {
"ticket": self.ticket.id,
"content": "Hello from Agent",
"message_type": "T"
}
response = self.client_agent.post(url, post_data_agent, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data['content'], post_data_agent['content'])
# ตรวจสอบ Ticket.is_read → Agent ส่งเอง → ต้อง True
self.ticket.refresh_from_db()
self.assertTrue(self.ticket.is_read)
# POST ข้อความ Customer ส่ง
post_data_customer = {
"ticket": self.ticket.id,
"content": "Customer: I need help!",
"message_type": "T"
}
response = self.client_customer.post(url, post_data_customer, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
# ตรวจสอบ Ticket.is_read → Customer ส่ง → ต้อง False
self.ticket.refresh_from_db()
self.assertFalse(self.ticket.is_read)
# GET messages → ต้องมี 2 ข้อความ ----
response = self.client_agent.get(url, {"ticket_id": self.ticket.id})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data[0]['content'], "Hello from Agent")
self.assertEqual(response.data[1]['content'], "Customer: I need help!")
# ตรวจสอบว่า Message ใน DB ถูกสร้างครบ ----
messages = Message.objects.filter(ticket=self.ticket).order_by('timestamp')
self.assertEqual(messages.count(), 2)
self.assertEqual(messages[0].content, "Hello from Agent")
self.assertEqual(messages[1].content, "Customer: I need help!")