import { describe, test, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { WrapperUI } from './wrapper-ui' import { useWidgetStore } from '../stores/widget-store' import type { WrapperState } from './types' describe('WrapperUI', () => { const widgetId = 'test-wrapper-ui' const defaultProps = { id: widgetId, children:
Test Content
, } beforeEach(() => { useWidgetStore.getState().clearWidgets() // Pre-set the widget in the store with default values useWidgetStore.getState().setWidget(widgetId, { title: 'Wrapper Widget', collapsed: false, disabled: false, isFetching: false, }) }) test('renders correctly with default props', () => { render() expect(screen.getByText('Test Content')).toBeTruthy() expect(screen.getByText('Wrapper Widget')).toBeTruthy() }) test('renders with custom title from store', () => { useWidgetStore.getState().setWidget(widgetId, { title: 'Custom Title', }) render() expect(screen.getByText('Custom Title')).toBeTruthy() }) test('renders in expanded state by default', () => { useWidgetStore.getState().setWidget(widgetId, { collapsed: false, }) render() const accordion = screen.getByRole('region') expect(accordion).toBeTruthy() }) test('renders in collapsed state', () => { useWidgetStore.getState().setWidget(widgetId, { collapsed: true, }) render() // When collapsed, AccordionDetails is not visible const accordion = screen.getByRole('button') expect(accordion).toBeTruthy() }) test('renders loading indicator when isFetching is true', () => { useWidgetStore.getState().setWidget(widgetId, { isFetching: true, }) render() const progressBar = screen.getByRole('progressbar') expect(progressBar).toBeTruthy() }) test('does not render loading indicator when isFetching is false', () => { useWidgetStore.getState().setWidget(widgetId, { isFetching: false, }) render() const progressBar = screen.queryByRole('progressbar') expect(progressBar).toBeNull() }) test('renders actions when provided and not collapsed', () => { const actions = [ , , ] useWidgetStore.getState().setWidget(widgetId, { collapsed: false, }) render() expect(screen.getByText('Action 1')).toBeTruthy() expect(screen.getByText('Action 2')).toBeTruthy() }) test('renders actions even when collapsed', () => { const actions = [] useWidgetStore.getState().setWidget(widgetId, { collapsed: true, }) render() // Actions are rendered in the AccordionSummary which is always visible expect(screen.getByText('Action 1')).toBeTruthy() }) test('does not render actions when array is empty', () => { render() // No actions should be rendered expect(screen.getByText('Test Content')).toBeTruthy() }) test('renders options when provided', () => { const options = [ { label: 'Option 1', onClick: vi.fn(), }, ] render() const optionsButton = screen.getByLabelText('Options') expect(optionsButton).toBeTruthy() }) test('renders options with custom label', () => { const options = [ { label: 'Option 1', onClick: vi.fn(), }, ] const labels = { options: { title: 'Custom Options Label', }, } render() const optionsButton = screen.getByLabelText('Custom Options Label') expect(optionsButton).toBeTruthy() }) test('does not render options when array is empty', () => { render() const optionsButton = screen.queryByLabelText('Options') expect(optionsButton).toBeNull() }) test('handles onChangeCollapsed callback', () => { const onChangeCollapsed = vi.fn() render( , ) const accordion = screen.getByRole('button') fireEvent.click(accordion) expect(onChangeCollapsed).toHaveBeenCalledTimes(1) }) test('renders disabled state', () => { useWidgetStore.getState().setWidget(widgetId, { disabled: true, }) render() const accordion = screen.getByRole('button') expect(accordion.classList.contains('Mui-disabled')).toBe(true) }) test('applies custom sx styles', () => { const sx = { backgroundColor: 'red' } render() // Component should render (we can't easily test sx application without jest-dom) expect(screen.getByText('Test Content')).toBeTruthy() }) test('renders children correctly', () => { render(
Child 1
Child 2
, ) expect(screen.getByText('Child 1')).toBeTruthy() expect(screen.getByText('Child 2')).toBeTruthy() }) test('renders with all props combined', () => { const actions = [] const options = [ { label: 'Option 1', onClick: vi.fn(), }, ] const labels = { options: { title: 'Custom Options', }, } const onChangeCollapsed = vi.fn() useWidgetStore.getState().setWidget(widgetId, { title: 'Full Test', collapsed: false, disabled: false, isFetching: true, }) render( , ) expect(screen.getByText('Full Test')).toBeTruthy() expect(screen.getByText('Action 1')).toBeTruthy() expect(screen.getByLabelText('Custom Options')).toBeTruthy() expect(screen.getByRole('progressbar')).toBeTruthy() expect(screen.getByText('Test Content')).toBeTruthy() }) test('handles collapse toggle multiple times', () => { const onChangeCollapsed = vi.fn() render( , ) const accordion = screen.getByRole('button') fireEvent.click(accordion) fireEvent.click(accordion) expect(onChangeCollapsed).toHaveBeenCalledTimes(2) }) })