import { describe, it, expect, afterEach } from 'vitest' import { DatabaseSync } from 'node:sqlite' import { migrate } from '../../src/main/db/migrate' import { VolumeRepository } from '../../src/main/db/repositories/volume.repo' import { ChapterRepository } from '../../src/main/db/repositories/chapter.repo' import { BookmarkRepository } from '../../src/main/db/repositories/bookmark.repo' import { KnowledgeService } from '../../src/main/services/knowledge.service' import type { SqliteDb } from '../../src/main/db/types' describe('KnowledgeService', () => { let db: SqliteDb afterEach(() => db?.close()) it('UT-KNOW-02: forgotten when sort_order gap >= 20', () => { db = new DatabaseSync(':memory:') migrate(db) const volId = new VolumeRepository(db).create('卷一', 0).id const chapterRepo = new ChapterRepository(db) const firstId = chapterRepo.create(volId, '第1章', 0, '

伏笔

').id for (let i = 1; i < 25; i++) { chapterRepo.create(volId, `第${i + 1}章`, i, '

x

') } const service = new KnowledgeService(db) const entry = service.create({ type: 'foreshadow', title: '测灵石', status: 'approved', foreshadowStatus: 'buried', sourceChapterId: firstId }) expect(service.isForgotten(entry)).toBe(true) const stats = service.getForeshadowStats() expect(stats.forgotten).toBe(1) }) it('UT-KNOW-03: createFromBookmark creates pending entry', () => { db = new DatabaseSync(':memory:') migrate(db) const volId = new VolumeRepository(db).create('卷一', 0).id const chId = new ChapterRepository(db).create(volId, '章', 0).id const bm = new BookmarkRepository(db).create(chId, 0, '测灵石发热', 'foreshadow') const service = new KnowledgeService(db) const entry = service.createFromBookmark(bm.id) expect(entry.status).toBe('pending') expect(entry.linkedBookmarkId).toBe(bm.id) }) it('IT-KNOW-04: batchApprove clears pending', () => { db = new DatabaseSync(':memory:') migrate(db) const service = new KnowledgeService(db) const ids = [ service.create({ type: 'fact', title: 'A' }).id, service.create({ type: 'fact', title: 'B' }).id, service.create({ type: 'fact', title: 'C' }).id ] expect(service.countPending()).toBe(3) expect(service.batchApprove(ids)).toBe(3) expect(service.countPending()).toBe(0) }) })