80 lines
2.9 KiB
JavaScript
80 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; },
|
||
|
|
};
|
||
|
|
}
|