import React from 'react'; import { describe, expect, it, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Pagination } from './pagination.component'; describe('Pagination', () => { const defaultProps = { currentItems: 10, totalItems: 100, pageNumber: 1, pageSize: 10, onPageNumberChange: vi.fn(), }; it('renders nothing when totalItems is 0', () => { const { container } = render(); expect(container).toBeEmptyDOMElement(); }); it('renders pagination when totalItems is greater than 0', () => { render(); expect(screen.getByText(/10 \/ 100 items/i)).toBeInTheDocument(); }); it('displays correct items count for the first page', () => { render(); expect(screen.getByText(/10 \/ 100 items/i)).toBeInTheDocument(); }); it('displays correct items count for a middle page', () => { render(); expect(screen.getByText(/50 \/ 100 items/i)).toBeInTheDocument(); }); it('displays correct items count for the last page with fewer items', () => { render(); expect(screen.getByText(/95 \/ 95 items/i)).toBeInTheDocument(); }); it('renders ConfigurableLink when dashboardLinkUrl is provided', () => { render(); expect(screen.getByRole('link', { name: /see all/i })).toBeInTheDocument(); expect(screen.getByRole('link', { name: /see all/i })).toHaveAttribute('href', '/dashboard'); }); it('uses custom label when dashboardLinkLabel is provided', () => { render(); expect(screen.getByRole('link', { name: /view all items/i })).toBeInTheDocument(); }); it('does not render ConfigurableLink when dashboardLinkUrl is not provided', () => { render(); expect(screen.queryByRole('link')).not.toBeInTheDocument(); }); it('calls onPageNumberChange when page changes', async () => { const user = userEvent.setup(); const onPageNumberChange = vi.fn(); render(); const nextButton = screen.getByRole('button', { name: /next/i }); await user.click(nextButton); expect(onPageNumberChange).toHaveBeenCalled(); }); it('handles case when pageSize is greater than totalItems', () => { render(); expect(screen.getByText(/30 \/ 30 items/i)).toBeInTheDocument(); }); });