/**
* Tests for CategoryRowSingle and CategoryRowMulti — both files share the
* same conditional-render branches (onClick presence, labelFormatter
* presence, selected default).
*/
import { describe, it, expect, vi } from 'vitest'
import { render, fireEvent } from '@testing-library/react'
import { ThemeProvider, createTheme } from '@mui/material/styles'
import { CategoryRowSingle } from './category-row-single'
import { CategoryRowMulti } from './category-row-multi'
const theme = createTheme({})
function renderWithTheme(ui: React.ReactElement) {
return render({ui})
}
const formatter = (v: number) => `${v}`
describe('CategoryRowSingle', () => {
it('renders the name and formatted value', () => {
const { getByText } = renderWithTheme(
,
)
expect(getByText('Category A')).toBeDefined()
expect(getByText('42')).toBeDefined()
})
it('applies labelFormatter when provided', () => {
const { getByText } = renderWithTheme(
`[${s}]`}
/>,
)
expect(getByText('[raw]')).toBeDefined()
})
it('invokes onClick with the row name when clicked', () => {
const onClick = vi.fn()
const { getByText } = renderWithTheme(
,
)
fireEvent.click(getByText('X'))
expect(onClick).toHaveBeenCalledWith({ name: 'X' })
})
it('renders without onClick (handleClick=undefined branch)', () => {
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
it('respects selected=false', () => {
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
})
describe('CategoryRowMulti', () => {
it('renders the name and one bar per value', () => {
const { getByText, getAllByText } = renderWithTheme(
,
)
expect(getByText('Multi A')).toBeDefined()
expect(getAllByText('1')).toHaveLength(1)
expect(getAllByText('2')).toHaveLength(1)
expect(getAllByText('3')).toHaveLength(1)
})
it('applies labelFormatter when provided', () => {
const { getByText } = renderWithTheme(
`<${s}>`}
/>,
)
expect(getByText('')).toBeDefined()
})
it('invokes onClick with the row name when clicked', () => {
const onClick = vi.fn()
const { getByText } = renderWithTheme(
,
)
fireEvent.click(getByText('ClickRow'))
expect(onClick).toHaveBeenCalledWith({ name: 'ClickRow' })
})
it('renders without onClick', () => {
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
it('cycles colors when values.length exceeds colors.length (modulo branch)', () => {
// 4 values, 2 colors → uses modulo to cycle (colors[index % colors.length])
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
it('handles colors[i % colors.length] being undefined (?? "" fallback)', () => {
// Empty colors array → colors[0 % 0] === undefined → falls back to ''
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
it('respects selected=false', () => {
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
it('renders an empty bar container when values is empty', () => {
expect(() =>
renderWithTheme(
,
),
).not.toThrow()
})
})