100 lines
3.0 KiB
JavaScript
100 lines
3.0 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import vm from 'node:vm';
|
|
import {
|
|
normalizeMemoryV2AdapterScaffoldOptions,
|
|
renderMemoryV2AdapterScaffold,
|
|
} from './memory-v2-adapter-scaffold.mjs';
|
|
import { inspectMemoryV2Backend } from './memory-v2-backend-contract.mjs';
|
|
|
|
async function loadGeneratedBackend(source, factoryName) {
|
|
const transformed = `${source.replace(/export function /, 'function ')}\n${factoryName};`;
|
|
const script = new vm.Script(transformed);
|
|
const factory = script.runInNewContext({});
|
|
return factory();
|
|
}
|
|
|
|
test('normalizeMemoryV2AdapterScaffoldOptions normalizes names, flags, and capabilities', () => {
|
|
assert.deepEqual(
|
|
normalizeMemoryV2AdapterScaffoldOptions({
|
|
name: 'Qdrant Store',
|
|
category: 'semantic',
|
|
role: 'Scale Out Vector Store',
|
|
capabilities: ['resolve', 'resolve'],
|
|
}),
|
|
{
|
|
name: 'qdrant-store',
|
|
factoryName: 'createQdrantStoreMemoryBackend',
|
|
category: 'semantic',
|
|
role: 'scale-out-vector-store',
|
|
capabilities: ['resolve'],
|
|
flag: 'MEMORY_QDRANT_STORE_ENABLED',
|
|
},
|
|
);
|
|
});
|
|
|
|
test('normalizeMemoryV2AdapterScaffoldOptions rejects invalid category and capability', () => {
|
|
assert.throws(
|
|
() => normalizeMemoryV2AdapterScaffoldOptions({
|
|
name: 'bad',
|
|
category: 'unknown',
|
|
capabilities: ['resolve'],
|
|
}),
|
|
/Adapter category/,
|
|
);
|
|
assert.throws(
|
|
() => normalizeMemoryV2AdapterScaffoldOptions({
|
|
name: 'bad',
|
|
category: 'semantic',
|
|
capabilities: ['delete'],
|
|
}),
|
|
/Unsupported Memory V2 capability/,
|
|
);
|
|
});
|
|
|
|
test('renderMemoryV2AdapterScaffold generates disabled backend that passes contract gate', async () => {
|
|
const options = normalizeMemoryV2AdapterScaffoldOptions({
|
|
name: 'qdrant',
|
|
category: 'semantic',
|
|
role: 'scale-out-vector-store',
|
|
capabilities: ['resolve'],
|
|
flag: 'MEMORY_QDRANT_ENABLED',
|
|
});
|
|
const source = renderMemoryV2AdapterScaffold(options);
|
|
const backend = await loadGeneratedBackend(source, options.factoryName);
|
|
const report = inspectMemoryV2Backend(backend);
|
|
|
|
assert.match(source, /export function createQdrantMemoryBackend/);
|
|
assert.equal(backend.isAvailable(), false);
|
|
assert.equal(backend.getUnavailableReason(), 'not_configured');
|
|
assert.equal(report.ok, true);
|
|
assert.deepEqual(report.supports, {
|
|
resolve: true,
|
|
write: false,
|
|
compact: false,
|
|
});
|
|
});
|
|
|
|
test('renderMemoryV2AdapterScaffold can include write and compact operations', async () => {
|
|
const options = normalizeMemoryV2AdapterScaffoldOptions({
|
|
name: 'mem0',
|
|
category: 'extraction',
|
|
capabilities: ['write', 'compact'],
|
|
});
|
|
const backend = await loadGeneratedBackend(
|
|
renderMemoryV2AdapterScaffold(options),
|
|
options.factoryName,
|
|
);
|
|
|
|
assert.deepEqual(JSON.parse(JSON.stringify(await backend.write({}))), {
|
|
saved: 0,
|
|
analyzed: 0,
|
|
memories: 0,
|
|
});
|
|
assert.deepEqual(JSON.parse(JSON.stringify(await backend.compact({}))), {
|
|
analyzed: 0,
|
|
memories: 0,
|
|
});
|
|
assert.equal(inspectMemoryV2Backend(backend).ok, true);
|
|
});
|