import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import BadgesButton from '../../components/BadgesButton';
import { defaultStyles } from '../../defaultStyles';
import type { AchievementDetails } from '../../types';
describe('BadgesButton', () => {
const mockOnClick = jest.fn();
const mockAchievements: AchievementDetails[] = [
{
achievementId: 'achievement1',
achievementTitle: 'Achievement 1',
achievementDescription: 'Description 1',
achievementIconKey: 'star',
},
{
achievementId: 'achievement2',
achievementTitle: 'Achievement 2',
achievementDescription: 'Description 2',
achievementIconKey: 'trophy',
},
];
const defaultProps = {
onClick: mockOnClick,
position: 'top-right' as const,
styles: defaultStyles.badgesButton,
unlockedAchievements: mockAchievements,
};
beforeEach(() => {
mockOnClick.mockClear();
});
it('renders with default position', () => {
render();
const button = screen.getByRole('button');
expect(button).toBeInTheDocument();
expect(button).toHaveStyle({
position: 'fixed',
top: '20px',
right: '20px',
});
});
it('renders with bottom-left position', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveStyle({
position: 'fixed',
bottom: '20px',
left: '20px',
});
});
it('calls onClick handler when clicked', async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByRole('button'));
expect(mockOnClick).toHaveBeenCalledTimes(1);
});
it('renders with custom styles', () => {
const customStyles = {
...defaultStyles.badgesButton,
backgroundColor: 'red',
borderRadius: '10px',
};
render();
const button = screen.getByRole('button');
expect(button).toHaveStyle({
backgroundColor: 'red',
borderRadius: '10px',
});
});
it('renders with custom icon', () => {
const customIcon = '🌟';
render();
expect(screen.getByText(customIcon)).toBeInTheDocument();
});
it('applies hover styles on mouse over', () => {
render();
const button = screen.getByRole('button');
fireEvent.mouseEnter(button);
expect(button).toHaveStyle({ transform: 'scale(1.1)' });
fireEvent.mouseLeave(button);
expect(button).toHaveStyle({ transform: 'scale(1)' });
});
});