104 lines
5.5 KiB
JavaScript
104 lines
5.5 KiB
JavaScript
// 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);
|
|
});
|
|
});
|