Files
IdentityDB/tests/identity-db.test.ts

55 lines
1.7 KiB
TypeScript

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.');
});
});