Files
AtreidesAssetsFree/tests/ui/accountactiviteit.test.mjs
T

103 lines
5.5 KiB
JavaScript
Raw Permalink Normal View History

2026-10-29 11:57:29 +01:00
// Generated, do not edit. sha256:0c8f95dec7394e0dad71a6a790d7768a2d482ac976a2a68218282ae506402032
import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import { activityItems, heartbeat } from '../../client/ui/activity.js';
const DAG = 86400000;
const dag = s => Date.UTC(Number(s.slice(0, 4)), Number(s.slice(5, 7)) - 1, Number(s.slice(8, 10)));
describe('activityItems', () => {
it('geeft een aankoop omhoog, een verkoop omlaag en rente omhoog, met de tabel van de rij', () => {
const items = activityItems({
accountIds: [1],
trades: [
{ id: 10, type: 'buy', toAccountId: 1, assetId: 5, occurredAt: '2026-03-01T12:00:00Z' },
{ id: 11, type: 'sell', fromAccountId: 1, assetId: 5, occurredAt: '2026-03-02T12:00:00Z' },
],
interest: [{ id: 12, toAccountId: 1, assetId: 5, occurredAt: '2026-03-03T12:00:00Z' }],
});
assert.deepEqual(items.map(i => [i.kind, i.dir, i.table, i.id]),
[['buy', 1, 'trades', 10], ['sell', -1, 'trades', 11], ['interest', 1, 'interest', 12]]);
});
it('telt een verplaatsing aan beide kanten, en alleen voor de gevraagde accounts', () => {
const transfers = [{ id: 20, fromAccountId: 1, toAccountId: 2, assetId: 5, occurredAt: '2026-03-01T12:00:00Z' }];
assert.deepEqual(activityItems({ accountIds: [1], transfers }).map(i => [i.kind, i.dir]), [['transferOut', -1]]);
assert.deepEqual(activityItems({ accountIds: [2], transfers }).map(i => [i.kind, i.dir]), [['transferIn', 1]]);
assert.equal(activityItems({ accountIds: [1, 2], transfers }).length, 2);
assert.equal(activityItems({ accountIds: [3], transfers }).length, 0, 'een ander account ziet niets');
});
it('maakt van een balans, een afspraak en het account een streepje zonder piek', () => {
const items = activityItems({
accountIds: [1],
valuations: [{ id: 30, accountId: 1, assetId: 5, rateAt: '2026-03-01T12:00:00Z' }],
schedules: [{ accountId: 1, startsOn: '2026-01-01', endsOn: '2026-06-30' }],
accounts: [{ id: 1, createdAt: '2025-12-01T12:00:00Z', updatedAt: '2026-02-01T12:00:00Z', closedAt: null }],
});
assert.ok(items.every(i => i.dir === 0));
assert.deepEqual(items.map(i => i.kind),
['balance', 'agreementStart', 'agreementEnd', 'accountOpened', 'accountChanged']);
assert.deepEqual(items.find(i => i.kind === 'balance'), { x: dag('2026-03-01'), accountId: 1, kind: 'balance',
dir: 0, table: 'valuations', id: 30, assetId: 5 }, 'een balans is wel aan te klikken');
assert.equal(items.find(i => i.kind === 'agreementStart').table, null, 'een afspraak heeft geen rij');
});
it('maakt van een reservering en een komende rentebijschrijving een streepje, op het juiste account', () => {
const items = activityItems({
accountIds: [1],
reservations: [
{ id: 40, fromAccountId: 1, toAccountId: null, assetId: 5, occurredAt: '2026-12-01T12:00:00Z' },
{ id: 41, fromAccountId: null, toAccountId: 1, assetId: 5, occurredAt: '2026-12-15T12:00:00Z' },
{ id: 42, fromAccountId: 2, toAccountId: null, assetId: 5, occurredAt: '2026-12-20T12:00:00Z' },
],
interestDue: [{ accountId: 1, periodEnd: '2027-01-01' }, { accountId: 2, periodEnd: '2027-01-01' }],
});
assert.deepEqual(items.map(i => [i.kind, i.dir, i.table, i.id]),
[['reservation', 0, 'reservations', 40], ['reservation', 0, 'reservations', 41], ['interestDue', 0, null, null]]);
assert.equal(items.at(-1).x, dag('2027-01-01'));
});
});
describe('heartbeat', () => {
const item = (s, dir) => ({ x: dag(s), dir });
it('loopt per dag van de dag vóór het eerste item tot vandaag, op nul waar niets gebeurde', () => {
const { points } = heartbeat([item('2026-03-02', 1)], '2026-03-05T12:00:00Z');
assert.deepEqual(points.map(p => p[0]), [1, 2, 3, 4, 5].map(d => dag(`2026-03-0${d}`)));
assert.deepEqual(points.map(p => p[1]), [0, 1, 0, 0, 0]);
});
it('wijst omhoog bij meer erin, omlaag bij meer eruit, en omhoog bij evenveel', () => {
const { points, byDay } = heartbeat([
item('2026-03-02', 1), item('2026-03-02', 1), item('2026-03-02', 1), item('2026-03-02', 1),
item('2026-03-03', -1),
item('2026-03-04', 1), item('2026-03-04', -1),
item('2026-03-05', 0),
], '2026-03-05T12:00:00Z');
const op = s => points.find(p => p[0] === dag(s))[1];
assert.equal(op('2026-03-02'), 2, 'vier erin: de wortel, zodat één drukke dag de rest niet plat drukt');
assert.equal(op('2026-03-03'), -1);
assert.equal(op('2026-03-04'), 1);
assert.equal(op('2026-03-05'), 0, 'een streepje is geen piek');
assert.equal(byDay.get(dag('2026-03-02')).length, 4);
});
it('begint op het startjaar en laat weg wat daarvóór lag', () => {
const { points, byDay } = heartbeat([item('1994-06-01', 1), item('2026-03-02', 1)],
'2026-03-03T12:00:00Z', '2026-03-01T12:00:00Z');
assert.equal(points[0][0], dag('2026-03-01'), 'de lijn begint op de startdag, niet op de dag ervoor');
assert.equal(points.length, 3);
assert.equal(byDay.has(dag('1994-06-01')), false, 'de oude boeking is er niet');
assert.equal(heartbeat([item('1994-06-01', 1)], '2026-03-03T12:00:00Z', '2026-03-01T12:00:00Z'), null,
'niets ná de start: geen lijn');
});
it('geeft niets zonder items, en twee punten als alles vandaag gebeurde', () => {
assert.equal(heartbeat([], '2026-03-05T12:00:00Z'), null);
const { points } = heartbeat([item('2026-03-05', -1)], '2026-03-05T12:00:00Z');
assert.equal(points.length, 2);
assert.equal(points[1][0] - points[0][0], DAG);
});
});