113 lines
3.2 KiB
JavaScript
113 lines
3.2 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { evaluateMemoryV2Health } from './memory-v2-health.mjs';
|
|
|
|
function healthyStatus(overrides = {}) {
|
|
return {
|
|
enabled: true,
|
|
backend: 'legacy',
|
|
selectedBackend: 'legacy-conversation-memory',
|
|
profileEnabled: true,
|
|
eventLogEnabled: true,
|
|
vectorEnabled: false,
|
|
failOpen: true,
|
|
backends: [
|
|
{
|
|
name: 'legacy-conversation-memory',
|
|
available: true,
|
|
supports: {
|
|
resolve: true,
|
|
write: true,
|
|
compact: true,
|
|
},
|
|
},
|
|
{
|
|
name: 'pgvector',
|
|
available: false,
|
|
supports: {
|
|
resolve: true,
|
|
write: false,
|
|
compact: false,
|
|
},
|
|
reason: 'not_configured',
|
|
},
|
|
],
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
test('evaluateMemoryV2Health passes for legacy-safe status', () => {
|
|
const report = evaluateMemoryV2Health({
|
|
status: healthyStatus(),
|
|
writeResult: { source: 'legacy-conversation-memory' },
|
|
compactResult: { source: 'legacy-conversation-memory' },
|
|
requireEnabled: true,
|
|
expectedBackend: 'legacy',
|
|
});
|
|
|
|
assert.equal(report.ok, true);
|
|
assert.equal(report.summary.selectedBackend, 'legacy-conversation-memory');
|
|
assert.equal(report.checks.every((check) => check.ok), true);
|
|
});
|
|
|
|
test('evaluateMemoryV2Health fails when status contract and fail-open are broken', () => {
|
|
const report = evaluateMemoryV2Health({
|
|
status: {
|
|
enabled: true,
|
|
backend: 'legacy',
|
|
selectedBackend: null,
|
|
failOpen: false,
|
|
backends: [],
|
|
},
|
|
requireEnabled: true,
|
|
});
|
|
|
|
assert.equal(report.ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'status_contract').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'fail_open').ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'legacy_available').ok, false);
|
|
});
|
|
|
|
test('evaluateMemoryV2Health allows pgvector resolve canary while requiring legacy write and compact', () => {
|
|
const report = evaluateMemoryV2Health({
|
|
status: healthyStatus({
|
|
backend: 'pgvector',
|
|
selectedBackend: 'pgvector',
|
|
vectorEnabled: true,
|
|
backends: [
|
|
healthyStatus().backends[0],
|
|
{
|
|
name: 'pgvector',
|
|
available: true,
|
|
supports: {
|
|
resolve: true,
|
|
write: false,
|
|
compact: false,
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
writeResult: { source: 'legacy-conversation-memory' },
|
|
compactResult: { source: 'legacy-conversation-memory' },
|
|
expectedBackend: 'pgvector',
|
|
});
|
|
|
|
assert.equal(report.ok, true);
|
|
assert.equal(report.checks.find((check) => check.name === 'pgvector_canary_available').ok, true);
|
|
});
|
|
|
|
test('evaluateMemoryV2Health fails when semantic canary captures writes', () => {
|
|
const report = evaluateMemoryV2Health({
|
|
status: healthyStatus({
|
|
backend: 'pgvector',
|
|
selectedBackend: 'pgvector',
|
|
vectorEnabled: true,
|
|
}),
|
|
writeResult: { source: 'pgvector' },
|
|
compactResult: { source: 'legacy-conversation-memory' },
|
|
});
|
|
|
|
assert.equal(report.ok, false);
|
|
assert.equal(report.checks.find((check) => check.name === 'write_uses_legacy').ok, false);
|
|
});
|