All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 33s
- Systeem toont per school een rij in klassen-stijl (🏫, accentkleur,
aantal schoolbeheerders) met daaronder de schoolbeheerders als duidelijk
onderscheiden subrijen (🛡, ingesprongen, eigen randkleur)
- Beide zijn in dit menu aan te passen via hetzelfde ✏-gereedschap:
de school heeft een Naam-veld (nieuwe route PATCH /admin/schools/:id,
alleen systeemmanager) en de bevestigde verwijder-actie; beheerders
hebben hun volledige gereedschap (functie, extra functies, code,
wachtwoord, verwijderen)
- Systeem-tab laadt beheerders van álle scholen, ook als de contextbalk
elders op één school staat
- Drie nieuwe servertests voor het hernoemen (super ok, admin 403,
naamvalidatie)
62 lines
2.4 KiB
JavaScript
62 lines
2.4 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import Fastify from 'fastify';
|
|
import cookie from '@fastify/cookie';
|
|
import rateLimit from '@fastify/rate-limit';
|
|
import api from '../src/api.js';
|
|
|
|
function makeApp(user) {
|
|
const calls = [];
|
|
const pool = {
|
|
async query(sql, params = []) {
|
|
calls.push({ sql, params });
|
|
if (sql.includes('FROM sessions s JOIN users u')) return { rows: [user] };
|
|
if (sql.includes('FROM user_roles')) return { rows: [] };
|
|
if (sql.startsWith('UPDATE schools SET name')) return { rows: [{ id: params[1], name: params[0] }] };
|
|
return { rows: [] };
|
|
},
|
|
};
|
|
return (async () => {
|
|
const app = Fastify({ trustProxy: 2 });
|
|
await app.register(cookie);
|
|
await app.register(rateLimit, { global: false });
|
|
app.decorate('pg', pool);
|
|
await app.register(api, { prefix: '/api' });
|
|
await app.ready();
|
|
return { app, calls };
|
|
})();
|
|
}
|
|
|
|
const cookies = { teach_session: 'x'.repeat(64) };
|
|
const superUser = { id: 1, username: 'sm', role: 'super', school_id: null, class_id: null, data: {}, data_rev: 0 };
|
|
const admin = { id: 3, username: 'beheer', role: 'admin', school_id: 2, class_id: null, data: {}, data_rev: 0 };
|
|
|
|
test('systeemmanager kan een school hernoemen', async () => {
|
|
const { app, calls } = await makeApp(superUser);
|
|
const res = await app.inject({ method: 'PATCH', url: '/api/admin/schools/5', cookies,
|
|
payload: { name: 'De Nieuwe Naam' } });
|
|
assert.equal(res.statusCode, 200, res.body);
|
|
assert.equal(res.json().school.name, 'De Nieuwe Naam');
|
|
const upd = calls.find((c) => c.sql.startsWith('UPDATE schools SET name'));
|
|
assert.deepEqual(upd.params, ['De Nieuwe Naam', '5']);
|
|
await app.close();
|
|
});
|
|
|
|
test('schoolbeheerder mag geen scholen hernoemen', async () => {
|
|
const { app } = await makeApp(admin);
|
|
const res = await app.inject({ method: 'PATCH', url: '/api/admin/schools/5', cookies,
|
|
payload: { name: 'Hack' } });
|
|
assert.equal(res.statusCode, 403);
|
|
await app.close();
|
|
});
|
|
|
|
test('hernoemen weigert een lege of te lange naam', async () => {
|
|
const { app } = await makeApp(superUser);
|
|
const res = await app.inject({ method: 'PATCH', url: '/api/admin/schools/5', cookies,
|
|
payload: { name: ' ' } });
|
|
assert.equal(res.statusCode, 400);
|
|
const res2 = await app.inject({ method: 'PATCH', url: '/api/admin/schools/5', cookies,
|
|
payload: { name: 'x'.repeat(90) } });
|
|
assert.equal(res2.statusCode, 400);
|
|
await app.close();
|
|
});
|