66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import {describe, expect, it} from 'vitest';
|
|
|
|
import {isRecord, type JsonStorage,readStoredJson, removeStoredJson, writeStoredJson} from './storage';
|
|
|
|
function createMemoryStorage(): JsonStorage {
|
|
const values = new Map<string, string>();
|
|
|
|
return {
|
|
getItem(key) {
|
|
return values.has(key) ? values.get(key)! : null;
|
|
},
|
|
setItem(key, value) {
|
|
values.set(key, value);
|
|
},
|
|
removeItem(key) {
|
|
values.delete(key);
|
|
},
|
|
};
|
|
}
|
|
|
|
describe('storage helpers', () => {
|
|
it('reads parsed json values from storage', () => {
|
|
const storage = createMemoryStorage();
|
|
|
|
writeStoredJson({
|
|
key: 'example',
|
|
value: {value: 42},
|
|
storage,
|
|
});
|
|
|
|
const result = readStoredJson({
|
|
key: 'example',
|
|
storage,
|
|
parse: value => (isRecord(value) && typeof value.value === 'number' ? value.value : null),
|
|
});
|
|
|
|
expect(result).toBe(42);
|
|
});
|
|
|
|
it('returns null when persisted json cannot be parsed', () => {
|
|
const storage = createMemoryStorage();
|
|
storage.setItem('broken', '{not-valid-json');
|
|
|
|
const result = readStoredJson({
|
|
key: 'broken',
|
|
storage,
|
|
parse: () => 'unreachable',
|
|
});
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('removes persisted values', () => {
|
|
const storage = createMemoryStorage();
|
|
|
|
writeStoredJson({
|
|
key: 'example',
|
|
value: {value: 'keep'},
|
|
storage,
|
|
});
|
|
removeStoredJson('example', storage);
|
|
|
|
expect(storage.getItem('example')).toBeNull();
|
|
});
|
|
});
|