import { describe, it, expect, afterEach } from 'vitest' import { DatabaseSync } from 'node:sqlite' import { migrate } from '../../src/main/db/migrate' import { KnowledgeRepository } from '../../src/main/db/repositories/knowledge.repo' import { KnowledgeInjectionRepository } from '../../src/main/db/repositories/knowledge-injection.repo' import { KnowledgeInjectionService } from '../../src/main/services/knowledge-injection.service' import type { SqliteDb } from '../../src/main/db/types' describe('KnowledgeInjectionRepository', () => { let db: SqliteDb afterEach(() => db?.close()) it('UT-INJ-01: insertBatch creates rows listable by entry', () => { db = new DatabaseSync(':memory:') migrate(db) const knowledge = new KnowledgeRepository(db) const entry = knowledge.create({ type: 'fact', title: '测试', status: 'approved' }) const repo = new KnowledgeInjectionRepository(db) repo.insertBatch([ { knowledgeEntryId: entry.id, flowMode: 'wizard', flowId: 'flow-1', chapterId: 'ch-1' }, { knowledgeEntryId: entry.id, flowMode: 'interactive', flowId: 'flow-2' }, { knowledgeEntryId: entry.id, flowMode: 'auto', flowId: 'flow-3', chapterId: 'ch-2' } ]) const logs = repo.listForEntry(entry.id) expect(logs).toHaveLength(3) expect(logs.map((l) => l.flowMode).sort()).toEqual(['auto', 'interactive', 'wizard']) }) }) describe('KnowledgeInjectionService', () => { let db: SqliteDb afterEach(() => db?.close()) it('IT-INJ-01: record only approved knowledge entries', () => { db = new DatabaseSync(':memory:') migrate(db) const knowledge = new KnowledgeRepository(db) const approved = knowledge.create({ type: 'fact', title: '已审', status: 'approved' }) const pending = knowledge.create({ type: 'fact', title: '待审', status: 'pending' }) const service = new KnowledgeInjectionService(db) service.record({ knowledgeIds: [approved.id, pending.id], flowMode: 'interactive', flowId: 'flow-x', chapterId: 'ch-1' }) const logs = service.listForEntry(approved.id) expect(logs).toHaveLength(1) expect(logs[0].flowMode).toBe('interactive') expect(service.listForEntry(pending.id)).toHaveLength(0) }) })