/** * 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() }) })