import { fireEvent, render, screen } from '@testing-library/react'
import { TreeNodeIcon } from './tree-node-icon'
const mocks = vi.hoisted(() => ({
getFileIconType: vi.fn(() => 'document'),
}))
vi.mock('../../utils/file-utils', () => ({
getFileIconType: mocks.getFileIconType,
}))
describe('TreeNodeIcon', () => {
beforeEach(() => {
vi.clearAllMocks()
})
// Folder nodes should render toggle affordances and icon state.
describe('Folder nodes', () => {
it('should render an open-folder icon when folder is expanded', () => {
// Arrange
render(
,
)
// Act
const toggleButton = screen.getByRole('button', { name: /workflow\.skillSidebar\.toggleFolder/i })
const icon = toggleButton.querySelector('[aria-hidden="true"]')
// Assert
expect(toggleButton).toBeInTheDocument()
expect(icon).toHaveClass('text-text-accent')
expect(mocks.getFileIconType).not.toHaveBeenCalled()
})
it('should render a closed-folder icon when folder is collapsed', () => {
// Arrange
render(
,
)
// Act
const toggleButton = screen.getByRole('button', { name: /workflow\.skillSidebar\.toggleFolder/i })
const icon = toggleButton.querySelector('[aria-hidden="true"]')
// Assert
expect(icon).toHaveClass('text-text-secondary')
})
it('should call onToggle when folder icon button is clicked', () => {
// Arrange
const onToggle = vi.fn()
render(
,
)
// Act
fireEvent.click(screen.getByRole('button', { name: /workflow\.skillSidebar\.toggleFolder/i }))
// Assert
expect(onToggle).toHaveBeenCalledTimes(1)
})
})
// File nodes should resolve icon type and optionally show dirty indicator.
describe('File nodes', () => {
it('should resolve file icon type and show dirty marker when file is dirty', () => {
// Arrange
const { container } = render(
,
)
// Act
const dirtyMarker = container.querySelector('.bg-text-warning-secondary')
// Assert
expect(screen.queryByRole('button', { name: /workflow\.skillSidebar\.toggleFolder/i })).not.toBeInTheDocument()
expect(mocks.getFileIconType).toHaveBeenCalledWith('guide.md', 'md')
expect(dirtyMarker).toBeInTheDocument()
})
it('should hide dirty marker when file is clean', () => {
// Arrange
const { container } = render(
,
)
// Act
const dirtyMarker = container.querySelector('.bg-text-warning-secondary')
// Assert
expect(mocks.getFileIconType).toHaveBeenCalledWith('README', undefined)
expect(dirtyMarker).not.toBeInTheDocument()
})
})
})