Files
connectai/tests/integration_retrieval.test.ts
T

92 lines
3.9 KiB
TypeScript

import { RetrievalOrchestrator } from '../src/retrieval/index';
import * as fs from 'fs';
import * as utils from '../src/utils';
// Mocking dependencies
jest.mock('fs');
jest.mock('../src/utils');
describe('Retrieval Orchestrator Phase 5 Integration Tests', () => {
let orchestrator: RetrievalOrchestrator;
const mockBrainPath = '/mock/brain';
beforeEach(() => {
jest.clearAllMocks();
orchestrator = new RetrievalOrchestrator();
});
test('End-to-End Brain Search: should populate advanced scoring metadata in results', () => {
// 1. Mock Brain Files
const mockFiles = [
'/mock/brain/doc1.md',
'/mock/brain/doc2.md'
];
(utils.findBrainFiles as jest.Mock).mockReturnValue(mockFiles);
// 2. Mock File Content
const fileContents: Record<string, string> = {
'/mock/brain/doc1.md': 'Astra 성능 최적화 전략에 대한 문서입니다.',
'/mock/brain/doc2.md': '이 설계는 기존 아키텍처와 충돌하며 오류가 많고 논란이 있는 반대 의견입니다.'
};
(fs.readFileSync as jest.Mock).mockImplementation((path: string) => fileContents[path]);
(fs.statSync as jest.Mock).mockReturnValue({ mtimeMs: Date.now() });
// 3. Perform Retrieval
const brain = { localBrainPath: mockBrainPath };
const result = orchestrator.retrieve('최적화 충돌', {
brain: brain as any,
memoryManager: {
getLongTermMemory: () => ({ buildContext: () => null }),
getProjectMemory: () => ({ buildContext: () => null }),
getProceduralMemory: () => ({ buildContext: () => null }),
getEpisodicMemory: () => ({ buildContext: () => null })
} as any,
contextBudget: { totalBudget: 2000 }
});
// 4. Verify Intelligence Metadata
expect(result.selectedChunks.length).toBeGreaterThan(0);
// Find doc2 (the conflicting one)
const conflictChunk = result.selectedChunks.find(c => c.title.includes('doc2'));
expect(conflictChunk).toBeDefined();
if (conflictChunk) {
expect(conflictChunk.metadata.conflictDetected).toBe(true);
expect(conflictChunk.metadata.conflictSeverity).toBe('HIGH'); // '충돌', '오류', '논란', '반대' -> 4 indicators
}
// Find doc1 (the dense one)
const denseChunk = result.selectedChunks.find(c => c.title.includes('doc1'));
expect(denseChunk).toBeDefined();
if (denseChunk) {
expect(denseChunk.metadata.informationDensity).toBeGreaterThan(0);
expect(denseChunk.metadata.conflictDetected).toBe(false);
}
// 5. Verify Assembled Context String
const contextString = orchestrator.buildContextString(result);
expect(contextString).toContain('[⚠️ CONFLICT: HIGH]');
expect(contextString).toContain('(Density:');
});
test('Score Normalization: should normalize scores across brain sources', () => {
(utils.findBrainFiles as jest.Mock).mockReturnValue(['/mock/brain/test.md']);
(fs.readFileSync as jest.Mock).mockReturnValue('테스트 내용');
(fs.statSync as jest.Mock).mockReturnValue({ mtimeMs: Date.now() });
const result = orchestrator.retrieve('테스트', {
brain: { localBrainPath: mockBrainPath } as any,
memoryManager: {
getLongTermMemory: () => ({ buildContext: () => null }),
getProjectMemory: () => ({ buildContext: () => null }),
getProceduralMemory: () => ({ buildContext: () => null }),
getEpisodicMemory: () => ({ buildContext: () => null })
} as any
});
// Scores should be boosted by source priority (brain-memory boost is 0.9)
const chunk = result.selectedChunks[0];
expect(chunk.score).toBeCloseTo(0.9, 1);
});
});