import { describe, expect, it, vi } from 'vitest'; import { userEvent } from 'vitest/browser'; import { render } from 'vitest-browser-react'; import Tile from './Tile.js'; describe(' component', () => { const defaultProps = { activeStartDate: new Date(2019, 0, 1), children: '', classes: [], date: new Date(2019, 0, 1), maxDateTransform: (date: Date) => date, minDateTransform: (date: Date) => date, view: 'month', } satisfies React.ComponentProps; it('renders button properly', async () => { const { container } = await render(); expect(container.querySelector('button')).toBeInTheDocument(); }); it('passes onClick to button', async () => { const onClick = vi.fn(); const { container } = await render(); const button = container.querySelector('button') as HTMLButtonElement; await userEvent.click(button); expect(onClick).toHaveBeenCalledTimes(1); }); it('passes classes to button properly', async () => { const classes = ['a', 'b', 'c']; const { container } = await render(); const button = container.querySelector('button'); for (const className of classes) { expect(button).toHaveClass(className); } }); it('renders children properly', async () => { const children = 'Hello'; const { container } = await render({children}); expect(container).toHaveTextContent(children); }); it('does not render abbr by default', async () => { const { container } = await render(); expect(container.querySelector('abbr')).not.toBeInTheDocument(); }); it('calls formatAbbr properly', async () => { const date = new Date(2019, 5, 1); const formatAbbr = vi.fn(); const locale = 'en-US'; await render(); expect(formatAbbr).toHaveBeenCalledTimes(1); expect(formatAbbr).toHaveBeenCalledWith(locale, date); }); it('renders abbr with children properly given formatAbbr', async () => { const children = 'Hello'; const ariaLabel = 'ariaLabel'; const formatAbbr = () => ariaLabel; const { container } = await render( {children} , ); const abbr = container.querySelector('abbr'); expect(abbr).toBeInTheDocument(); expect(abbr).toHaveTextContent(children); expect(abbr).toHaveAccessibleName(ariaLabel); }); it('calls tileClassName properly', async () => { const activeStartDate = new Date(2019, 5, 1); const date = new Date(2019, 5, 15); const tileClassName = vi.fn(); const view = 'month'; const { rerender } = await render( , ); // Trigger any unrelated prop change await rerender( , ); expect(tileClassName).toHaveBeenCalledTimes(1); expect(tileClassName).toHaveBeenCalledWith({ activeStartDate, date, view, }); }); it('applies tileClassName to button properly given function', async () => { const className = 'className'; const tileClassName = () => className; const { container } = await render(); const button = container.querySelector('button'); expect(button).toHaveClass(className); }); it('applies tileClassName to button properly given string', async () => { const className = 'className'; const { container } = await render(); const button = container.querySelector('button'); expect(button).toHaveClass(className); }); it('calls tileContent properly', async () => { const activeStartDate = new Date(2019, 5, 1); const date = new Date(2019, 5, 15); const tileContent = vi.fn(); const view = 'month'; const { rerender } = await render( , ); // Trigger any unrelated prop change await rerender( , ); expect(tileContent).toHaveBeenCalledTimes(1); expect(tileContent).toHaveBeenCalledWith({ activeStartDate, date, view, }); }); it('applies tileContent to button properly given function', async () => { const content = 'content'; const tileContent = () => content; const { container } = await render(); const button = container.querySelector('button'); expect(button).toHaveTextContent(content); }); it('applies tileContent to button properly given string', async () => { const content = 'className'; const { container } = await render(); const button = container.querySelector('button'); expect(button).toHaveTextContent(content); }); it('calls tileDisabled properly', async () => { const activeStartDate = new Date(2019, 5, 1); const date = new Date(2019, 5, 15); const tileDisabled = vi.fn(); const view = 'month'; await render( , ); expect(tileDisabled).toHaveBeenCalledTimes(1); expect(tileDisabled).toHaveBeenCalledWith({ activeStartDate, date, view, }); }); it('disables button properly given tileDisabled returning true', async () => { const tileDisabled = () => true; const { container } = await render(); const button = container.querySelector('button'); expect(button).toBeDisabled(); }); });