import { describe, expect, it, vi } from 'vitest'
import {
buildExportHtmlDocument,
buildFileViewerRenderedHtmlDocument,
resolveFileViewerPrintStyle,
waitForFileViewerNextPaint,
} from '../packages/core/src'
import {
buildPrintPageStyle,
formatCssPixels,
} from '../packages/core/src/printLayout'
describe('print layout helpers', () => {
it('builds a fixed-size print page from CSS pixels', () => {
const css = buildPrintPageStyle({
selector: '.viewer-export-content .pdf-export-page',
width: 816,
height: 1056
})
expect(formatCssPixels(816)).toBe('816px')
expect(css).toContain('@page { size: 8.5in 11in; margin: 0; }')
expect(css).toContain('.viewer-export-content .pdf-export-page')
expect(css).toContain('width: 816px!important')
expect(css).toContain('height:1056px!important')
expect(css).toContain('overflow:hidden!important')
})
it('can keep converted Word pages flowing when content exceeds one page', () => {
const css = buildPrintPageStyle({
selector: '.viewer-export-content .msdoc-page',
width: 794,
height: 1123,
heightMode: 'min'
})
expect(css).toContain('height:auto!important')
expect(css).toContain('min-height:1123px!important')
expect(css).toContain('overflow:visible!important')
})
it('keeps exported print markup isolated from the viewer shell', () => {
const html = buildExportHtmlDocument({
contentHtml: '',
includeDocumentStyles: false,
printStyle: '@page { size: 8.5in 11in; margin: 0; }',
title: 'a"demo".pdf',
watermarkInlineStyle: 'opacity:0.1'
})
expect(html).toContain('a<b>"demo".pdf')
expect(html).toContain('')
expect(html).toContain('')
expect(html).toContain('viewer-export-watermark')
expect(html.trim()).toContain('')
})
it('builds rendered HTML through a core export adapter', async () => {
const html = await buildFileViewerRenderedHtmlDocument({
source: {} as HTMLElement,
mode: 'print',
title: 'adapter.docx',
adapter: {
includeDocumentStyles: false,
printStyle: options => `/* ${options.mode}:${options.title} */`,
toHtml: options => `${options.title}`
},
watermarkInlineStyle: 'opacity:0.2'
})
await expect(resolveFileViewerPrintStyle(null, { mode: 'print', title: 'x' })).resolves.toBe('')
expect(html).toContain('adapter.docx')
expect(html).toContain('')
expect(html).toContain('viewer-export-watermark')
})
it('falls back to a timer when requestAnimationFrame is unavailable', async () => {
const schedule = vi.fn((callback: () => void) => {
callback()
return 1
})
await expect(waitForFileViewerNextPaint({
setTimeout: schedule as unknown as Window['setTimeout']
})).resolves.toBeUndefined()
expect(schedule).toHaveBeenCalledTimes(1)
})
})