// File: frontend/components/correspondences/list.test.tsx // Change Log: // - 2026-06-13: Initial creation - test coverage for CorrespondenceList component import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { CorrespondenceList } from './list'; import { useAuthStore } from '@/lib/stores/auth-store'; import { CorrespondenceRevision } from '@/types/correspondence'; vi.mock('@/lib/stores/auth-store', () => ({ useAuthStore: vi.fn(), })); describe('CorrespondenceList Component', () => { const mockRevisions: CorrespondenceRevision[] = [ { publicId: '019505a1-7c3e-7000-8000-rev111111111', revisionNumber: 1, revisionLabel: 'A', subject: 'Test Subject Alpha', isCurrent: true, dueDate: '2026-06-20T00:00:00.000Z', createdAt: '2026-06-13T00:00:00.000Z', status: { id: 1, statusCode: 'DRAFT', statusName: 'Draft', }, correspondence: { publicId: '019505a1-7c3e-7000-8000-corr1111111', correspondenceNumber: 'CORR-2026-0001', projectId: 1, isInternal: false, originator: { publicId: '019505a1-7c3e-7000-8000-org111111111', organizationName: 'Originator Org', organizationCode: 'ORG-ORIG', }, project: { publicId: '019505a1-7c3e-7000-8000-proj11111111', projectName: 'Test Project', projectCode: 'PROJ-TEST', }, type: { id: 1, typeName: 'Letter', typeCode: 'LTR', }, }, }, { publicId: '019505a1-7c3e-7000-8000-rev222222222', revisionNumber: 2, revisionLabel: 'B', subject: 'Test Subject Beta', isCurrent: true, dueDate: '2026-06-01T00:00:00.000Z', createdAt: '2026-06-02T00:00:00.000Z', status: { id: 3, statusCode: 'IN_REVIEW', statusName: 'In Review', }, correspondence: { publicId: '019505a1-7c3e-7000-8000-corr2222222', correspondenceNumber: 'CORR-2026-0002', projectId: 1, isInternal: false, originator: { publicId: '019505a1-7c3e-7000-8000-org111111111', organizationName: 'Originator Org', organizationCode: 'ORG-ORIG', }, project: { publicId: '019505a1-7c3e-7000-8000-proj11111111', projectName: 'Test Project', projectCode: 'PROJ-TEST', }, type: { id: 1, typeName: 'Letter', typeCode: 'LTR', }, }, }, ]; beforeEach(() => { vi.clearAllMocks(); vi.mocked(useAuthStore).mockReturnValue({ user: { publicId: '019505a1-7c3e-7000-8000-user11111111', username: 'testuser', email: 'test@np-dms.work', firstName: 'Test', lastName: 'User', role: 'ADMIN', }, hasPermission: () => true, } as any); }); it('ควรเรนเดอร์รายชื่อเอกสารและหัวตารางได้ถูกต้อง', () => { render(); expect(screen.getByText('CORR-2026-0001')).toBeInTheDocument(); expect(screen.getByText('Test Subject Alpha')).toBeInTheDocument(); expect(screen.getByText('A')).toBeInTheDocument(); expect(screen.getAllByText('ORG-ORIG').length).toBeGreaterThan(0); expect(screen.getAllByText('PROJ-TEST').length).toBeGreaterThan(0); }); it('ควรตรวจสอบและแสดงผล Overdue เมื่อเลยกำหนดดิวเดท', () => { render(); const overdueRow = screen.getByText('Test Subject Beta').closest('tr'); expect(overdueRow).toBeInTheDocument(); const dueDateCell = screen.getByText('01 Jun 2026'); expect(dueDateCell).toHaveClass('text-destructive'); }); it('ควรแสดงปุ่มแก้ไขสำหรับผู้มีสิทธิ์ในสถานะที่แก้ไขได้', () => { render(); const editButtons = screen.getAllByTitle('Edit'); expect(editButtons.length).toBeGreaterThan(0); }); it('ควรซ่อนปุ่มแก้ไขหากผู้ใช้ไม่มีสิทธิ์แก้ไข', () => { vi.mocked(useAuthStore).mockReturnValue({ user: { publicId: '019505a1-7c3e-7000-8000-user11111111', username: 'testuser', email: 'test@np-dms.work', firstName: 'Test', lastName: 'User', role: 'VIEWER', }, hasPermission: () => false, } as any); render(); expect(screen.queryByTitle('Edit')).not.toBeInTheDocument(); }); });