071faa482c
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口 完成项目 TypeScript/Prettier 与 Rust 全量格式化 修复 Pingora expected executable 门禁的空白敏感误报 同步开发运维文档与 AGC skill pack 格式化忽略规则
73 lines
1.5 KiB
TypeScript
73 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();
|
|
});
|
|
});
|