import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import { Provider } from '../provider/widget-provider'
import {
clearAllWidgetStores,
useTransformEnabled,
useWidgetId,
} from '../stores'
import { Category } from './category'
import { StackToggle } from '../actions/stack-toggle/stack-toggle'
import type { CategoryWidgetData } from './types'
beforeEach(() => clearAllWidgetStores())
afterEach(() => clearAllWidgetStores())
// Replicates the stack-toggle branch of `CategoryActionWiring` from the
// storybook composer. The composer-level wiring isn't testable in
// `apps/storybook` (no vitest infra), so we re-implement just the
// stack-toggle branch here and assert the action → bridge → UI path
// end-to-end through Provider → action → bridge → UI.
function Wired() {
const id = useWidgetId()
const stacked = useTransformEnabled(id, 'stack-toggle')
return (
)
}
const DATA: CategoryWidgetData = [
[
{ name: 'A', value: 45 },
{ name: 'B', value: 30 },
],
[
{ name: 'A', value: 32 },
{ name: 'B', value: 18 },
],
]
describe('Category + StackToggle composer wiring', () => {
it('default (StackToggle off) → multi-series renders one bar per series per row', () => {
const { container } = render(
,
)
// CategoryRowMulti renders one track per series per row → 2 rows × 2 = 4.
expect(container.querySelectorAll('[data-size]').length).toBe(4)
// No breakdown text from the stacked row.
expect(screen.queryByText(/Women: 45/)).toBeNull()
})
it('clicking the stack action flips multi-series rendering to stacked rows', () => {
const { container } = render(
,
)
fireEvent.click(screen.getByRole('button', { name: /stack|unstack/i }))
// Stacked rendering: one track per row → 2 tracks total.
expect(container.querySelectorAll('[data-size]').length).toBe(2)
// Breakdown text appears.
expect(screen.getByText('Women: 45')).toBeTruthy()
expect(screen.getByText('Men: 32')).toBeTruthy()
// Totals show in the header.
expect(screen.getByText('77')).toBeTruthy() // A: 45 + 32
expect(screen.getByText('48')).toBeTruthy() // B: 30 + 18
})
it('toggling off again restores CategoryRowMulti rendering', () => {
const { container } = render(
,
)
const button = screen.getByRole('button', { name: /stack|unstack/i })
fireEvent.click(button) // on
fireEvent.click(button) // off
expect(container.querySelectorAll('[data-size]').length).toBe(4)
expect(screen.queryByText(/Women: 45/)).toBeNull()
})
})