import { ResponsiveDialog } from '@/components/Dialog'
import { Button, TextField, TwakeMuiThemeProvider } from '@linagora/twake-mui'
import { fireEvent, render, screen } from '@testing-library/react'
import React from 'react'
describe('ResponsiveDialog', () => {
const mockOnClose = jest.fn()
const mockOnExpandToggle = jest.fn()
const renderWithTheme = (ui: React.ReactElement) => {
return render({ui})
}
beforeEach(() => {
mockOnClose.mockClear()
mockOnExpandToggle.mockClear()
})
it('renders in normal mode by default', () => {
renderWithTheme(
)
expect(screen.getByText('Test Dialog')).toBeInTheDocument()
expect(screen.getByLabelText(/name/i)).toBeInTheDocument()
})
it('renders title in normal mode', () => {
renderWithTheme(
Content
)
expect(screen.getByText('My Title')).toBeInTheDocument()
expect(screen.queryByLabelText('show less')).not.toBeInTheDocument()
})
it('renders back arrow in extended mode', () => {
renderWithTheme(
Content
)
expect(screen.queryByText('My Title')).not.toBeInTheDocument()
expect(screen.getByLabelText('show less')).toBeInTheDocument()
})
it('calls onExpandToggle when back arrow is clicked', () => {
renderWithTheme(
Content
)
const backButton = screen.getByLabelText('show less')
fireEvent.click(backButton)
expect(mockOnExpandToggle).toHaveBeenCalledTimes(1)
})
it('renders actions when provided', () => {
renderWithTheme(
Custom Action}
>
Content
)
expect(screen.getByText('Custom Action')).toBeInTheDocument()
})
it('does not render actions when not provided', () => {
const { container } = renderWithTheme(
Content
)
const dialogActions = container.querySelector('.MuiDialogActions-root')
expect(dialogActions).not.toBeInTheDocument()
})
it('calls onClose when backdrop is clicked', () => {
renderWithTheme(
Content
)
const backdrop = document.querySelector('.MuiBackdrop-root')
if (backdrop) {
fireEvent.click(backdrop)
}
expect(mockOnClose).toHaveBeenCalled()
})
it('applies custom normalMaxWidth', () => {
renderWithTheme(
Normal Width Content
)
expect(screen.getByText('Normal Width Content')).toBeInTheDocument()
})
it('wraps children in Stack component', () => {
renderWithTheme(
)
expect(screen.getByLabelText('Field 1')).toBeInTheDocument()
expect(screen.getByLabelText('Field 2')).toBeInTheDocument()
})
it('uses correct spacing in normal mode', () => {
renderWithTheme(
Normal Spacing Content
)
expect(screen.getByText('Normal Spacing Content')).toBeInTheDocument()
})
it('uses correct spacing in extended mode', () => {
renderWithTheme(
Extended Spacing Content
)
expect(screen.getByText('Extended Spacing Content')).toBeInTheDocument()
})
it('applies contentSx custom styles', () => {
renderWithTheme(
Custom Styled Content
)
expect(screen.getByText('Custom Styled Content')).toBeInTheDocument()
})
it('applies titleSx custom styles', () => {
const { container } = renderWithTheme(
Content
)
const title = screen.getByText('Test')
expect(title).toBeInTheDocument()
})
it('shows dividers when dividers prop is true', () => {
renderWithTheme(
Content with Dividers
)
expect(screen.getByText('Content with Dividers')).toBeInTheDocument()
})
it('does not show back arrow when onExpandToggle is not provided', () => {
renderWithTheme(
Content
)
expect(screen.queryByLabelText('show less')).not.toBeInTheDocument()
expect(screen.getByText('Test Title')).toBeInTheDocument()
})
it('accepts custom headerHeight', () => {
renderWithTheme(
Custom Header Content
)
expect(screen.getByText('Custom Header Content')).toBeInTheDocument()
})
it('renders with custom expandedContentMaxWidth', () => {
renderWithTheme(
Wide Content
)
expect(screen.getByText('Wide Content')).toBeInTheDocument()
})
it('does not render dialog content when open is false', () => {
renderWithTheme(
Test Content
)
expect(screen.queryByText('Test Content')).not.toBeInTheDocument()
})
it('renders correctly in extended mode', () => {
renderWithTheme(
Extended Content
)
expect(screen.getByText('Extended Content')).toBeInTheDocument()
expect(screen.getByLabelText('show less')).toBeInTheDocument()
})
it('renders expand and close icons in normal mode when showHeaderActions is true', () => {
renderWithTheme(
Content
)
expect(screen.getByLabelText('expand')).toBeInTheDocument()
expect(screen.getByLabelText('close')).toBeInTheDocument()
})
it('does not render header icons when showHeaderActions is false', () => {
renderWithTheme(
Content
)
expect(screen.queryByLabelText('expand')).not.toBeInTheDocument()
expect(screen.queryByLabelText('close')).not.toBeInTheDocument()
expect(screen.getByText('Test Title')).toBeInTheDocument()
})
it('calls onClose when close icon is clicked', () => {
renderWithTheme(
Content
)
const closeButton = screen.getByLabelText('close')
fireEvent.click(closeButton)
expect(mockOnClose).toHaveBeenCalledTimes(1)
})
it('calls onExpandToggle when expand icon is clicked', () => {
renderWithTheme(
Content
)
const expandButton = screen.getByLabelText('expand')
fireEvent.click(expandButton)
expect(mockOnExpandToggle).toHaveBeenCalledTimes(1)
})
})