Files
workavia-calendar-front/__test__/components/ResponsiveDialog.test.tsx
T
lethemanh cadfa70e60 #708 apply strictier linting rules (#717)
* #708 apply strictier linting rules and fix simple eslint bugs

* #708 fix eslint errors relate to promise

* #708 fix eslint import/no-extraneous-dependencies

* #708 fix eslint errors of react-hook

* #708 enable eslint check for typescript

---------

Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
2026-04-01 17:15:10 +02:00

379 lines
9.7 KiB
TypeScript

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(<TwakeMuiThemeProvider>{ui}</TwakeMuiThemeProvider>)
}
beforeEach(() => {
mockOnClose.mockClear()
mockOnExpandToggle.mockClear()
})
it('renders in normal mode by default', () => {
renderWithTheme(
<ResponsiveDialog open={true} onClose={mockOnClose} title="Test Dialog">
<TextField label="Name" />
</ResponsiveDialog>
)
expect(screen.getByText('Test Dialog')).toBeInTheDocument()
expect(screen.getByLabelText(/name/i)).toBeInTheDocument()
})
it('renders title in normal mode', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="My Title"
isExpanded={false}
>
<div>Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('My Title')).toBeInTheDocument()
expect(screen.queryByLabelText('show less')).not.toBeInTheDocument()
})
it('renders back arrow in extended mode', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="My Title"
isExpanded={true}
onExpandToggle={mockOnExpandToggle}
>
<div>Content</div>
</ResponsiveDialog>
)
expect(screen.queryByText('My Title')).not.toBeInTheDocument()
expect(screen.getByLabelText('show less')).toBeInTheDocument()
})
it('calls onExpandToggle when back arrow is clicked', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={true}
onExpandToggle={mockOnExpandToggle}
>
<div>Content</div>
</ResponsiveDialog>
)
const backButton = screen.getByLabelText('show less')
fireEvent.click(backButton)
expect(mockOnExpandToggle).toHaveBeenCalledTimes(1)
})
it('renders actions when provided', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
actions={<Button>Custom Action</Button>}
>
<div>Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Custom Action')).toBeInTheDocument()
})
it('does not render actions when not provided', () => {
const { container } = renderWithTheme(
<ResponsiveDialog open={true} onClose={mockOnClose} title="Test">
<div>Content</div>
</ResponsiveDialog>
)
const dialogActions = container.querySelector('.MuiDialogActions-root')
expect(dialogActions).not.toBeInTheDocument()
})
it('calls onClose when backdrop is clicked', () => {
renderWithTheme(
<ResponsiveDialog open={true} onClose={mockOnClose} title="Test">
<div>Content</div>
</ResponsiveDialog>
)
const backdrop = document.querySelector('.MuiBackdrop-root')
if (backdrop) {
fireEvent.click(backdrop)
}
expect(mockOnClose).toHaveBeenCalled()
})
it('applies custom normalMaxWidth', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
normalMaxWidth="800px"
>
<div>Normal Width Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Normal Width Content')).toBeInTheDocument()
})
it('wraps children in Stack component', () => {
renderWithTheme(
<ResponsiveDialog open={true} onClose={mockOnClose} title="Test">
<TextField label="Field 1" />
<TextField label="Field 2" />
</ResponsiveDialog>
)
expect(screen.getByLabelText('Field 1')).toBeInTheDocument()
expect(screen.getByLabelText('Field 2')).toBeInTheDocument()
})
it('uses correct spacing in normal mode', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={false}
normalSpacing={2}
>
<div>Normal Spacing Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Normal Spacing Content')).toBeInTheDocument()
})
it('uses correct spacing in extended mode', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={true}
expandedSpacing={3}
>
<div>Extended Spacing Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Extended Spacing Content')).toBeInTheDocument()
})
it('applies contentSx custom styles', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
contentSx={{ padding: 4 }}
>
<div>Custom Styled Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Custom Styled Content')).toBeInTheDocument()
})
it('applies titleSx custom styles', () => {
const { container } = renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
titleSx={{ color: 'red' }}
>
<div>Content</div>
</ResponsiveDialog>
)
const title = screen.getByText('Test')
expect(title).toBeInTheDocument()
})
it('shows dividers when dividers prop is true', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
dividers={true}
>
<div>Content with Dividers</div>
</ResponsiveDialog>
)
expect(screen.getByText('Content with Dividers')).toBeInTheDocument()
})
it('does not show back arrow when onExpandToggle is not provided', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test Title"
isExpanded={true}
>
<div>Content</div>
</ResponsiveDialog>
)
expect(screen.queryByLabelText('show less')).not.toBeInTheDocument()
expect(screen.getByText('Test Title')).toBeInTheDocument()
})
it('accepts custom headerHeight', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={true}
headerHeight="70px"
>
<div>Custom Header Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Custom Header Content')).toBeInTheDocument()
})
it('renders with custom expandedContentMaxWidth', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={true}
expandedContentMaxWidth="1200px"
>
<div>Wide Content</div>
</ResponsiveDialog>
)
expect(screen.getByText('Wide Content')).toBeInTheDocument()
})
it('does not render dialog content when open is false', () => {
renderWithTheme(
<ResponsiveDialog open={false} onClose={mockOnClose} title="Test">
<div>Test Content</div>
</ResponsiveDialog>
)
expect(screen.queryByText('Test Content')).not.toBeInTheDocument()
})
it('renders correctly in extended mode', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={true}
onExpandToggle={mockOnExpandToggle}
>
<div>Extended Content</div>
</ResponsiveDialog>
)
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(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={false}
onExpandToggle={mockOnExpandToggle}
showHeaderActions={true}
>
<div>Content</div>
</ResponsiveDialog>
)
expect(screen.getByLabelText('expand')).toBeInTheDocument()
expect(screen.getByLabelText('close')).toBeInTheDocument()
})
it('does not render header icons when showHeaderActions is false', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test Title"
isExpanded={false}
onExpandToggle={mockOnExpandToggle}
showHeaderActions={false}
>
<div>Content</div>
</ResponsiveDialog>
)
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(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={false}
showHeaderActions={true}
>
<div>Content</div>
</ResponsiveDialog>
)
const closeButton = screen.getByLabelText('close')
fireEvent.click(closeButton)
expect(mockOnClose).toHaveBeenCalledTimes(1)
})
it('calls onExpandToggle when expand icon is clicked', () => {
renderWithTheme(
<ResponsiveDialog
open={true}
onClose={mockOnClose}
title="Test"
isExpanded={false}
onExpandToggle={mockOnExpandToggle}
showHeaderActions={true}
>
<div>Content</div>
</ResponsiveDialog>
)
const expandButton = screen.getByLabelText('expand')
fireEvent.click(expandButton)
expect(mockOnExpandToggle).toHaveBeenCalledTimes(1)
})
})