import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import { Pagination } from '@/components/ui/Pagination'; describe('Pagination', () => { const defaultProps = { page: 1, perPage: 50, total: 200, onPageChange: vi.fn(), }; it('renders page info text', () => { render(); expect(screen.getByText('Page 1 of 4')).toBeInTheDocument(); }); it('renders total count', () => { render(); expect(screen.getByText('200 total')).toBeInTheDocument(); }); it('disables First and Prev buttons on first page', () => { render(); expect(screen.getByRole('button', { name: 'First' })).toBeDisabled(); expect(screen.getByRole('button', { name: 'Prev' })).toBeDisabled(); }); it('disables Next and Last buttons on last page', () => { render(); expect(screen.getByRole('button', { name: 'Next' })).toBeDisabled(); expect(screen.getByRole('button', { name: 'Last' })).toBeDisabled(); }); it('enables all nav buttons on a middle page', () => { render(); expect(screen.getByRole('button', { name: 'First' })).not.toBeDisabled(); expect(screen.getByRole('button', { name: 'Prev' })).not.toBeDisabled(); expect(screen.getByRole('button', { name: 'Next' })).not.toBeDisabled(); expect(screen.getByRole('button', { name: 'Last' })).not.toBeDisabled(); }); it('calls onPageChange(1) when First is clicked', () => { const onPageChange = vi.fn(); render( , ); fireEvent.click(screen.getByRole('button', { name: 'First' })); expect(onPageChange).toHaveBeenCalledWith(1); }); it('calls onPageChange with previous page when Prev is clicked', () => { const onPageChange = vi.fn(); render( , ); fireEvent.click(screen.getByRole('button', { name: 'Prev' })); expect(onPageChange).toHaveBeenCalledWith(2); }); it('calls onPageChange with next page when Next is clicked', () => { const onPageChange = vi.fn(); render( , ); fireEvent.click(screen.getByRole('button', { name: 'Next' })); expect(onPageChange).toHaveBeenCalledWith(3); }); it('calls onPageChange with last page when Last is clicked', () => { const onPageChange = vi.fn(); render( , ); fireEvent.click(screen.getByRole('button', { name: 'Last' })); expect(onPageChange).toHaveBeenCalledWith(4); }); it('calls onPerPageChange when per-page select changes', () => { const onPerPageChange = vi.fn(); render(); fireEvent.change(screen.getByRole('combobox'), { target: { value: '25' } }); expect(onPerPageChange).toHaveBeenCalledWith(25); }); it('handles zero total gracefully (shows 1 of 1)', () => { render(); expect(screen.getByText('Page 1 of 1')).toBeInTheDocument(); }); it('shows 1 page total for total less than perPage', () => { render(); expect(screen.getByText('Page 1 of 1')).toBeInTheDocument(); }); });