import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import BadgesModal from '../../components/BadgesModal'; import { defaultStyles } from '../../defaultStyles'; describe('BadgesModal', () => { const mockOnClose = jest.fn(); const mockAchievements = [ { achievementId: 'test1', achievementTitle: 'Test Achievement 1', achievementDescription: 'Description 1', achievementIconKey: 'star', }, { achievementId: 'test2', achievementTitle: 'Test Achievement 2', achievementDescription: 'Description 2', achievementIconKey: 'trophy', }, ]; const defaultProps = { isOpen: true, onClose: mockOnClose, achievements: mockAchievements, styles: defaultStyles.badgesModal, icons: { star: '⭐', trophy: '🏆', }, }; beforeEach(() => { mockOnClose.mockClear(); }); it('renders when isOpen is true', () => { render(); expect(screen.getByRole('dialog')).toBeInTheDocument(); }); it('does not render when isOpen is false', () => { render(); expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); }); it('displays achievements with icons', () => { render(); mockAchievements.forEach(achievement => { expect(screen.getByText(achievement.achievementTitle)).toBeInTheDocument(); expect(screen.getByText(achievement.achievementDescription)).toBeInTheDocument(); }); expect(screen.getByText('⭐')).toBeInTheDocument(); expect(screen.getByText('🏆')).toBeInTheDocument(); }); it('calls onClose when close button is clicked', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('button', { name: /close/i })); expect(mockOnClose).toHaveBeenCalledTimes(1); }); it('calls onClose when clicking outside modal', async () => { const user = userEvent.setup(); render(); const overlay = screen.getByTestId('modal-overlay'); await user.click(overlay); expect(mockOnClose).toHaveBeenCalledTimes(1); }); it('renders with custom styles', () => { const customStyles = { ...defaultStyles.badgesModal, content: { ...defaultStyles.badgesModal.content, backgroundColor: 'red', }, title: { ...defaultStyles.badgesModal.title, color: 'blue', }, }; render(); const modalContent = screen.getByRole('dialog'); const header = screen.getByRole('heading'); expect(modalContent).toHaveStyle({ backgroundColor: 'red' }); expect(header).toHaveStyle({ color: 'blue' }); }); it('displays empty state when no achievements', () => { render(); expect(screen.getByText(/no achievements yet/i)).toBeInTheDocument(); }); });