50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
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<string, string>();
|
|
|
|
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({});
|
|
});
|
|
});
|