import React from 'react';
import { render, screen, fireEvent, act } from '@testing-library/react';
import Alert from './Alert';
import Warning from '../icons/Warning';
beforeEach(() => {
// Mock IntersectionObserver
// @ts-ignore
window.IntersectionObserver = jest.fn(() => ({
observe: jest.fn(),
unobserve: jest.fn(),
disconnect: jest.fn(),
takeRecords: jest.fn(),
}));
// Mock setTimeout/clearTimeout
jest.useFakeTimers();
});
afterEach(() => {
jest.useRealTimers();
});
describe('Alert Component', () => {
it('renders Alert unchanged', () => {
const { container } = render(
);
expect(container).toMatchSnapshot();
});
it('renders Alert open unchanged', () => {
const { container } = render(
);
expect(container).toMatchSnapshot();
});
it('calls onClose when close button is clicked', () => {
const onClose = jest.fn();
render(
);
const closeButton = screen.getByTitle('close');
fireEvent.click(closeButton);
expect(onClose).toHaveBeenCalled();
});
it('auto-dismisses after duration', () => {
const onClose = jest.fn();
render(
);
act(() => {
jest.advanceTimersByTime(3000);
});
expect(onClose).toHaveBeenCalled();
});
it('renders with custom width', () => {
const { container } = render(
);
const style = window.getComputedStyle(container.firstChild as Element);
expect(style.getPropertyValue('--memori-alert--width')).toBe('500px');
});
it('renders with action button', () => {
const actionClick = jest.fn();
render(
Action}
/>
);
const actionButton = screen.getByText('Action');
fireEvent.click(actionButton);
expect(actionClick).toHaveBeenCalled();
});
it('cleans up timer on unmount', () => {
const onClose = jest.fn();
const { unmount } = render(
);
unmount();
act(() => {
jest.advanceTimersByTime(3000);
});
expect(onClose).not.toHaveBeenCalled();
});
});