import { describe, it, expect } from 'vitest' import { render, fireEvent, screen } from '@testing-library/react' import React from 'react' import { GoogleSheetsViewer } from '../google-sheets-viewer' import { PdfViewer } from '../pdf-viewer' import { FigmaEmbed } from '../figma-embed' /** * Output-parity pins for the `EmbedViewerFrame` extraction (the merge gate): * the structural markers each PRE-extraction viewer rendered must survive the * refactor byte-for-byte — wrapper spacing, title element + classes, action * containers, empty-state shapes, iframe attributes — plus the one behavior * that motivated the "prove it first" requirement: figma's STATEFUL * present/browse ToggleGroup working through the frame's plain-ReactNode * `actions` slot. */ describe('EmbedViewerFrame parity', () => { it('GoogleSheetsViewer: h2.text-h3 title, space-y-4 wrapper, one action button, iframe src', () => { const { container } = render( , ) expect(container.firstElementChild?.className).toContain('space-y-4') const title = container.querySelector('h2') expect(title?.className).toContain('text-h3') expect(title?.textContent).toBe('Budget') expect(screen.getByText('Open in Google Sheets')).toBeTruthy() expect(container.querySelector('iframe')?.getAttribute('src')).toContain('docs.google.com') }) it('GoogleSheetsViewer: empty URL renders the standalone header-less empty state', () => { const { container } = render() expect(container.querySelector('h2')).toBeNull() expect(screen.getByText('Google Sheet URL not configured')).toBeTruthy() expect(container.querySelector('iframe')).toBeNull() }) it('PdfViewer: two actions in their own container, callbacks preferred over hrefs', () => { let previewed = 0 const { container } = render( previewed++} />) const title = container.querySelector('h2') expect(title?.className).toContain('text-h3') fireEvent.click(screen.getByText('Preview')) expect(previewed).toBe(1) // Download has no callback → renders as a link to the src. const download = screen.getByText('Download').closest('a') expect(download?.getAttribute('href')).toBe('https://x.test/doc.pdf') expect(container.querySelector('iframe')?.getAttribute('src')).toBe('https://x.test/doc.pdf') }) it('FigmaEmbed: my-6 space-y-3 wrapper, span.text-h6 title, allow/fullscreen on the iframe', () => { const { container } = render( , ) const wrapper = container.firstElementChild expect(wrapper?.className).toContain('my-6') expect(wrapper?.className).toContain('space-y-3') expect(wrapper?.className).not.toContain('space-y-4') // tailwind-merge: caller spacing wins expect(container.querySelector('h2')).toBeNull() const title = Array.from(container.querySelectorAll('span')).find((s) => s.textContent === 'Spec') expect(title?.className).toContain('text-h6') const iframe = container.querySelector('iframe') expect(iframe?.getAttribute('allow')).toContain('clipboard-write') // Historical behavior pinned: EmbedIframe DROPS allowFullScreen when // `allow` already grants fullscreen (embed-iframe.tsx:96), so the // attribute was absent pre-extraction too. expect(iframe?.getAttribute('allow')).toContain('fullscreen') expect(iframe?.hasAttribute('allowfullscreen')).toBe(false) }) it('FigmaEmbed: empty URL keeps NO iframe and shows the figma empty message', () => { const { container } = render() expect(screen.getByText('Figma URL not configured')).toBeTruthy() expect(container.querySelector('iframe')).toBeNull() }) it('FigmaEmbed slides: the STATEFUL ToggleGroup works through the actions slot and swaps the iframe src', () => { const { container } = render() const srcBefore = container.querySelector('iframe')?.getAttribute('src') ?? '' expect(screen.getByLabelText('Figma slides view mode')).toBeTruthy() fireEvent.click(screen.getByLabelText('Browse')) const srcAfter = container.querySelector('iframe')?.getAttribute('src') ?? '' expect(srcAfter).not.toBe(srcBefore) // view flip recomputes embedSrc → EmbedIframe remounts on new src // Flip back — state survives round trips (it lives in FigmaEmbed, not the slot). fireEvent.click(screen.getByLabelText('Present')) expect(container.querySelector('iframe')?.getAttribute('src')).toBe(srcBefore) }) })