Files
TORCH/test/memory-pinning.test.mjs
T
google-labs-jules[bot]andPR0M3TH3AN 969a7d41e7 test(memory): add unit tests for unpinMemory
Added unit tests to `test/memory-pinning.test.mjs` to cover the `unpinMemory` function.
Tests verify:
- Successful unpinning and cache clearing.
- Handling of non-existent IDs (returns null) and cache clearing.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-17 18:32:35 +00:00

142 lines
4.8 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { getRelevantMemories, pinMemory, unpinMemory } from '../src/services/memory/index.js';
test('pinMemory pins the memory and clears the cache', async () => {
const records = [
{ id: 'm1', agent_id: 'agent-a', type: 'event', tags: ['ops'], pinned: false, last_seen: 10, merged_into: null },
];
let listMemoriesCallCount = 0;
const repository = {
async listMemories() {
listMemoriesCallCount++;
return records;
},
async getMemoryById(id) {
return records.find((record) => record.id === id) ?? null;
},
async setPinned(id, pinned) {
const index = records.findIndex((record) => record.id === id);
if (index < 0) return null;
records[index] = { ...records[index], pinned };
return records[index];
},
async updateMemoryUsage() { return null; }
};
// 1. Populate cache
await getRelevantMemories({ agent_id: 'agent-a', repository });
assert.equal(listMemoriesCallCount, 1, 'Repository should be queried initially');
// 2. Verify cache hit
await getRelevantMemories({ agent_id: 'agent-a', repository });
assert.equal(listMemoriesCallCount, 1, 'Repository should NOT be queried on cache hit');
// 3. Pin memory
const pinned = await pinMemory('m1', { repository });
assert.ok(pinned);
assert.equal(pinned.pinned, true);
assert.equal(records[0].pinned, true);
// 4. Verify cache miss (cleared)
await getRelevantMemories({ agent_id: 'agent-a', repository });
assert.equal(listMemoriesCallCount, 2, 'Repository should be queried again after cache clear');
});
test('pinMemory returns null for non-existent ID but still clears cache', async () => {
const records = [];
let listMemoriesCallCount = 0;
const repository = {
async listMemories() {
listMemoriesCallCount++;
return records;
},
async setPinned(id, pinned) {
return null;
},
async updateMemoryUsage() { return null; }
};
// 1. Populate cache (use different agent_id to avoid cache collision with previous test)
await getRelevantMemories({ agent_id: 'agent-b', repository });
assert.equal(listMemoriesCallCount, 1);
// 2. Pin non-existent memory
const result = await pinMemory('non-existent', { repository });
assert.equal(result, null);
// 3. Verify cache cleared
await getRelevantMemories({ agent_id: 'agent-b', repository });
assert.equal(listMemoriesCallCount, 2, 'Cache should be cleared even if ID not found');
});
test('unpinMemory unpins the memory and clears the cache', async () => {
const records = [
{ id: 'm1', agent_id: 'agent-c', type: 'event', tags: ['ops'], pinned: true, last_seen: 10, merged_into: null },
];
let listMemoriesCallCount = 0;
const repository = {
async listMemories() {
listMemoriesCallCount++;
return records;
},
async getMemoryById(id) {
return records.find((record) => record.id === id) ?? null;
},
async setPinned(id, pinned) {
const index = records.findIndex((record) => record.id === id);
if (index < 0) return null;
records[index] = { ...records[index], pinned };
return records[index];
},
async updateMemoryUsage() { return null; }
};
// 1. Populate cache
await getRelevantMemories({ agent_id: 'agent-c', repository });
assert.equal(listMemoriesCallCount, 1, 'Repository should be queried initially');
// 2. Verify cache hit
await getRelevantMemories({ agent_id: 'agent-c', repository });
assert.equal(listMemoriesCallCount, 1, 'Repository should NOT be queried on cache hit');
// 3. Unpin memory
const updated = await unpinMemory('m1', { repository });
assert.ok(updated);
assert.equal(updated.pinned, false);
assert.equal(records[0].pinned, false);
// 4. Verify cache miss (cleared)
await getRelevantMemories({ agent_id: 'agent-c', repository });
assert.equal(listMemoriesCallCount, 2, 'Repository should be queried again after cache clear');
});
test('unpinMemory returns null for non-existent ID but still clears cache', async () => {
const records = [];
let listMemoriesCallCount = 0;
const repository = {
async listMemories() {
listMemoriesCallCount++;
return records;
},
async setPinned(id, pinned) {
return null;
},
async updateMemoryUsage() { return null; }
};
// 1. Populate cache (use different agent_id to avoid cache collision with previous test)
await getRelevantMemories({ agent_id: 'agent-d', repository });
assert.equal(listMemoriesCallCount, 1);
// 2. Unpin non-existent memory
const result = await unpinMemory('non-existent', { repository });
assert.equal(result, null);
// 3. Verify cache cleared
await getRelevantMemories({ agent_id: 'agent-d', repository });
assert.equal(listMemoriesCallCount, 2, 'Cache should be cleared even if ID not found');
});