import { describe, it, expect } from 'vitest' import { render, screen } from '@testing-library/react' import { DetailedProjectCard } from './DetailedProjectCard' const DEFAULT_PROPS = { title: 'Big Project', year: '2023', role: 'Lead Dev', stack: ['Vue', 'Go'], description: 'A detailed project description', details: ['First detail point', 'Second detail point'], } describe('DetailedProjectCard', () => { describe('rendering', () => { it('renders the project title', () => { render() expect(screen.getByText('Big Project')).toBeInTheDocument() }) it('renders the description', () => { render() expect(screen.getByText('A detailed project description')).toBeInTheDocument() }) it('renders each detail item', () => { render() expect(screen.getByText('First detail point')).toBeInTheDocument() expect(screen.getByText('Second detail point')).toBeInTheDocument() }) it('renders ProjectMetadata with year, role, and stack', () => { render() expect(screen.getByText('2023')).toBeInTheDocument() expect(screen.getByText('Lead Dev')).toBeInTheDocument() expect(screen.getByText('Vue')).toBeInTheDocument() expect(screen.getByText('Go')).toBeInTheDocument() }) }) describe('structure', () => { it('outer grid has grid-cols-1 and lg:grid-cols-12', () => { const { container } = render() expect(container.firstChild).toHaveClass('grid', 'grid-cols-1', 'lg:grid-cols-12') }) it('title is rendered as an h3', () => { render() expect(screen.getByRole('heading', { level: 3 })).toHaveTextContent('Big Project') }) it('detail items are rendered as

tags with text-base', () => { render() const detail = screen.getByText('First detail point') expect(detail.tagName).toBe('P') expect(detail).toHaveClass('text-base') }) it('details list has brutal-border-top and pt-6', () => { render() const detail = screen.getByText('First detail point') const detailList = detail.parentElement expect(detailList).toHaveClass('brutal-border-top', 'pt-6') }) it('description has text-lg and mb-6', () => { render() const desc = screen.getByText('A detailed project description') expect(desc).toHaveClass('text-lg', 'mb-6') }) }) describe('conditional image rendering', () => { it('does not render image when imageUrl is absent', () => { const { container } = render() expect(container.querySelector('img')).toBeNull() }) it('renders image when imageUrl is provided', () => { render() const img = screen.getByRole('img') expect(img).toHaveAttribute('src', '/detail.jpg') }) it('image wrapper has aspect-video and brutal-border when imageUrl is provided', () => { const { container } = render() const imgWrapper = container.querySelector('img')!.parentElement expect(imgWrapper).toHaveClass('aspect-video', 'brutal-border') }) }) })