Files
memind/memory-v2-mem0.test.mjs
2026-07-03 09:46:03 +08:00

99 lines
3.2 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { inspectMemoryV2Backend } from './memory-v2-backend-contract.mjs';
import { createMem0HttpClient, createMem0MemoryBackend } from './memory-v2-mem0.mjs';
test('mem0 backend is disabled by default and passes contract gate', async () => {
const backend = createMem0MemoryBackend();
const report = inspectMemoryV2Backend(backend);
assert.equal(backend.name, 'mem0');
assert.equal(backend.category, 'extraction');
assert.equal(backend.role, 'automatic-memory-generation');
assert.equal(backend.flag, 'MEMORY_MEM0_ENABLED');
assert.equal(backend.isAvailable(), false);
assert.equal(backend.getUnavailableReason(), 'not_configured');
assert.equal(report.ok, true);
assert.deepEqual(await backend.write({}), { saved: 0, analyzed: 0, memories: 0 });
assert.deepEqual(await backend.compact({}), { analyzed: 0, memories: 0 });
});
test('mem0 backend reports api key and client configuration reasons', () => {
assert.equal(
createMem0MemoryBackend({ enabled: true }).getUnavailableReason(),
'api_key_not_configured',
);
assert.equal(
createMem0MemoryBackend({
enabled: true,
apiKey: 'secret',
projectId: 'memind_project',
}).getUnavailableReason(),
'client_not_configured',
);
});
test('mem0 backend validates project id', () => {
assert.throws(
() => createMem0MemoryBackend({ projectId: 'bad project id' }),
/Invalid MEMORY_MEM0_PROJECT_ID/,
);
});
test('mem0 backend can become available only with explicit client skeleton', () => {
const backend = createMem0MemoryBackend({
enabled: true,
apiKey: 'secret',
projectId: 'memind_project',
client: {
async write() {
return {};
},
},
});
assert.equal(backend.isAvailable(), true);
assert.equal(backend.getUnavailableReason(), null);
});
test('mem0 HTTP client writes and compacts with bearer auth', async () => {
const calls = [];
const client = createMem0HttpClient({
apiKey: 'secret',
projectId: 'memind_project',
baseUrl: 'https://mem0.local',
modelProviderKeyId: 'key_mem0',
model: 'gpt-4.1-mini',
modelApiType: 'response',
async fetchImpl(url, options) {
calls.push({ url, headers: options.headers, body: JSON.parse(options.body) });
return {
ok: true,
async json() {
return { saved: 1, analyzed: 1, memories: 1 };
},
};
},
});
assert.deepEqual(await client.write({
userId: 'u1',
sessionId: 's1',
messages: [{ text: 'hello' }],
}), { saved: 1, analyzed: 1, memories: 1 });
assert.deepEqual(await client.compact({ userId: 'u1' }), {
analyzed: 1,
memories: 1,
});
assert.deepEqual(calls.map((call) => call.url), [
'https://mem0.local/v1/memories',
'https://mem0.local/v1/memories/compact',
]);
assert.equal(calls[0].headers.authorization, 'Bearer secret');
assert.equal(calls[0].body.project_id, 'memind_project');
assert.equal(calls[0].body.model_provider_key_id, 'key_mem0');
assert.equal(calls[0].body.model, 'gpt-4.1-mini');
assert.equal(calls[0].body.model_api_type, 'response');
assert.equal(calls[1].body.model_provider_key_id, 'key_mem0');
});