DataTablePagination.test.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { describe, it, expect, vi } from 'vitest';
  2. import { render, screen, fireEvent } from '@testing-library/react';
  3. import { DataTablePagination } from './DataTablePagination';
  4. describe('DataTablePagination', () => {
  5. const mockOnPageChange = vi.fn();
  6. beforeEach(() => {
  7. mockOnPageChange.mockClear();
  8. });
  9. it('should render pagination with correct page numbers', () => {
  10. render(
  11. <DataTablePagination
  12. currentPage={1}
  13. totalCount={50}
  14. pageSize={10}
  15. onPageChange={mockOnPageChange}
  16. />
  17. );
  18. expect(screen.getByText('1')).toBeInTheDocument();
  19. expect(screen.getByText('2')).toBeInTheDocument();
  20. expect(screen.getByText('3')).toBeInTheDocument();
  21. expect(screen.getByText('4')).toBeInTheDocument();
  22. expect(screen.getByText('5')).toBeInTheDocument();
  23. });
  24. it('should handle page change when clicking on page number', () => {
  25. render(
  26. <DataTablePagination
  27. currentPage={1}
  28. totalCount={50}
  29. pageSize={10}
  30. onPageChange={mockOnPageChange}
  31. />
  32. );
  33. const page2Button = screen.getByText('2');
  34. fireEvent.click(page2Button);
  35. expect(mockOnPageChange).toHaveBeenCalledWith(2, 10);
  36. });
  37. it('should handle previous page click', () => {
  38. render(
  39. <DataTablePagination
  40. currentPage={2}
  41. totalCount={50}
  42. pageSize={10}
  43. onPageChange={mockOnPageChange}
  44. />
  45. );
  46. const previousButton = screen.getByLabelText('Go to previous page');
  47. fireEvent.click(previousButton);
  48. expect(mockOnPageChange).toHaveBeenCalledWith(1, 10);
  49. });
  50. it('should handle next page click', () => {
  51. render(
  52. <DataTablePagination
  53. currentPage={2}
  54. totalCount={50}
  55. pageSize={10}
  56. onPageChange={mockOnPageChange}
  57. />
  58. );
  59. const nextButton = screen.getByLabelText('Go to next page');
  60. fireEvent.click(nextButton);
  61. expect(mockOnPageChange).toHaveBeenCalledWith(3, 10);
  62. });
  63. it('should disable previous button on first page', () => {
  64. render(
  65. <DataTablePagination
  66. currentPage={1}
  67. totalCount={50}
  68. pageSize={10}
  69. onPageChange={mockOnPageChange}
  70. />
  71. );
  72. const previousButton = screen.getByLabelText('Go to previous page');
  73. expect(previousButton).toHaveClass('pointer-events-none');
  74. expect(previousButton).toHaveClass('opacity-50');
  75. });
  76. it('should disable next button on last page', () => {
  77. render(
  78. <DataTablePagination
  79. currentPage={5}
  80. totalCount={50}
  81. pageSize={10}
  82. onPageChange={mockOnPageChange}
  83. />
  84. );
  85. const nextButton = screen.getByLabelText('Go to next page');
  86. expect(nextButton).toHaveClass('pointer-events-none');
  87. expect(nextButton).toHaveClass('opacity-50');
  88. });
  89. it('should show ellipsis for many pages', () => {
  90. render(
  91. <DataTablePagination
  92. currentPage={5}
  93. totalCount={100}
  94. pageSize={10}
  95. onPageChange={mockOnPageChange}
  96. />
  97. );
  98. // 对于多页情况,应该显示第一页、最后一页和当前页附近的页面
  99. expect(screen.getByText('1')).toBeInTheDocument();
  100. expect(screen.getByText('10')).toBeInTheDocument();
  101. expect(screen.getByText('3')).toBeInTheDocument();
  102. expect(screen.getByText('4')).toBeInTheDocument();
  103. expect(screen.getByText('5')).toBeInTheDocument();
  104. expect(screen.getByText('6')).toBeInTheDocument();
  105. expect(screen.getByText('7')).toBeInTheDocument();
  106. });
  107. });