Dienstplan-Pro/server/migrate.test.js

39 lines
2 KiB
JavaScript

const { test } = require('node:test');
const assert = require('node:assert');
const fs = require('fs');
const os = require('os');
const path = require('path');
process.env.DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), 'dp-migrate-'));
const { db } = require('./db');
const { migrateToMultiUser, seedAdmin } = require('./auth');
test('Migration ordnet Alt-Daten dem Admin zu, setzt neues PK-Schema, ist idempotent', () => {
// Alt-Schema (Single-User) erzwingen — unabhängig von der aktuellen db.js-Definition
db.exec("DROP TABLE IF EXISTS documents; CREATE TABLE documents (key TEXT PRIMARY KEY, value TEXT NOT NULL, updated_at TEXT NOT NULL)");
db.exec("DROP TABLE IF EXISTS history; CREATE TABLE history (id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL, value TEXT NOT NULL, replaced_at TEXT NOT NULL)");
const now = new Date().toISOString();
db.prepare('INSERT INTO documents (key,value,updated_at) VALUES (?,?,?)').run('employees', '["Max"]', now);
db.prepare('INSERT INTO documents (key,value,updated_at) VALUES (?,?,?)').run('duties', '{}', now);
db.prepare('INSERT INTO history (key,value,replaced_at) VALUES (?,?,?)').run('employees', '[]', now);
const adminId = seedAdmin('admin@x.de');
assert.strictEqual(migrateToMultiUser(adminId), true);
const cols = db.prepare("PRAGMA table_info('documents')").all().map(c => c.name);
assert.ok(cols.includes('user_id'), 'documents hat user_id');
const rows = db.prepare('SELECT user_id, key FROM documents ORDER BY key').all();
assert.deepStrictEqual(rows, [
{ user_id: adminId, key: 'duties' },
{ user_id: adminId, key: 'employees' },
]);
assert.strictEqual(db.prepare('SELECT user_id FROM history').get().user_id, adminId);
// PK ist (user_id,key): dieselbe Kombi doppelt schlägt fehl
assert.throws(() => db.prepare('INSERT INTO documents (user_id,key,value,updated_at) VALUES (?,?,?,?)')
.run(adminId, 'duties', '{}', now));
// Idempotent
assert.strictEqual(migrateToMultiUser(adminId), false);
});