import React from 'react'; import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import { PixelCard } from '../../cards/PixelCard'; /* Extracted from __tests__/data-display.test.tsx (Ola 2 additive upgrade) into the mirrored per-component file. */ describe('PixelCard — legacy behavior preserved', () => { it('renders title + children inside an
by default', () => { const { container } = render(

body content

, ); const article = container.querySelector('article'); expect(article).not.toBeNull(); expect(article!.textContent).toContain('Hello'); expect(article!.textContent).toContain('body content'); }); it('renders footer when provided', () => { render( foot}> body , ); const footer = document.querySelector('footer'); expect(footer).not.toBeNull(); expect(footer!.textContent).toBe('foot'); }); }); describe('PixelCard — headerless (no title)', () => { it('does not render a
when title is omitted', () => { const { container } = render(

well content

, ); expect(container.querySelector('header')).toBeNull(); const article = container.querySelector('article'); expect(article).not.toBeNull(); expect(article!.textContent).toContain('well content'); }); it('still renders the
when title is provided', () => { const { container } = render(body); const header = container.querySelector('header'); expect(header).not.toBeNull(); expect(header!.textContent).toContain('Titled'); }); }); describe('PixelCard — tone tint', () => { it('applies cyan tone classes when tone="cyan"', () => { const { container } = render( body , ); const article = container.querySelector('article'); expect(article).not.toBeNull(); expect(article!.className).toContain('border-retro-cyan'); }); it('does not apply tone classes when tone is omitted', () => { const { container } = render(body); const article = container.querySelector('article'); expect(article!.className).not.toContain('border-retro-cyan'); }); }); describe('PixelCard — interactive hover', () => { it('adds hover translate class when interactive', () => { const { container } = render( body , ); // Interactive cards render a
does not // permit role="button". const card = container.querySelector('[role="button"]'); expect(card!.className).toContain('hover:-translate-y-[2px]'); expect(card!.className).toContain('hover:shadow-lg'); }); it('omits hover translate when interactive is not set', () => { const { container } = render(body); const article = container.querySelector('article'); expect(article!.className).not.toContain('hover:-translate-y-[2px]'); }); }); describe('PixelCard — media slot', () => { it('renders media node when provided', () => { render( } > body , ); expect(screen.getByTestId('media-img')).toBeInTheDocument(); }); it('adds overflow-hidden to the root when media is present', () => { const { container } = render( m
}> body , ); const article = container.querySelector('article'); expect(article!.className).toContain('overflow-hidden'); }); }); describe('PixelCard — badge ribbon', () => { it('renders a ribbon-like element when badge is provided', () => { render( body , ); expect(screen.getByText('NEW')).toBeInTheDocument(); }); it('places the badge inside an absolutely-positioned wrapper', () => { const { container } = render( body , ); const badgeNode = Array.from(container.querySelectorAll('div')).find( (el) => el.textContent === 'HOT', ); expect(badgeNode).toBeDefined(); expect(badgeNode!.className).toContain('absolute'); }); }); describe('PixelCard — description', () => { it('renders description as a paragraph', () => { const { container } = render( body , ); const ps = Array.from(container.querySelectorAll('p')); const desc = ps.find((p) => p.textContent === 'A short blurb of muted copy.'); expect(desc).toBeDefined(); expect(desc!.className).toContain('text-retro-muted'); }); it('applies line-clamp-3 + min-h-[3em] when descriptionLines=3', () => { const { container } = render( body , ); const desc = Array.from(container.querySelectorAll('p')).find( (p) => p.textContent === 'lorem', ); expect(desc).toBeDefined(); expect(desc!.className).toContain('line-clamp-3'); expect(desc!.className).toContain('min-h-[3em]'); }); it('applies line-clamp-2 when descriptionLines=2', () => { const { container } = render( body , ); const desc = Array.from(container.querySelectorAll('p')).find( (p) => p.textContent === 'x', ); expect(desc!.className).toContain('line-clamp-2'); }); }); describe('PixelCard — href turns root into ', () => { it('renders an anchor with the given href when href is provided', () => { const { container } = render( body , ); const a = container.querySelector('a'); expect(a).not.toBeNull(); expect(a!.getAttribute('href')).toBe('/somewhere'); expect(container.querySelector('article')).toBeNull(); }); it('keeps tone + interactive classes on the anchor variant', () => { const { container } = render( body , ); const a = container.querySelector('a'); expect(a!.className).toContain('border-retro-cyan'); expect(a!.className).toContain('hover:-translate-y-[2px]'); }); }); describe('PixelCard — padding scale', () => { it('applies p-2 when padding="sm"', () => { const { container } = render( body , ); const article = container.querySelector('article'); expect(article!.className).toContain('p-2'); }); it('applies p-6 when padding="lg"', () => { const { container } = render( body , ); const article = container.querySelector('article'); expect(article!.className).toContain('p-6'); }); it('applies p-0 when padding="none"', () => { const { container } = render( body , ); const article = container.querySelector('article'); expect(article!.className).toContain('p-0'); }); }); describe('PixelCard — named slot subcomponents', () => { it('renders PixelCard.Header as a
element with bottom border', () => { const { container } = render( head , ); const hdr = container.querySelector('header'); expect(hdr).not.toBeNull(); expect(hdr!.className).toContain('border-b'); expect(hdr!.textContent).toContain('head'); }); it('renders PixelCard.Body as a flex-1
', () => { const { container } = render( body , ); const body = container.querySelector('[data-testid="body"]'); expect(body).not.toBeNull(); expect((body as HTMLElement).className).toContain('flex-1'); expect(body!.textContent).toContain('body'); }); it('renders PixelCard.Footer as a