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)
})
})