Card.test.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /**
  2. * Tests for the Card components.
  3. */
  4. import { describe, it, expect, vi } from 'vitest';
  5. import { screen, fireEvent } from '@testing-library/react';
  6. import { render } from '../utils';
  7. import { Card, CardHeader, CardContent } from '../../components/Card';
  8. describe('Card', () => {
  9. it('renders children', () => {
  10. render(<Card>Test Content</Card>);
  11. expect(screen.getByText('Test Content')).toBeInTheDocument();
  12. });
  13. it('applies custom className', () => {
  14. const { container } = render(<Card className="custom-class">Content</Card>);
  15. expect(container.firstChild).toHaveClass('custom-class');
  16. });
  17. it('applies default styling classes', () => {
  18. const { container } = render(<Card>Content</Card>);
  19. expect(container.firstChild).toHaveClass('bg-bambu-dark-secondary');
  20. expect(container.firstChild).toHaveClass('rounded-xl');
  21. expect(container.firstChild).toHaveClass('border');
  22. });
  23. it('handles click events', () => {
  24. const handleClick = vi.fn();
  25. render(<Card onClick={handleClick}>Clickable</Card>);
  26. fireEvent.click(screen.getByText('Clickable'));
  27. expect(handleClick).toHaveBeenCalledTimes(1);
  28. });
  29. it('handles context menu events', () => {
  30. const handleContextMenu = vi.fn();
  31. render(<Card onContextMenu={handleContextMenu}>Right-clickable</Card>);
  32. fireEvent.contextMenu(screen.getByText('Right-clickable'));
  33. expect(handleContextMenu).toHaveBeenCalledTimes(1);
  34. });
  35. });
  36. describe('CardHeader', () => {
  37. it('renders children', () => {
  38. render(<CardHeader>Header Content</CardHeader>);
  39. expect(screen.getByText('Header Content')).toBeInTheDocument();
  40. });
  41. it('applies border styling', () => {
  42. const { container } = render(<CardHeader>Header</CardHeader>);
  43. expect(container.firstChild).toHaveClass('border-b');
  44. expect(container.firstChild).toHaveClass('px-6');
  45. expect(container.firstChild).toHaveClass('py-4');
  46. });
  47. it('applies custom className', () => {
  48. const { container } = render(
  49. <CardHeader className="custom-header">Header</CardHeader>
  50. );
  51. expect(container.firstChild).toHaveClass('custom-header');
  52. });
  53. });
  54. describe('CardContent', () => {
  55. it('renders children', () => {
  56. render(<CardContent>Body Content</CardContent>);
  57. expect(screen.getByText('Body Content')).toBeInTheDocument();
  58. });
  59. it('applies padding styling', () => {
  60. const { container } = render(<CardContent>Content</CardContent>);
  61. expect(container.firstChild).toHaveClass('p-6');
  62. });
  63. it('applies custom className', () => {
  64. const { container } = render(
  65. <CardContent className="custom-content">Content</CardContent>
  66. );
  67. expect(container.firstChild).toHaveClass('custom-content');
  68. });
  69. });
  70. describe('Card composition', () => {
  71. it('composes Card with Header and Content', () => {
  72. render(
  73. <Card>
  74. <CardHeader>My Header</CardHeader>
  75. <CardContent>My Content</CardContent>
  76. </Card>
  77. );
  78. expect(screen.getByText('My Header')).toBeInTheDocument();
  79. expect(screen.getByText('My Content')).toBeInTheDocument();
  80. });
  81. });