Files

129 lines
5.7 KiB
JavaScript
Raw Permalink Normal View History

2026-10-29 11:57:29 +01:00
// Generated, do not edit. sha256:819333deae77dc120b2355f624bcd66c41435cf53288c76e8c74c98bc181e6bc
import { describe, it, before, after, beforeEach } from 'node:test';
import assert from 'node:assert/strict';
import { DatabaseSync } from 'node:sqlite';
import { mkdtemp, rm, access } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
const DIR = await mkdtemp(join(tmpdir(), 'assetapp-fresh-test-'));
process.env.ASSETAPP_DATA_DIR = DIR;
process.env.ASSETAPP_DB_FILE = join(DIR, 'db.sqlite');
const { initDatabase, dbFile } = await import('../../server/db.js');
const DB_FILE = dbFile();
const { closeDatabase, run, one } = await import('../../server/db/conn.mjs');
const { startFreshDatabase, chooseSetupCurrency } = await import('../../server/db-fresh.mjs');
const { CONFIG } = await import('../../shared/config.js');
const bestaat = async p => { try { await access(p); return true; } catch { return false; } };
const aantal = tabel => one(`SELECT COUNT(*) AS n FROM ${tabel}`).n;
before(() => initDatabase());
after(async () => { closeDatabase(); await rm(DIR, { recursive: true, force: true }); });
beforeEach(async () => {
closeDatabase();
for (const b of ['', '-wal', '-shm', '.previous', '.previous-wal', '.previous-shm']) {
await rm(DB_FILE + b, { force: true });
}
initDatabase();
run(`INSERT INTO Account (name, searchName, kind, isOwnCustody, scanEnabled, isActive, closedAt)
VALUES ('Kluis','kluis','vault',1,0,1,NULL)`);
run(`INSERT INTO Label (name, searchName) VALUES ('merkteken','merkteken')`);
});
describe('startFreshDatabase', () => {
it('laat een administratie achter zonder eigen gegevens', async () => {
const r = await startFreshDatabase();
assert.equal(r.versie, CONFIG.SCHEMA_VERSION);
for (const tabel of ['Account', 'Event', 'Valuation', 'Label']) {
assert.equal(aantal(tabel), 0, `${tabel} hoort leeg te zijn`);
}
});
it('levert een VERSE en geen LEGE database: de seeds staan erin', async () => {
await startFreshDatabase();
assert.ok(aantal('Asset') > 0, 'assets');
assert.ok(aantal('Provider') > 0, 'providers');
assert.ok(aantal('DashboardProfile') > 0, 'dashboardprofiel');
assert.equal(one(`SELECT version FROM Schema`).version, CONFIG.SCHEMA_VERSION);
assert.equal(one(`SELECT baseCurrency FROM Portfolio`).baseCurrency, CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY);
});
it('zet alleen fiat neer, geen crypto, geen metaal en geen metaalproducten', async () => {
await startFreshDatabase();
assert.equal(aantal('Asset'), one(`SELECT COUNT(*) AS n FROM Asset WHERE kind = 'fiat'`).n, 'alleen fiat');
assert.equal(aantal('MetalProduct'), 0, 'geen metaalproducten');
});
it('houdt de rekenvaluta van de portefeuille, en valt niet terug op de standaard', async () => {
closeDatabase();
for (const b of ['', '-wal', '-shm']) await rm(DB_FILE + b, { force: true });
initDatabase(DB_FILE, { baseCurrency: 'USD' });
await startFreshDatabase();
assert.equal(one(`SELECT baseCurrency FROM Portfolio`).baseCurrency, 'USD');
});
it('bewaart de oude administratie als .previous', async () => {
const r = await startFreshDatabase();
assert.ok(await bestaat(r.previous));
const oud = new DatabaseSync(r.previous, { readOnly: true });
assert.equal(oud.prepare(`SELECT name FROM Label LIMIT 1`).get().name, 'merkteken');
assert.equal(oud.prepare(`SELECT COUNT(*) AS n FROM Account`).get().n, 1);
oud.close();
});
it('laat een werkende verbinding achter', async () => {
await startFreshDatabase();
run(`INSERT INTO Label (name, searchName) VALUES ('erna','erna')`);
assert.equal(aantal('Label'), 1, 'er is te schrijven én te lezen na de wissel');
});
it('zegt dat de geheimen NIET zijn weggegooid', async () => {
const r = await startFreshDatabase();
assert.match(r.geheimenWaarschuwing, /secrets\.json/);
assert.match(r.geheimenWaarschuwing, /NIET weggegooid/);
});
});
describe('chooseSetupCurrency', () => {
const maagdelijk = async () => {
closeDatabase();
for (const b of ['', '-wal', '-shm', '.previous', '.previous-wal', '.previous-shm']) await rm(DB_FILE + b, { force: true });
initDatabase();
};
const munt = () => one(`SELECT baseCurrency FROM Portfolio`).baseCurrency;
it('zet een maagdelijke portefeuille in de gekozen munt', async () => {
await maagdelijk();
assert.deepEqual(await chooseSetupCurrency('USD'), { changed: true });
assert.equal(munt(), 'USD');
});
it('weigert zodra er een account staat, en laat de administratie staan', async () => {
await assert.rejects(() => chooseSetupCurrency('USD'), /holds nothing yet/);
assert.equal(munt(), CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY);
assert.equal(aantal('Account'), 1);
assert.equal(await bestaat(`${DB_FILE}.previous`), false, 'er is niets gewisseld');
});
it('weigert na afronden van het venster, ook op een lege portefeuille', async () => {
await maagdelijk();
run(`INSERT INTO Preference (scope, key, value) VALUES ('app','setup_done','1')
ON CONFLICT (scope, key) DO UPDATE SET value = excluded.value`);
await assert.rejects(() => chooseSetupCurrency('USD'), /holds nothing yet/);
assert.equal(munt(), CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY);
});
it('dezelfde munt wisselt niets, ook niet op een gevulde portefeuille', async () => {
assert.deepEqual(await chooseSetupCurrency(CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY), { changed: false });
assert.equal(aantal('Account'), 1);
});
it('weigert een munt buiten de lijst', async () => {
await maagdelijk();
await assert.rejects(() => chooseSetupCurrency('XYZ'), /Unknown unit of account/);
assert.equal(munt(), CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY);
});
});