Spaces:
Sleeping
Sleeping
File size: 1,875 Bytes
a5d1c1b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import { describe, it, expect, beforeEach } from 'vitest';
import { TreeCache } from '../src/services/tree-cache.js';
import { FileInfo } from '../src/types/contract.js';
describe('TreeCache Service', () => {
let cache: TreeCache;
const sampleFiles: FileInfo[] = [
{ path: 'README.md', type: 'file', sizeBytes: 100, mimeType: 'text/markdown' },
{ path: 'knowledge/arch.md', type: 'file', sizeBytes: 200, mimeType: 'text/markdown' },
];
const samplePathMap = new Map<string, string>([
['readme.md', 'README.md'],
['knowledge/arch.md', 'knowledge/arch.md'],
]);
beforeEach(() => {
cache = new TreeCache();
});
it('stores and retrieves cache entries within TTL', () => {
cache.set('acme', 'project', 'main', sampleFiles, samplePathMap, 1000);
const entry = cache.get('acme', 'project', 'main');
expect(entry).toBeDefined();
expect(entry?.files.length).toBe(2);
expect(entry?.pathMap.get('readme.md')).toBe('README.md');
});
it('is case-insensitive for owner, repo, and branch keys', () => {
cache.set('Acme', 'Project', 'Main', sampleFiles, samplePathMap, 1000);
const entry = cache.get('acme', 'project', 'main');
expect(entry).toBeDefined();
expect(entry?.files.length).toBe(2);
});
it('expires entries past TTL', async () => {
cache.set('acme', 'project', 'main', sampleFiles, samplePathMap, 20); // 20ms TTL
await new Promise((resolve) => setTimeout(resolve, 35));
const entry = cache.get('acme', 'project', 'main');
expect(entry).toBeUndefined();
});
it('invalidates entries explicitly', () => {
cache.set('acme', 'project', 'main', sampleFiles, samplePathMap, 1000);
expect(cache.get('acme', 'project', 'main')).toBeDefined();
cache.invalidate('acme', 'project', 'main');
expect(cache.get('acme', 'project', 'main')).toBeUndefined();
});
});
|