openpencil/tests/engine/cli/fonts.test.ts
2026-09-01 13:24:35 +03:00

63 lines
2.4 KiB
TypeScript

import { expect, setDefaultTimeout, test } from 'bun:test'
import { mkdtemp } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { BUILTIN_IO_FORMATS, IORegistry } from '@open-pencil/core/io'
import type { DocumentFontStatus } from '@open-pencil/core/text'
import { runOpenPencilCLI } from '#tests/helpers/cli'
import { repoPath, requireBuiltWorkspacePackages } from '#tests/helpers/paths'
import { firstPageId, makeSceneGraph } from '#tests/helpers/scene'
import { heavy } from '#tests/helpers/test-utils'
requireBuiltWorkspacePackages()
setDefaultTimeout(30_000)
const GOLD = repoPath('tests/fixtures/gold-preview.fig')
const io = new IORegistry(BUILTIN_IO_FORMATS)
async function createUnresolvedFontFixture(): Promise<string> {
const directory = await mkdtemp(join(tmpdir(), 'open-pencil-fonts-cli-'))
const path = join(directory, 'unresolved.fig')
const graph = makeSceneGraph('Fonts')
graph.createNode('TEXT', firstPageId(graph), {
text: 'Hello',
fontFamily: 'Definitely Missing Font',
fontWeight: 400
})
const result = await io.writeDocument('fig', graph)
await Bun.write(path, result.data as Uint8Array)
return path
}
test('reports bundled fonts as available', async () => {
const { stdout, stderr, exitCode } = await runOpenPencilCLI(['fonts', GOLD, '--json'])
expect(stderr).toBe('')
expect(exitCode).toBe(0)
const data: DocumentFontStatus = JSON.parse(stdout)
expect(data.faithful).toBe(true)
expect(data.faces.every((face) => face.source === 'bundled')).toBe(true)
})
heavy('fonts CLI', () => {
test('reports unavailable fonts without network access', async () => {
const fixture = await createUnresolvedFontFixture()
const { stdout, stderr, exitCode } = await runOpenPencilCLI(['fonts', fixture, '--json'])
expect(stderr).toBe('')
expect(exitCode).toBe(0)
const data: DocumentFontStatus = JSON.parse(stdout)
expect(data.faithful).toBe(false)
expect(data.issues.length).toBeGreaterThan(0)
expect(data.issues.every((face) => face.status === 'unresolved')).toBe(true)
})
test('uses the standard human-readable formatter', async () => {
const { stdout, stderr, exitCode } = await runOpenPencilCLI(['fonts', GOLD])
expect(stderr).toBe('')
expect(exitCode).toBe(0)
expect(stdout).toContain('font faces')
expect(stdout).toContain('Faithful: yes')
expect(stdout).toContain('[Inter]')
})
})