43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
import { describe, expect, test } from 'vitest';
|
|
import { BrowserKVStore, kvPersistStorage } from '../src/index.js';
|
|
import { MemoryStorage } from './setup.js';
|
|
|
|
const makeKv = () => new BrowserKVStore({ storage: new MemoryStorage() });
|
|
|
|
describe('kvPersistStorage (zustand persist adapter)', () => {
|
|
test('getItem returns null for an unwritten store', async () => {
|
|
const storage = kvPersistStorage(makeKv());
|
|
expect(await storage.getItem('settings-storage')).toBeNull();
|
|
});
|
|
|
|
test('round-trips the persisted { state, version } envelope', async () => {
|
|
const storage = kvPersistStorage<{ nickname: string }>(makeKv());
|
|
const value = { state: { nickname: 'Ada' }, version: 4 };
|
|
await storage.setItem('settings-storage', value);
|
|
expect(await storage.getItem('settings-storage')).toEqual(value);
|
|
});
|
|
|
|
test('removeItem clears the persisted store', async () => {
|
|
const storage = kvPersistStorage(makeKv());
|
|
await storage.setItem('k', { state: { x: 1 } });
|
|
await storage.removeItem('k');
|
|
expect(await storage.getItem('k')).toBeNull();
|
|
});
|
|
|
|
test('writes under the given KV scope', async () => {
|
|
const kv = makeKv();
|
|
const deviceStorage = kvPersistStorage(kv, 'device');
|
|
await deviceStorage.setItem('layout', { state: { width: 320 } });
|
|
// Same key under the account scope is untouched.
|
|
expect(await kv.get('layout', 'account')).toBeNull();
|
|
expect(await kv.get('layout', 'device')).toEqual({ state: { width: 320 } });
|
|
});
|
|
|
|
test('defaults to the account scope', async () => {
|
|
const kv = makeKv();
|
|
const storage = kvPersistStorage(kv);
|
|
await storage.setItem('profile', { state: { nickname: 'Ada' } });
|
|
expect(await kv.get('profile', 'account')).toEqual({ state: { nickname: 'Ada' } });
|
|
});
|
|
});
|