import { describe, expect, it } from 'vitest'; import { defaultReview } from '../../src/domain/review'; import { LocalStorageReviewRepository } from '../../src/persistence/review-store'; import type { StorageAdapter } from '../../src/persistence/storage-adapter'; class MemoryStorage implements StorageAdapter { values = new Map(); get(key: string) { return this.values.get(key) ?? null; } set(key: string, value: string) { this.values.set(key, value); } remove(key: string) { this.values.delete(key); } } describe('LocalStorageReviewRepository', () => { it('stores and restores reviews through the local storage adapter', async () => { const repository = new LocalStorageReviewRepository(new MemoryStorage()); const reviews = { finding1: { ...defaultReview(), include: true, owner: 'Blue Team' } }; await repository.save('project1', reviews); await expect(repository.load('project1')).resolves.toEqual(reviews); }); it('migrates reviews from the legacy storage key', async () => { const storage = new MemoryStorage(); const reviews = { finding1: { ...defaultReview(), include: true } }; storage.set('exxTableReader:reviews:project1', JSON.stringify(reviews)); const repository = new LocalStorageReviewRepository(storage); await expect(repository.load('project1')).resolves.toEqual(reviews); expect(storage.get('ASSESSOR:reviews:project1')).toBe(JSON.stringify(reviews)); }); it('returns an empty review set for invalid local data', async () => { const storage = new MemoryStorage(); storage.set('ASSESSOR:reviews:project1', '{invalid'); const repository = new LocalStorageReviewRepository(storage); await expect(repository.load('project1')).resolves.toEqual({}); }); });