import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { TreeView } from '../TreeView'; import { AnimationsProvider } from '../../../helpers/AnimationsProvider'; jest.mock('../TreeViewList', () => ({ TreeViewList: ({ children, isNested, toolbar, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, isMultiSelectable }) => (

{`TreeViewList isNested: ${isNested}`}

{`TreeViewList toolbar: ${toolbar}`}

{`TreeViewList aria-label: ${ariaLabel}`}

{`TreeViewList aria-labelledBy: ${ariaLabelledBy}`}

{`TreeViewList isMultiSelectable: ${isMultiSelectable}`}

{children}
) })); jest.mock('../TreeViewListItem', () => ({ TreeViewListItem: ({ action, activeItems, badgeProps, checkProps, children, compareItems, customBadgeContent, defaultExpanded, expandedIcon, hasBadge, hasCheckbox, icon, id, isCompact, isExpanded, isSelectable, itemData, name, onCheck, onSelect, onExpand, onCollapse, parentItem, title, useMemo, hasAnimations }) => (

{`TreeViewListItem action: ${action}`}

{activeItems && activeItems[0].name}

{`TreeViewListItem badgeProps: ${badgeProps?.id}`}

{`TreeViewListItem checkProps: ${checkProps?.checked}`}

{`TreeViewListItem customBadgeContent: ${customBadgeContent}`}

{`TreeViewListItem defaultExpanded: ${defaultExpanded}`}

{`TreeViewListItem expandedIcon: ${expandedIcon}`}

{`TreeViewListItem hasBadge: ${hasBadge}`}

{`TreeViewListItem hasCheckbox: ${hasCheckbox}`}

{`TreeViewListItem icon: ${icon}`}

{`TreeViewListItem id: ${id}`}

{`TreeViewListItem isCompact: ${isCompact}`}

{`TreeViewListItem isExpanded: ${isExpanded}`}

{`TreeViewListItem isSelectable: ${isSelectable}`}

{`TreeViewListItem itemData: ${itemData.name}`}

{`TreeViewListItem name: ${name}`}

{`TreeViewListItem parentItem: ${parentItem?.name}`}

{`TreeViewListItem title: ${title}`}

{`TreeViewListItem useMemo: ${useMemo}`}

{`TreeViewListItem hasAnimations: ${hasAnimations}`}

{children}
) })); jest.mock('../TreeViewRoot', () => ({ TreeViewRoot: ({ children, hasCheckboxes, hasGuides, hasSelectableNodes, variant, className }) => (

{`TreeViewRoot hasCheckboxes: ${hasCheckboxes}`}

{`TreeViewRoot hasGuides: ${hasGuides}`}

{`TreeViewRoot hasSelectableNodes: ${hasSelectableNodes}`}

{`TreeViewRoot variant: ${variant}`}

{`TreeViewRoot className: ${className}`}

{children}
) })); const basicData = { name: 'Basic data name' }; test('Passes hasSelectableNodes to TreeViewRoot', () => { render(); expect(screen.getByText('TreeViewRoot hasSelectableNodes: true')).toBeVisible(); }); test('Passes hasCheckboxes to TreeViewRoot', () => { render(); expect(screen.getByText('TreeViewRoot hasCheckboxes: true')).toBeVisible(); }); test('Passes hasGuides to TreeViewRoot', () => { render(); expect(screen.getByText('TreeViewRoot hasGuides: true')).toBeVisible(); }); test('Passes variant to TreeViewRoot', () => { render(); expect(screen.getByText('TreeViewRoot variant: compact')).toBeVisible(); }); test('Passes className to TreeViewRoot', () => { render(); expect(screen.getByText('TreeViewRoot className: test-class')).toBeVisible(); }); test('Passes data as children TreeViewRoot', () => { render(); expect(screen.getByTestId('TreeViewRoot-children')).toContainHTML('TreeViewListItem name: Basic data name'); }); test('Does not render TreeViewRoot when parentItem is passed', () => { render(); expect(screen.queryByTestId('TreeViewRoot-mock')).not.toBeInTheDocument(); }); test('Passes isNested to TreeViewList', () => { render(); expect(screen.getByText('TreeViewList isNested: true')).toBeVisible(); }); test('Passes toolbar to TreeViewList', () => { render(); expect(screen.getByText('TreeViewList toolbar: Toolbar content')).toBeVisible(); }); test('Passes aria-label to TreeViewList', () => { render(); expect(screen.getByText('TreeViewList aria-label: Test aria-label')).toBeVisible(); }); test('Passes aria-labelledby to TreeViewList', () => { render(); expect(screen.getByText('TreeViewList aria-labelledBy: test-aria-labelledby')).toBeVisible(); }); test('Passes isMultiSelectable to TreeViewList', () => { render(); expect(screen.getByText('TreeViewList isMultiSelectable: true')).toBeVisible(); }); test('Passes data as children TreeViewList', () => { render(); expect(screen.getByTestId('TreeViewList-children')).toContainHTML('TreeViewListItem name: Basic data name'); }); test('Passes data action to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem action: Item action')).toBeVisible(); }); test('Passes activeItems to TreeViewListItem', () => { render(); expect(screen.getByTestId('TreeViewListItem-activeItems')).toHaveTextContent('Active item name'); }); test('Passes data badgeProps to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem badgeProps: test-id')).toBeVisible(); }); test('Passes data checkProps to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem checkProps: true')).toBeVisible(); }); test('Passes data customBadgeContent to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem customBadgeContent: Custom badge')).toBeVisible(); }); test('Passes data defaultExpanded to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible(); }); test('Passes defaultAllExpanded to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible(); }); test('Passes data expandedIcon to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible(); }); test('Passes expandedIcon to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible(); }); test('Passes data hasBadge to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible(); }); test('Passes hasBadges to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible(); }); test('Passes data hasCheckbox to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible(); }); test('Passes hasCheckboxes to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible(); }); test('Passes data icon to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible(); }); test('Passes icon to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible(); }); test('Passes data id to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem id: test-id')).toBeVisible(); }); ['default', 'compact', 'compactNoBackground'].forEach((variant) => { test(`Passes isCompact to TreeViewListItem when variant=${variant}`, () => { render(); expect(screen.getByText(`TreeViewListItem isCompact: ${variant === 'default' ? 'false' : 'true'}`)).toBeVisible(); }); }); test('Passes allExpanded to TreeViewListItem isExpanded prop', () => { render(); expect(screen.getByText('TreeViewListItem isExpanded: true')).toBeVisible(); }); test('Passes hasSelectableNodes to TreeViewListItem isSelectable prop', () => { render(); expect(screen.getByText('TreeViewListItem isSelectable: true')).toBeVisible(); }); test('Passes data to TreeViewListItem itemData prop', () => { render(); expect(screen.getByText('TreeViewListItem itemData: itemData name')).toBeVisible(); }); test('Passes data.name to TreeViewListItem name prop', () => { render(); expect(screen.getByText('TreeViewListItem name: Basic data name')).toBeVisible(); }); test('Passes parentItem to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem parentItem: Parent name')).toBeVisible(); }); test('Passes data.title to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem title: Basic data title')).toBeVisible(); }); test('Passes useMemo to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem useMemo: true')).toBeVisible(); }); test('Passes hasAnimations to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem hasAnimations: true')).toBeVisible(); }); // Animation context tests test('respects AnimationsProvider context when no local hasAnimations prop', () => { render( ); expect(screen.getByText('TreeViewListItem hasAnimations: true')).toBeVisible(); }); test('local hasAnimations prop takes precedence over context', () => { render( ); expect(screen.getByText('TreeViewListItem hasAnimations: false')).toBeVisible(); }); test('works without AnimationsProvider (backward compatibility)', () => { render(); expect(screen.getByText('TreeViewListItem hasAnimations: false')).toBeVisible(); }); test('Passes data.children to TreeViewListItem', () => { render(); expect(screen.getByText('TreeViewListItem name: Child 1')).toBeVisible(); }); describe('Passes callback props to TreeViewListItem', () => { const user = userEvent.setup(); const callbackMock = jest.fn(); test('Passes compareItems', async () => { render(); await user.click(screen.getByRole('button', { name: 'compareItems clicker' })); expect(callbackMock).toHaveBeenCalledTimes(1); }); test('Passes onCheck', async () => { render(); await user.click(screen.getByRole('button', { name: 'onCheck clicker' })); expect(callbackMock).toHaveBeenCalledTimes(1); }); test('Passes onSelect', async () => { render(); await user.click(screen.getByRole('button', { name: 'onSelect clicker' })); expect(callbackMock).toHaveBeenCalledTimes(1); }); test('Passes onExpand', async () => { render(); await user.click(screen.getByRole('button', { name: 'onExpand clicker' })); expect(callbackMock).toHaveBeenCalledTimes(1); }); test('Passes onCollapse', async () => { render(); await user.click(screen.getByRole('button', { name: 'onCollapse clicker' })); expect(callbackMock).toHaveBeenCalledTimes(1); }); }); test('Matches snapshot', () => { const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); });