import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { IdentityDB } from '../src/core/identity-db'; describe('IdentityDB topic and fact writes', () => { let db: IdentityDB; beforeEach(async () => { db = await IdentityDB.connect({ client: 'sqlite', filename: ':memory:' }); await db.initialize(); }); afterEach(async () => { await db.close(); }); it('deduplicates topics by normalized name during upsert', async () => { const first = await db.upsertTopic({ name: 'TypeScript', category: 'entity', granularity: 'concrete', }); const second = await db.upsertTopic({ name: ' typescript ', category: 'entity', granularity: 'concrete', }); expect(second.id).toBe(first.id); expect(second.normalizedName).toBe('typescript'); const topics = await db.listTopics({ includeFacts: false }); expect(topics).toHaveLength(1); }); it('adds one fact that links multiple topics', async () => { const fact = await db.addFact({ statement: 'I have worked with TypeScript since 2025.', topics: [ { name: 'I', category: 'entity', granularity: 'concrete', role: 'subject' }, { name: 'TypeScript', category: 'entity', granularity: 'concrete', role: 'object' }, { name: '2025', category: 'temporal', granularity: 'concrete', role: 'time' }, ], }); expect(fact.statement).toBe('I have worked with TypeScript since 2025.'); expect(fact.topics.map((topic) => topic.name)).toEqual(['I', 'TypeScript', '2025']); const typeScriptFacts = await db.getTopicFacts('TypeScript'); expect(typeScriptFacts).toHaveLength(1); expect(typeScriptFacts[0]?.statement).toBe('I have worked with TypeScript since 2025.'); }); });