60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { urlCache } from '../src/lib/cache';
|
|
import { UrlCheckResult, UrlVerdict } from '../src/types';
|
|
|
|
describe('UrlCache', () => {
|
|
const sampleResult: UrlCheckResult = {
|
|
url: 'https://example.com',
|
|
domain: 'example.com',
|
|
verdict: UrlVerdict.SAFE,
|
|
confidence: 0.95,
|
|
threats: [],
|
|
cached: false,
|
|
latencyMs: 50,
|
|
timestamp: Date.now(),
|
|
};
|
|
|
|
beforeEach(async () => {
|
|
urlCache.clear();
|
|
});
|
|
|
|
it('should return null for missing URL', async () => {
|
|
const result = await urlCache.get('https://missing.com');
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('should store and retrieve cached result', async () => {
|
|
await urlCache.set('https://example.com', sampleResult);
|
|
const cached = await urlCache.get('https://example.com');
|
|
expect(cached).not.toBeNull();
|
|
expect(cached!.cached).toBe(true);
|
|
expect(cached!.verdict).toBe(UrlVerdict.SAFE);
|
|
});
|
|
|
|
it('should normalize URLs by stripping hash and search', async () => {
|
|
await urlCache.set('https://example.com/page?foo=bar#section', sampleResult);
|
|
const cached = await urlCache.get('https://example.com/page');
|
|
expect(cached).not.toBeNull();
|
|
});
|
|
|
|
it('should persist and restore from storage', async () => {
|
|
await urlCache.set('https://test.com', sampleResult);
|
|
await urlCache.persistToStorage();
|
|
urlCache.clear();
|
|
await urlCache.loadFromStorage();
|
|
const cached = await urlCache.get('https://test.com');
|
|
expect(cached).not.toBeNull();
|
|
});
|
|
|
|
it('should evict oldest entry when at max capacity', async () => {
|
|
const stats = urlCache.getStats();
|
|
expect(stats.max).toBe(5000);
|
|
});
|
|
|
|
it('should handle malformed URLs gracefully', async () => {
|
|
await urlCache.set('not-a-url', sampleResult);
|
|
const cached = await urlCache.get('not-a-url');
|
|
expect(cached).not.toBeNull();
|
|
});
|
|
});
|