Files
2026-10-29 11:57:29 +01:00

81 lines
2.9 KiB
JavaScript

// Generated, do not edit. sha256:82c1a99dd9bcb14921519651f00e41b83ebb6753c9cc496d2de5d3792c7a8814
import { DatabaseSync } from 'node:sqlite';
import { SCHEMA, createDatabase as echteCreateDatabase } from '../../server/db.js';
import { CONFIG, PREFERENCES } from '../../shared/config.js';
const bind = params => params.map(v => {
if (v === undefined) return null;
if (typeof v === 'boolean') return v ? 1n : 0n;
if (typeof v === 'number' && Number.isInteger(v)) return BigInt(v);
return v;
});
export function createDbHarness({ seedPreferences = false } = {}) {
let sqlite;
let calls;
function fresh() {
sqlite = new DatabaseSync(':memory:', { enableForeignKeyConstraints: true });
sqlite.exec(SCHEMA);
sqlite.prepare(`INSERT INTO Schema (version) VALUES (?)`).run(CONFIG.SCHEMA_VERSION);
sqlite.prepare(`INSERT INTO Portfolio (id, baseCurrency, createdAt) VALUES (1, ?, ?)`)
.run(CONFIG.PORTFOLIO.DEFAULT_BASE_CURRENCY, '2026-01-01T00:00:00.000Z');
calls = { run: 0, persist: 0, seedPriceSource: [] };
if (seedPreferences) seedPrefs();
}
function seedPrefs() {
for (const [scope, keys] of Object.entries(PREFERENCES)) {
for (const [key, spec] of Object.entries(keys)) {
if (spec.secret) continue;
api.run(`INSERT INTO Preference (scope, key, value) VALUES (?,?,?)`,
[scope, key, JSON.stringify(spec.initial)]);
}
}
}
const api = {
run(sql, params = []) {
calls.run++;
if (params.length === 0) sqlite.exec(sql);
else sqlite.prepare(sql).run(...bind(params));
},
all(sql, params = []) {
return sqlite.prepare(sql).all(...bind(params)).map(row => ({ ...row }));
},
one(sql, params = []) {
const rows = api.all(sql, params);
return rows.length ? rows[0] : null;
},
lastId() {
const r = api.one(`SELECT last_insert_rowid() AS id`);
return r ? r.id : null;
},
schemaVersion() {
const r = api.one(`SELECT version FROM Schema`);
return r ? r.version : null;
},
async persist() { calls.persist++; },
seedPriceSource(assetId, status) { calls.seedPriceSource.push([assetId, status]); },
async init() { return sqlite; },
exportBytes() { throw new Error('db-node-harness: exportBytes() niet ondersteund in tests.'); },
async reset() { throw new Error('db-node-harness: reset() niet ondersteund; gebruik harness.recreate().'); },
async importBytes() { throw new Error('db-node-harness: importBytes() niet ondersteund in tests.'); },
createDatabase: echteCreateDatabase,
async idbGet(key) { return idb.has(key) ? idb.get(key) : null; },
async idbPut(key, value) { idb.set(key, value); },
};
const idb = new Map();
fresh();
return {
exports: api,
recreate() { sqlite.close(); idb.clear(); fresh(); },
get sqlite() { return sqlite; },
get calls() { return calls; },
};
}