96 lines
3.5 KiB
JavaScript
96 lines
3.5 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { createLegacyMemoryBackend } from './memory-v2.mjs';
|
|
import { createMemoryV2PluginBackends } from './memory-v2-plugin-backends.mjs';
|
|
import { createPgvectorMemoryBackend } from './memory-v2-pgvector.mjs';
|
|
import {
|
|
inspectMemoryV2Backend,
|
|
validateMemoryV2BackendSet,
|
|
} from './memory-v2-backend-contract.mjs';
|
|
|
|
function legacyService() {
|
|
return {
|
|
async listMemories() {
|
|
return [];
|
|
},
|
|
async saveAndAnalyze() {
|
|
return { saved: 0, analyzed: 0, memories: 0 };
|
|
},
|
|
async analyzeUser() {
|
|
return { analyzed: 0, memories: 0 };
|
|
},
|
|
};
|
|
}
|
|
|
|
test('inspectMemoryV2Backend accepts legacy backend contract', () => {
|
|
const report = inspectMemoryV2Backend(createLegacyMemoryBackend(legacyService()));
|
|
|
|
assert.equal(report.ok, true);
|
|
assert.equal(report.name, 'legacy-conversation-memory');
|
|
assert.equal(report.available, true);
|
|
assert.deepEqual(report.supports, {
|
|
resolve: true,
|
|
write: true,
|
|
compact: true,
|
|
});
|
|
});
|
|
|
|
test('inspectMemoryV2Backend rejects malformed backend contracts', () => {
|
|
const report = inspectMemoryV2Backend({
|
|
name: 'Bad Backend',
|
|
category: 'mystery',
|
|
flag: 'bad-flag',
|
|
isAvailable() {
|
|
return false;
|
|
},
|
|
});
|
|
|
|
assert.equal(report.ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'name_format').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'has_operation').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'unavailable_reason').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'category_known').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'flag_format').ok, false);
|
|
});
|
|
|
|
test('validateMemoryV2BackendSet verifies default backend registry', () => {
|
|
const report = validateMemoryV2BackendSet([
|
|
createLegacyMemoryBackend(legacyService()),
|
|
...createMemoryV2PluginBackends(),
|
|
]);
|
|
|
|
assert.equal(report.ok, true);
|
|
assert.equal(report.summary.backendCount, 9);
|
|
assert.deepEqual(report.summary.availableBackends, ['legacy-conversation-memory']);
|
|
assert.equal(report.summary.operationSupport.resolve.includes('qdrant'), true);
|
|
assert.equal(report.summary.operationSupport.write.includes('mem0'), true);
|
|
assert.equal(report.summary.operationSupport.compact.includes('letta'), true);
|
|
});
|
|
|
|
test('validateMemoryV2BackendSet rejects duplicate backend names and missing legacy', () => {
|
|
const report = validateMemoryV2BackendSet([
|
|
{ name: 'qdrant', unavailableReason: 'not_configured', isAvailable: () => false, resolve() {} },
|
|
{ name: 'qdrant', unavailableReason: 'not_configured', isAvailable: () => false, resolve() {} },
|
|
]);
|
|
|
|
assert.equal(report.ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'backend_names_unique').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'legacy_backend_present').ok, false);
|
|
});
|
|
|
|
test('validateMemoryV2BackendSet accepts real disabled pgvector adapter replacing placeholder', () => {
|
|
const report = validateMemoryV2BackendSet([
|
|
createLegacyMemoryBackend(legacyService()),
|
|
createPgvectorMemoryBackend({ enabled: false }),
|
|
...createMemoryV2PluginBackends({ exclude: ['pgvector'] }),
|
|
]);
|
|
|
|
assert.equal(report.ok, true);
|
|
assert.equal(report.backends.find((backend) => backend.name === 'pgvector').available, false);
|
|
assert.equal(
|
|
report.backends.find((backend) => backend.name === 'pgvector')
|
|
.checks.find((check) => check.name === 'unavailable_reason').ok,
|
|
true,
|
|
);
|
|
});
|