Versie 0.2.0

This commit is contained in:
Atreides Assets committed 2026-10-29 11:57:29 +01:00
commit e77d8fd373
495 files changed
+81026

No files matched your search

+117
View File
@@ -0,0 +1,117 @@
// Generated, do not edit. sha256:1af8cbc83fbd3f045e8613c13a26b6a23e68ea741a3545d1ba4e3de41d66fee7
import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
const { sameSelection, selectionFromStored } = await import('../../client/wealth/selection.js');
describe('sameSelection: is dit hetzelfde?', () => {
it('herkent dezelfde soort en dezelfde assets', () => {
assert.equal(sameSelection({ kind: 'crypto' }, { kind: 'crypto' }), true);
assert.equal(sameSelection({ assetIds: [1, 2] }, { assetIds: [1, 2] }), true);
});
it('ziet een andere volgorde als iets ánders', () => {
assert.equal(sameSelection({ assetIds: [1, 2] }, { assetIds: [2, 1] }), false);
});
it('SCHEIDT EEN SOORT VAN EEN LIJST ASSETS, ook als die soort precies die assets bevat', () => {
assert.equal(sameSelection({ kind: 'crypto' }, { assetIds: [1] }), false);
assert.equal(sameSelection({ assetIds: [1] }, { kind: 'crypto' }), false);
});
it('behandelt null als een echte stand', () => {
assert.equal(sameSelection(null, null), true);
assert.equal(sameSelection(null, { kind: 'crypto' }), false);
assert.equal(sameSelection({ kind: 'crypto' }, null), false);
});
});
describe('selectionFromStored: wat er uit de voorkeuren komt', () => {
it('leest de twee geldige vormen', () => {
assert.deepEqual(selectionFromStored({ kind: 'metal' }), { kind: 'metal' });
assert.deepEqual(selectionFromStored({ assetIds: [3, 4] }), { assetIds: [3, 4] });
});
it('MAAKT ER GETALLEN VAN, ook als er tekst opgeslagen stond', () => {
assert.deepEqual(selectionFromStored({ assetIds: ['3', '4'] }), { assetIds: [3, 4] });
});
it('geeft null bij een lege of onbruikbare lijst', () => {
assert.equal(selectionFromStored({ assetIds: [] }), null);
assert.equal(selectionFromStored({ assetIds: ['x', null] }), null, 'niets dat een getal wordt');
});
it('houdt over wat wél een getal is', () => {
assert.deepEqual(selectionFromStored({ assetIds: [3, 'x'] }), { assetIds: [3] });
});
it('GEEFT NULL BIJ ALLES WAT GEEN SELECTIE IS, in plaats van te struikelen', () => {
for (const rommel of [null, undefined, 0, '', 'crypto', 42, [], { }, { assetIds: 'crypto' }])
assert.equal(selectionFromStored(rommel), null, `bij ${JSON.stringify(rommel)}`);
});
it('laat de soort vóór de assets gaan als er allebei iets staat', () => {
assert.deepEqual(selectionFromStored({ kind: 'crypto', assetIds: [1] }), { kind: 'crypto' });
});
});
const { hiddenFromStored, hiddenAfterFilter, splitHidden, hiddenKindsFromStored, accountKindItems, accountKindOf, NO_ACCOUNT_KIND } =
await import('../../client/wealth/selection.js');
describe('verborgen kaarten', () => {
it('leest alleen positieve gehele ids terug', () => {
assert.deepEqual([...hiddenFromStored([3, '5', null, 0, -1, 'x'])], [3, 5]);
assert.equal(hiddenFromStored({ ids: [1] }).size, 0, 'geen lijst: niets verborgen');
});
it('laat bij accounts de 0 door, de kaart zonder account', () => {
assert.deepEqual([...hiddenFromStored([0, 4, -1], { allowZero: true })], [0, 4]);
});
it('bewaart na de filterbalk wat uit staat, gesorteerd', () => {
assert.deepEqual(hiddenAfterFilter(new Set(), [1, 2, 3], new Set([1, 3])), [2]);
assert.deepEqual(hiddenAfterFilter(new Set([2]), [1, 2, 3], new Set([1, 2, 3])), [], 'weer aan is weer zichtbaar');
});
it('houdt een verborgen id zonder chip vast, zodat een andere periode hem niet terugzet', () => {
assert.deepEqual(hiddenAfterFilter(new Set([9, 2]), [1, 2], new Set([1])), [2, 9]);
});
it('verdeelt de kaarten in twee stapels die samen alles zijn, in de oorspronkelijke volgorde', () => {
const k = id => ({ asset: { id } });
const { shown, hidden } = splitHidden([k(1), k(2), k(3)], new Set([2]));
assert.deepEqual(shown.map(x => x.asset.id), [1, 3]);
assert.deepEqual(hidden.map(x => x.asset.id), [2]);
});
it('filtert per account op soort, met de kaart zonder account als eigen soort', () => {
const kaarten = [{ account: { kind: 'exchange' } }, { account: { kind: 'wallet' } }, { account: { kind: 'exchange' } }, { account: null }];
assert.deepEqual(accountKindItems(kaarten), ['exchange', 'wallet', NO_ACCOUNT_KIND], 'elke soort één keer, in de volgorde van de kaarten');
const verborgen = hiddenKindsFromStored(['wallet', 'verdwenen', 7, NO_ACCOUNT_KIND], ['exchange', 'wallet']);
assert.deepEqual([...verborgen].sort(), [NO_ACCOUNT_KIND, 'wallet']);
const { shown } = splitHidden(kaarten, verborgen, accountKindOf);
assert.equal(shown.length, 2, 'alleen de twee exchanges blijven staan');
assert.deepEqual(hiddenAfterFilter(new Set(['wallet']), ['exchange', 'wallet'], new Set(['wallet'])), ['exchange'],
'een soort weer aan is weer zichtbaar, een andere uit');
});
it('splitst accountkaarten op hun eigen sleutel', () => {
const c = id => ({ accountId: id });
const { shown } = splitHidden([c(10), c(null)], new Set([0]), x => x.accountId ?? 0);
assert.deepEqual(shown.map(x => x.accountId), [10]);
});
});
describe('selectie van een accountkaart', () => {
it('leest het account terug, ook de kaart zonder account en zonder assets', () => {
assert.deepEqual(selectionFromStored({ account: 7, assetIds: [1] }), { account: 7, assetIds: [1] });
assert.deepEqual(selectionFromStored({ account: 0, assetIds: [] }), { account: 0, assetIds: [] });
assert.equal(selectionFromStored({ account: -1, assetIds: [] }), null);
});
it('ziet twee accounts met dezelfde assets als twee selecties', () => {
assert.equal(sameSelection({ account: 1, assetIds: [5] }, { account: 2, assetIds: [5] }), false);
assert.equal(sameSelection({ account: 1, assetIds: [5] }, { account: 1, assetIds: [5] }), true);
assert.equal(sameSelection({ account: 1, assetIds: [5] }, { assetIds: [5] }), false);
});
});