185 lines
5.6 KiB
TypeScript
185 lines
5.6 KiB
TypeScript
|
|
/**
|
||
|
|
* Unified Import Integration Tests
|
||
|
|
*
|
||
|
|
* Tests the unified import system (brain.import()):
|
||
|
|
* 1. Auto-detect format from Excel buffer
|
||
|
|
* 2. Extract entities/relationships
|
||
|
|
* 3. Create knowledge graph
|
||
|
|
* 4. Create VFS structure
|
||
|
|
*
|
||
|
|
* Uses real data, no mocks
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { describe, it, expect, beforeEach } from 'vitest'
|
||
|
|
import { Brainy } from '../../src/brainy.js'
|
||
|
|
import * as XLSX from 'xlsx'
|
||
|
|
|
||
|
|
describe('Unified Import System', () => {
|
||
|
|
let brain: Brainy
|
||
|
|
|
||
|
|
beforeEach(async () => {
|
||
|
|
brain = new Brainy({
|
||
|
|
storage: { type: 'memory' as const }
|
||
|
|
})
|
||
|
|
await brain.init()
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should extract entities and relationships from Excel data', async () => {
|
||
|
|
// Create test Excel file
|
||
|
|
const testData = [
|
||
|
|
{
|
||
|
|
'Term': 'Westland',
|
||
|
|
'Definition': 'Ancient kingdom in the west, ruled by the royal dynasty',
|
||
|
|
'Type': 'Place',
|
||
|
|
'Related Terms': 'Capital City, Northern Mountains'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'Term': 'Capital City',
|
||
|
|
'Definition': 'Main city of Westland, known for its grand library',
|
||
|
|
'Type': 'Place',
|
||
|
|
'Related Terms': 'Westland'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'Term': 'Royal Dynasty',
|
||
|
|
'Definition': 'Noble family that has ruled Westland for centuries',
|
||
|
|
'Type': 'Organization',
|
||
|
|
'Related Terms': 'Westland'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'Term': 'Grand Library',
|
||
|
|
'Definition': 'Massive repository of knowledge in Capital City',
|
||
|
|
'Type': 'Place',
|
||
|
|
'Related Terms': 'Capital City'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'Term': 'Northern Mountains',
|
||
|
|
'Definition': 'Mountain range north of Westland',
|
||
|
|
'Type': 'Place',
|
||
|
|
'Related Terms': 'Westland'
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
// Create Excel workbook
|
||
|
|
const worksheet = XLSX.utils.json_to_sheet(testData)
|
||
|
|
const workbook = XLSX.utils.book_new()
|
||
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, 'Terms')
|
||
|
|
const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })
|
||
|
|
|
||
|
|
// Import with unified API
|
||
|
|
const result = await brain.import(buffer, {
|
||
|
|
format: 'excel',
|
||
|
|
vfsPath: '/test-imports/data',
|
||
|
|
groupBy: 'type',
|
||
|
|
enableNeuralExtraction: true,
|
||
|
|
enableRelationshipInference: true,
|
||
|
|
enableConceptExtraction: true
|
||
|
|
})
|
||
|
|
|
||
|
|
// Verify format detection
|
||
|
|
expect(result.format).toBe('excel')
|
||
|
|
expect(result.formatConfidence).toBeGreaterThan(0.9)
|
||
|
|
|
||
|
|
// Should extract entities
|
||
|
|
expect(result.stats.entitiesExtracted).toBeGreaterThanOrEqual(5)
|
||
|
|
expect(result.entities.length).toBeGreaterThanOrEqual(5)
|
||
|
|
|
||
|
|
// Should create VFS structure
|
||
|
|
expect(result.vfs.rootPath).toBe('/test-imports/data')
|
||
|
|
expect(result.vfs.directories.length).toBeGreaterThan(0)
|
||
|
|
|
||
|
|
// Verify we can query the created entities
|
||
|
|
const entities = await brain.find({
|
||
|
|
query: 'Westland',
|
||
|
|
limit: 5
|
||
|
|
})
|
||
|
|
expect(entities.length).toBeGreaterThan(0)
|
||
|
|
}, 60000) // 60s timeout for neural processing
|
||
|
|
|
||
|
|
it('should handle progress callbacks', async () => {
|
||
|
|
const testData = [
|
||
|
|
{ 'Term': 'Test1', 'Definition': 'Test definition 1', 'Type': 'Concept' },
|
||
|
|
{ 'Term': 'Test2', 'Definition': 'Test definition 2', 'Type': 'Concept' }
|
||
|
|
]
|
||
|
|
|
||
|
|
const worksheet = XLSX.utils.json_to_sheet(testData)
|
||
|
|
const workbook = XLSX.utils.book_new()
|
||
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, 'Terms')
|
||
|
|
const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })
|
||
|
|
|
||
|
|
const progressStages: string[] = []
|
||
|
|
|
||
|
|
await brain.import(buffer, {
|
||
|
|
format: 'excel',
|
||
|
|
vfsPath: '/test-progress',
|
||
|
|
onProgress: (progress) => {
|
||
|
|
progressStages.push(progress.stage)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// Should receive progress updates for different stages
|
||
|
|
expect(progressStages.length).toBeGreaterThan(0)
|
||
|
|
}, 30000)
|
||
|
|
|
||
|
|
it('should group entities by type in VFS', async () => {
|
||
|
|
const testData = [
|
||
|
|
{ 'Term': 'Alice', 'Definition': 'A person', 'Type': 'Person' },
|
||
|
|
{ 'Term': 'New York', 'Definition': 'A city', 'Type': 'Place' },
|
||
|
|
{ 'Term': 'Gravity', 'Definition': 'A concept', 'Type': 'Concept' }
|
||
|
|
]
|
||
|
|
|
||
|
|
const worksheet = XLSX.utils.json_to_sheet(testData)
|
||
|
|
const workbook = XLSX.utils.book_new()
|
||
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, 'Terms')
|
||
|
|
const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })
|
||
|
|
|
||
|
|
const result = await brain.import(buffer, {
|
||
|
|
format: 'excel',
|
||
|
|
vfsPath: '/test-types',
|
||
|
|
groupBy: 'type'
|
||
|
|
})
|
||
|
|
|
||
|
|
// Verify VFS structure created
|
||
|
|
expect(result.vfs.rootPath).toBe('/test-types')
|
||
|
|
expect(result.vfs.directories.length).toBeGreaterThan(0)
|
||
|
|
|
||
|
|
// Verify entities were extracted
|
||
|
|
expect(result.entities.length).toBeGreaterThanOrEqual(3)
|
||
|
|
}, 30000)
|
||
|
|
|
||
|
|
it('should extract relationships from natural language definitions', async () => {
|
||
|
|
const testData = [
|
||
|
|
{
|
||
|
|
'Term': 'Paris',
|
||
|
|
'Definition': 'Capital city of France, located on the Seine river',
|
||
|
|
'Type': 'Place'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'Term': 'France',
|
||
|
|
'Definition': 'A country in Western Europe',
|
||
|
|
'Type': 'Place'
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
const worksheet = XLSX.utils.json_to_sheet(testData)
|
||
|
|
const workbook = XLSX.utils.book_new()
|
||
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, 'Terms')
|
||
|
|
const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })
|
||
|
|
|
||
|
|
const result = await brain.import(buffer, {
|
||
|
|
format: 'excel',
|
||
|
|
vfsPath: '/test-relationships',
|
||
|
|
enableRelationshipInference: true
|
||
|
|
})
|
||
|
|
|
||
|
|
// Verify entities extracted
|
||
|
|
expect(result.entities.length).toBeGreaterThanOrEqual(2)
|
||
|
|
|
||
|
|
// Find the Paris entity
|
||
|
|
const parisResults = await brain.find({
|
||
|
|
query: 'Paris',
|
||
|
|
limit: 5
|
||
|
|
})
|
||
|
|
expect(parisResults.length).toBeGreaterThan(0)
|
||
|
|
}, 30000)
|
||
|
|
})
|