feat(store): load/save and target accessors with validation
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
export function createLocalStorage() {
|
||||
const data = new Map();
|
||||
return {
|
||||
getItem(k) { return data.has(k) ? data.get(k) : null; },
|
||||
setItem(k, v) { data.set(k, String(v)); },
|
||||
removeItem(k) { data.delete(k); },
|
||||
clear() { data.clear(); },
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { Store } from '../src/store.js';
|
||||
import { createLocalStorage } from './localstorage-shim.js';
|
||||
|
||||
function freshStore() {
|
||||
return new Store({ storage: createLocalStorage() });
|
||||
}
|
||||
|
||||
test('Store: starts empty', () => {
|
||||
const s = freshStore();
|
||||
assert.equal(s.getTarget('strength'), null);
|
||||
});
|
||||
|
||||
test('Store: setTarget validates via parseTarget', () => {
|
||||
const s = freshStore();
|
||||
assert.equal(s.setTarget('strength', '25M'), true);
|
||||
assert.equal(s.getTarget('strength'), 25_000_000);
|
||||
});
|
||||
|
||||
test('Store: setTarget rejects invalid and keeps previous', () => {
|
||||
const s = freshStore();
|
||||
s.setTarget('strength', 25_000_000);
|
||||
assert.equal(s.setTarget('strength', 'abc'), false);
|
||||
assert.equal(s.getTarget('strength'), 25_000_000);
|
||||
});
|
||||
|
||||
test('Store: targets are per-attribute', () => {
|
||||
const s = freshStore();
|
||||
s.setTarget('strength', 25_000_000);
|
||||
s.setTarget('speed', 50_000_000);
|
||||
assert.equal(s.getTarget('strength'), 25_000_000);
|
||||
assert.equal(s.getTarget('speed'), 50_000_000);
|
||||
});
|
||||
|
||||
test('Store: persists across instances via storage', () => {
|
||||
const storage = createLocalStorage();
|
||||
const a = new Store({ storage });
|
||||
a.setTarget('strength', 25_000_000);
|
||||
const b = new Store({ storage });
|
||||
assert.equal(b.getTarget('strength'), 25_000_000);
|
||||
});
|
||||
|
||||
test('Store: corrupted JSON is wiped with a warning', () => {
|
||||
const storage = createLocalStorage();
|
||||
storage.setItem('tat.targets', '{not json');
|
||||
const warnings = [];
|
||||
const s = new Store({ storage, onWarn: (m) => warnings.push(m) });
|
||||
assert.equal(s.getTarget('strength'), null);
|
||||
assert.equal(warnings.length, 1);
|
||||
});
|
||||
Reference in New Issue
Block a user