import { afterEach, describe, expect, test } from 'bun:test' import { clearDownloadedFontCache, downloadedFontCacheSummary } from '@/app/editor/fonts/cache' import { clearTauriMocks, mockTauriIPC } from '#tests/helpers/tauri/mocks' const encoder = new TextEncoder() afterEach(async () => { await clearTauriMocks() }) describe('Tauri downloaded font cache helpers', () => { test('summarizes manifest entries through mocked plugin-fs IPC', async () => { await mockTauriIPC((cmd, args) => { expect(cmd).toBe('plugin:fs|read_file') expect(args).toMatchObject({ path: 'cache/v1/font-cache/v1/manifest' }) return [ ...encoder.encode( JSON.stringify({ updatedAt: 300, value: { version: 1, entries: { one: { family: 'Noto Sans SC', style: 'Regular', file: 'one.ttf', byteLength: 10, sha256: 'a', updatedAt: 100 }, two: { family: 'Noto Naskh Arabic', style: 'Regular', file: 'two.ttf', byteLength: 25, sha256: 'b', updatedAt: 250 } } } }) ) ] }) await expect(downloadedFontCacheSummary()).resolves.toEqual({ count: 2, byteLength: 35, updatedAt: 250 }) }) test('returns an empty summary when manifest is missing', async () => { await mockTauriIPC((cmd) => { expect(cmd).toBe('plugin:fs|read_file') throw new Error('missing') }) await expect(downloadedFontCacheSummary()).resolves.toEqual({ count: 0, byteLength: 0, updatedAt: null }) }) test('clears the cache directory through mocked plugin-fs IPC', async () => { const calls: Array<{ cmd: string; args: unknown }> = [] await mockTauriIPC((cmd, args) => { calls.push({ cmd, args }) return null }) await clearDownloadedFontCache() const { BaseDirectory } = await import('@tauri-apps/plugin-fs') expect(calls).toEqual([ { cmd: 'plugin:fs|remove', args: { path: 'cache/v1/font-cache/v1', options: { baseDir: BaseDirectory.AppLocalData, recursive: true } } } ]) }) })