AttendanceDetails.test.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * AttendanceDetails组件测试
  3. */
  4. import React from 'react'
  5. import { render, screen } from '@testing-library/react'
  6. import '@testing-library/jest-dom'
  7. import { AttendanceDetails } from '@/components/AttendanceDetails'
  8. import { AttendanceRecord, AttendanceStatus } from '@/types/attendance'
  9. describe('AttendanceDetails组件', () => {
  10. const mockRecords: AttendanceRecord[] = [
  11. {
  12. date: '2023-11-25',
  13. weekday: '星期六',
  14. checkInTime: '08:30',
  15. checkOutTime: '17:30',
  16. status: AttendanceStatus.NORMAL
  17. },
  18. {
  19. date: '2023-11-24',
  20. weekday: '星期五',
  21. checkInTime: '09:15',
  22. checkOutTime: '17:30',
  23. status: AttendanceStatus.LATE
  24. },
  25. {
  26. date: '2023-11-23',
  27. weekday: '星期四',
  28. checkInTime: '08:30',
  29. checkOutTime: '16:30',
  30. status: AttendanceStatus.EARLY_LEAVE
  31. }
  32. ]
  33. test('应该渲染打卡明细标题', () => {
  34. render(<AttendanceDetails records={mockRecords} />)
  35. expect(screen.getByText('打卡明细')).toBeInTheDocument()
  36. })
  37. test('应该渲染所有打卡记录', () => {
  38. render(<AttendanceDetails records={mockRecords} />)
  39. // 日期和星期在同一元素中
  40. expect(screen.getByText((content) => content.includes('11月25日'))).toBeInTheDocument()
  41. expect(screen.getByText((content) => content.includes('11月24日'))).toBeInTheDocument()
  42. expect(screen.getByText((content) => content.includes('11月23日'))).toBeInTheDocument()
  43. })
  44. test('应该渲染打卡状态标签', () => {
  45. render(<AttendanceDetails records={mockRecords} />)
  46. expect(screen.getByText('正常')).toBeInTheDocument()
  47. expect(screen.getByText('迟到')).toBeInTheDocument()
  48. expect(screen.getByText('早退')).toBeInTheDocument()
  49. })
  50. test('应该渲染打卡时间信息', () => {
  51. render(<AttendanceDetails records={mockRecords} />)
  52. // 多个记录中有相同的打卡时间
  53. expect(screen.getAllByText('上班: 08:30').length).toBeGreaterThan(0)
  54. expect(screen.getAllByText('下班: 17:30').length).toBeGreaterThan(0)
  55. expect(screen.getByText('上班: 09:15')).toBeInTheDocument()
  56. })
  57. test('应该渲染空列表', () => {
  58. render(<AttendanceDetails records={[]} />)
  59. expect(screen.getByText('打卡明细')).toBeInTheDocument()
  60. })
  61. test('应该按日期倒序渲染记录', () => {
  62. const { container } = render(<AttendanceDetails records={mockRecords} />)
  63. const records = container.querySelectorAll('.border-gray-100')
  64. expect(records).toHaveLength(3)
  65. // 检查第一条记录包含11月25日
  66. expect(screen.getByText((content) => content.includes('11月25日'))).toBeInTheDocument()
  67. })
  68. })