feat(store): recordTrain with pruning and getSummary

This commit is contained in:
dev
2026-06-01 16:22:18 -05:00
parent e39758c1af
commit 07215e5617
2 changed files with 45 additions and 1 deletions
+29
View File
@@ -1,8 +1,12 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { Store } from '../src/store.js';
import { MS_PER_DAY } from '../src/pure.js';
import { createLocalStorage } from './localstorage-shim.js';
const DAY = MS_PER_DAY;
const NOW = 1_700_000_000_000;
function freshStore() {
return new Store({ storage: createLocalStorage() });
}
@@ -70,3 +74,28 @@ test('Store: latches off further saves after a storage write failure', () => {
assert.equal(s.getTarget('strength'), 25_000_000);
assert.equal(s.getTarget('speed'), 50_000_000);
});
test('Store: recordTrain appends to per-attribute history', () => {
const s = freshStore();
s.recordTrain('strength', 247, NOW);
s.recordTrain('strength', 250, NOW - 1000);
assert.equal(s.history.strength.length, 2);
assert.equal(s.history.strength[0].delta, 247);
});
test('Store: recordTrain prunes entries older than 30 days', () => {
const s = freshStore();
s.recordTrain('strength', 100, NOW - 31 * DAY);
s.recordTrain('strength', 200, NOW);
assert.equal(s.history.strength.length, 1);
assert.equal(s.history.strength[0].delta, 200);
});
test('Store: getSummary returns computed summary for attribute', () => {
const s = freshStore();
s.recordTrain('strength', 247, NOW - 1000);
s.recordTrain('strength', 247, NOW - 2000);
const sum = s.getSummary('strength', NOW);
assert.equal(sum.trainsToday, 2);
assert.equal(sum.perDay, Math.floor((2 / 7) * 247));
});