112 lines
3.3 KiB
JavaScript
112 lines
3.3 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const os = require('node:os');
|
|
const path = require('node:path');
|
|
|
|
const dbPath = path.join(os.tmpdir(), `bill-tracker-profile-route-test-${process.pid}.sqlite`);
|
|
process.env.DB_PATH = dbPath;
|
|
|
|
const { getDb, closeDb } = require('../db/database');
|
|
const { publicUser } = require('../services/authService');
|
|
|
|
function createUser(db, suffix) {
|
|
return db.prepare(`
|
|
INSERT INTO users (username, password_hash, role, active, created_at, updated_at)
|
|
VALUES (?, 'x', 'user', 1, datetime('now'), datetime('now'))
|
|
`).run(`profile-user-${suffix}`).lastInsertRowid;
|
|
}
|
|
|
|
function callProfileRoute(method, { userId, body = {} }) {
|
|
const profileRouter = require('../routes/profile');
|
|
const layer = profileRouter.stack.find(item => item.route?.path === '/' && item.route.methods[method]);
|
|
assert.ok(layer, `route ${method.toUpperCase()} / should exist`);
|
|
const handler = layer.route.stack[0].handle;
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const req = {
|
|
body,
|
|
ip: '127.0.0.1',
|
|
user: { id: userId, role: 'user' },
|
|
get(header) {
|
|
return header === 'user-agent' ? 'node:test' : undefined;
|
|
},
|
|
};
|
|
const res = {
|
|
statusCode: 200,
|
|
status(code) {
|
|
this.statusCode = code;
|
|
return this;
|
|
},
|
|
json(data) {
|
|
resolve({ status: this.statusCode, data });
|
|
},
|
|
};
|
|
try {
|
|
handler(req, res);
|
|
} catch (err) {
|
|
reject(err);
|
|
}
|
|
});
|
|
}
|
|
|
|
test.after(() => {
|
|
closeDb();
|
|
for (const suffix of ['', '-wal', '-shm']) {
|
|
fs.rmSync(`${dbPath}${suffix}`, { force: true });
|
|
}
|
|
});
|
|
|
|
test('profile name is persisted and returned consistently', async () => {
|
|
const db = getDb();
|
|
const userId = createUser(db, 'name');
|
|
|
|
const saved = await callProfileRoute('patch', {
|
|
userId,
|
|
body: { name: 'Kasper Example' },
|
|
});
|
|
|
|
assert.equal(saved.status, 200);
|
|
assert.equal(saved.data.profile.display_name, 'Kasper Example');
|
|
assert.equal(saved.data.profile.displayName, 'Kasper Example');
|
|
assert.equal(saved.data.profile.name, 'Kasper Example');
|
|
|
|
const row = db.prepare('SELECT * FROM users WHERE id = ?').get(userId);
|
|
assert.equal(row.display_name, 'Kasper Example');
|
|
assert.deepEqual(
|
|
{
|
|
display_name: publicUser(row).display_name,
|
|
displayName: publicUser(row).displayName,
|
|
name: publicUser(row).name,
|
|
},
|
|
{
|
|
display_name: 'Kasper Example',
|
|
displayName: 'Kasper Example',
|
|
name: 'Kasper Example',
|
|
},
|
|
);
|
|
|
|
const loaded = await callProfileRoute('get', { userId });
|
|
assert.equal(loaded.status, 200);
|
|
assert.equal(loaded.data.display_name, 'Kasper Example');
|
|
assert.equal(loaded.data.displayName, 'Kasper Example');
|
|
assert.equal(loaded.data.name, 'Kasper Example');
|
|
});
|
|
|
|
test('clearing profile name falls back to username for display', async () => {
|
|
const db = getDb();
|
|
const userId = createUser(db, 'clear');
|
|
|
|
const cleared = await callProfileRoute('patch', {
|
|
userId,
|
|
body: { displayName: ' ' },
|
|
});
|
|
|
|
const username = db.prepare('SELECT username FROM users WHERE id = ?').get(userId).username;
|
|
|
|
assert.equal(cleared.status, 200);
|
|
assert.equal(cleared.data.profile.display_name, null);
|
|
assert.equal(cleared.data.profile.displayName, null);
|
|
assert.equal(cleared.data.profile.name, username);
|
|
});
|