import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, fireEvent, act } from '@testing-library/react';
import { GlobalSnackbar, useSnackbar, type GlobalSnackbarProps } from '../GlobalSnackbar';
describe('GlobalSnackbar Component', () => {
const mockOnClose = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
const defaultProps: GlobalSnackbarProps = {
message: 'Test message',
open: true,
onClose: mockOnClose,
};
describe('Rendering', () => {
it('should render with default props', () => {
render();
expect(screen.getByText('Test message')).toBeInTheDocument();
});
it.each(['success', 'info', 'warning', 'error'] as const)(
'should render with %s severity',
(severity) => {
render(
);
expect(screen.getByText('Test message')).toBeInTheDocument();
}
);
it('should render with custom anchor origin', () => {
render(
);
expect(screen.getByText('Test message')).toBeInTheDocument();
});
});
describe('useSnackbar Hook', () => {
it('should return initial state', () => {
const TestComponent = () => {
const { snackbarProps } = useSnackbar();
return (
{String(snackbarProps.open)}
{snackbarProps.message}
);
};
render();
expect(screen.getByTestId('open').textContent).toBe('false');
expect(screen.getByTestId('message').textContent).toBe('');
});
it('should show message when showMessage is called', async () => {
const TestComponent = () => {
const { snackbarProps, showMessage } = useSnackbar();
return (
{snackbarProps.message}
{String(snackbarProps.open)}
);
};
render();
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: /show/i }));
});
expect(screen.getByTestId('message').textContent).toBe('Hello');
expect(screen.getByTestId('open').textContent).toBe('true');
});
it('should close message when closeMessage is called', async () => {
const TestComponent = () => {
const { snackbarProps, showMessage, closeMessage } = useSnackbar();
return (
{String(snackbarProps.open)}
);
};
render();
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: /show/i }));
});
expect(screen.getByTestId('open').textContent).toBe('true');
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: /close/i }));
});
expect(screen.getByTestId('open').textContent).toBe('false');
});
it('should apply custom options', async () => {
const TestComponent = () => {
const { snackbarProps, showMessage } = useSnackbar({ severity: 'warning' });
return (
{snackbarProps.severity}
);
};
render();
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: /show/i }));
});
expect(screen.getByTestId('severity').textContent).toBe('warning');
});
});
describe('Interaction', () => {
it('should call onClose when close is triggered', async () => {
render();
await act(async () => {
// Trigger close by timeout (autoHideDuration)
});
// Note: MUI Snackbar's close behavior depends on autoHideDuration
});
});
});