import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { mkdtempSync, rmSync, existsSync, readFileSync } from 'fs' import { join } from 'path' import { tmpdir } from 'os' import { BookRegistryService } from '../../src/main/services/book-registry' import { GlobalSettingsService } from '../../src/main/services/global-settings' import { ExportMatrixService } from '../../src/main/services/export-matrix.service' import { closeAllBookDbs } from '../../src/main/db/connection' describe('ExportMatrixService', () => { let userData: string let registry: BookRegistryService let settings: GlobalSettingsService let matrix: ExportMatrixService beforeEach(() => { userData = mkdtempSync(join(tmpdir(), 'bilin-export-matrix-')) registry = new BookRegistryService(userData) settings = new GlobalSettingsService(userData) matrix = new ExportMatrixService(registry, settings) }) afterEach(() => { closeAllBookDbs() rmSync(userData, { recursive: true, force: true }) }) it('exports chapter as txt', async () => { const book = registry.create({ name: '导出矩阵书', category: '玄幻', createSampleChapter: true }) registry.open(book.id) const chapter = registry.getChapterRepo(book.id).list()[0] registry.getChapterRepo(book.id).update(chapter.id, { content: '
矩阵导出测试正文。
' }) const dest = join(userData, 'chapter.txt') await matrix.exportToPath( { bookId: book.id, scope: 'chapter', scopeId: chapter.id, format: 'txt' }, dest ) const text = readFileSync(dest, 'utf8') expect(text).toContain('矩阵导出测试正文') expect(existsSync(dest)).toBe(true) }) it('IT-DOCX-01: exports volume docx with table of contents marker', async () => { const book = registry.create({ name: 'Docx书', category: '玄幻', createSampleChapter: true }) registry.open(book.id) const chapterRepo = registry.getChapterRepo(book.id) const ch = chapterRepo.list()[0] chapterRepo.update(ch.id, { title: '开篇', content: 'Docx正文。
' }) const dest = join(userData, 'book.docx') await matrix.exportToPath({ bookId: book.id, scope: 'book', format: 'docx' }, dest) expect(existsSync(dest)).toBe(true) expect(readFileSync(dest).length).toBeGreaterThan(1000) }) })