130 lines
5.7 KiB
JavaScript
130 lines
5.7 KiB
JavaScript
// 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);
|
|
});
|
|
});
|