import { cleanup, render, screen, within } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { CmsRouteProvider, type CmsRouteData } from '@/spa/cmsRoute'
import { pressIndexContent } from '@/spa/pressIndexContent'
import Press from '@/spa/pages/Press'
const viewport = vi.hoisted(() => ({ mobile: false }))
vi.mock('@/spa/hooks/useIsMobile', () => ({
useIsMobile: () => viewport.mobile,
}))
vi.mock('next/navigation', () => ({
usePathname: () => '/presse',
useRouter: () => ({ push: vi.fn(), replace: vi.fn() }),
}))
const pressRoute = (contactImage?: unknown, contactImageAlt?: string): CmsRouteData => ({
collection: 'pages',
doc: {
id: 'press-page',
slug: 'presse',
spaPath: '/presse',
pressIndex: {
downloads: {
contactImage,
contactImageAlt,
},
},
},
lists: {
events: [],
posts: [],
},
})
describe('Presse contact image', () => {
beforeEach(() => {
viewport.mobile = false
})
afterEach(() => cleanup())
it('renders selected media and page-owned alt text in the desktop right column', () => {
render(
,
)
const layout = screen.getByTestId('press-contact-layout')
const imageColumn = screen.getByTestId('press-contact-image')
const image = within(imageColumn).getByRole('img', { name: 'Press team portrait' })
expect(layout.getAttribute('data-layout')).toBe('two-column')
expect(layout.style.gridTemplateColumns).toBe('minmax(0, 1fr) minmax(320px, 1fr)')
expect(image.getAttribute('src')).toBe('/api/media/file/press-contact.jpg')
expect(
screen.getByTestId('press-contact-copy').compareDocumentPosition(imageColumn) &
Node.DOCUMENT_POSITION_FOLLOWING,
).toBeTruthy()
})
it('clears only the visual and keeps the contact copy in a compact fallback-free layout', () => {
const { rerender } = render(
,
)
expect(screen.getByTestId('press-contact-image')).toBeTruthy()
rerender(
,
)
const layout = screen.getByTestId('press-contact-layout')
expect(screen.queryByTestId('press-contact-image')).toBeNull()
expect(layout.getAttribute('data-layout')).toBe('copy-only')
expect(layout.style.gridTemplateColumns).toBe('1fr')
expect(
within(screen.getByTestId('press-contact-copy')).getByText(
pressIndexContent.downloads.contactName,
),
).toBeTruthy()
expect(within(layout).queryByRole('img')).toBeNull()
})
it('stacks copy before the selected image on mobile', () => {
viewport.mobile = true
render(
,
)
const layout = screen.getByTestId('press-contact-layout')
const copy = screen.getByTestId('press-contact-copy')
const imageColumn = screen.getByTestId('press-contact-image')
expect(layout.getAttribute('data-layout')).toBe('stacked')
expect(layout.style.gridTemplateColumns).toBe('1fr')
expect(
within(imageColumn).getByRole('img', { name: 'Mobile press contact' }).getAttribute('src'),
).toBe('/api/media/file/press-contact-mobile.jpg')
expect(
copy.compareDocumentPosition(imageColumn) & Node.DOCUMENT_POSITION_FOLLOWING,
).toBeTruthy()
})
})