/** * Component: Category Tree View Tests * Documentation: documentation/frontend/components.md */ // @vitest-environment jsdom import { describe, expect, it, vi } from 'vitest'; import { fireEvent, render, screen, within } from '@testing-library/react'; import { CategoryTreeView } from '@/components/admin/indexers/CategoryTreeView'; import { getChildIds } from '@/lib/utils/torrent-categories'; describe('CategoryTreeView', () => { it('selects parent and children when the parent is toggled', () => { const onChange = vi.fn(); render(); const audioLabel = screen.getByText('Audio'); const audioRow = audioLabel.closest('div')?.parentElement; if (!audioRow) { throw new Error('Audio parent row not found'); } fireEvent.click(within(audioRow).getByRole('switch')); const audioChildren = getChildIds(3000); expect(onChange).toHaveBeenCalledWith( expect.arrayContaining([3000, ...audioChildren]) ); }); it('toggles a child category on and off', () => { const onChange = vi.fn(); render(); const audiobookLabel = screen.getByText('Audiobook'); const audiobookRow = audiobookLabel.closest('div')?.parentElement; if (!audiobookRow) { throw new Error('Audiobook row not found'); } fireEvent.click(within(audiobookRow).getByRole('switch')); expect(onChange).toHaveBeenCalledWith(expect.arrayContaining([3030])); }); it('disables child toggles when all children are selected', () => { const audioChildren = getChildIds(3000); render( ); const audiobookLabel = screen.getByText('Audiobook'); const audiobookRow = audiobookLabel.closest('div')?.parentElement; if (!audiobookRow) { throw new Error('Audiobook row not found'); } expect(within(audiobookRow).getByRole('switch')).toBeDisabled(); }); });