import userEvent from '@testing-library/user-event';
import React from 'react';
import { Container } from './Container';
import { render, screen } from '../../lib/testing';
describe('components/Container', () => {
it('handles onPress event', async () => {
const user = userEvent.setup();
const handlePress = vi.fn();
render(Content);
const container = screen.getByText('Content');
await user.click(container);
expect(handlePress).toHaveBeenCalledTimes(1);
});
it('applies interactive styles when onPress is present', () => {
const { rerender } = render(Content);
let container = screen.getByText('Content');
expect(container).not.toHaveClass('cursor-pointer');
rerender( {}}>Content);
container = screen.getByText('Content');
expect(container).toHaveClass('cursor-pointer');
expect(container).toHaveClass('hover:brightness-95');
expect(container).toHaveClass('active:opacity-80');
});
it('renders as different HTML elements using the "as" prop', () => {
const { rerender } = render(Main Content);
expect(screen.getByText('Main Content').tagName).toBe('MAIN');
rerender(Article Content);
expect(screen.getByText('Article Content').tagName).toBe('ARTICLE');
rerender(Section Content);
expect(screen.getByText('Section Content').tagName).toBe('SECTION');
});
it('renders as an anchor tag with href when href prop is provided', () => {
render(Link Content);
const linkElement = screen.getByText('Link Content');
expect(linkElement.tagName).toBe('A');
expect(linkElement).toHaveAttribute('href', '/test-path');
});
it('gives precedence to href over onPress', async () => {
const user = userEvent.setup();
const handlePress = vi.fn();
render(
Link Content
);
const linkElement = screen.getByText('Link Content');
await user.click(linkElement);
expect(handlePress).not.toHaveBeenCalled();
expect(linkElement.tagName).toBe('A');
});
it('warns when both href and onPress are provided', () => {
const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
render(
{}}>
Content
);
expect(consoleWarnSpy).toHaveBeenCalledWith(
'[@ermnvldmr/ui] Container cannot have both `onPress` and `href` props.',
);
consoleWarnSpy.mockRestore();
});
});