test: expliciete regressietest voor de beperkte rechten van groepsleiding (v0.4.08-beta)

Geen gedragswijziging - dit legt vast (en bevestigt) wat al klopte: een
groepsleiding kan geen rol wijzigen, geen gebruiker aan een school
koppelen/losmaken, geen klas aanmaken en geen school beheren. Alleen
systeemmanager (en voor klassen: ook schoolbeheerder) mag dit.
This commit is contained in:
Ramon 2026-07-18 04:49:10 +02:00
parent e2ee4820dc
commit 3850b5cb4b
3 changed files with 39 additions and 2 deletions

View file

@ -1 +1 @@
0.4.07-beta
0.4.08-beta

View file

@ -2,7 +2,7 @@
"use strict";
/* version shown until /api/version resolves (or if the fetch fails, e.g. offline).
Kept in sync by hand with the VERSION file at the repo root on every release. */
const VERSION = "0.4.07-beta";
const VERSION = "0.4.08-beta";
(function(){
const tag = document.getElementById("verTag");
tag.textContent = "v"+VERSION;

View file

@ -143,6 +143,43 @@ test('een bestaande groepsleiding of schoolbeheerder kan via rolwijziging nooit
await app3.close();
});
test('groepsleiding mag zelf geen rol wijzigen en geen school koppelen/losmaken', async () => {
// rolwijziging: users.role.change is alleen 'super'. Een groepsleiding die
// dit probeert op een niet-leerling-account wordt zelfs al eerder
// geweigerd (teacherOnly-check: groepsleiding beheert uitsluitend
// leerlingen), dus 403 - niet stilzwijgend genegeerd.
const teacherActor = { id: 5, username: 'juf', role: 'teacher', school_id: 2, class_id: null, data: {}, data_rev: 0 };
const { app, calls } = await makeApp(teacherActor, { id: 7, role: 'teacher', school_id: 2 });
const res = await app.inject({ method: 'PATCH', url: '/api/admin/users/7', cookies,
payload: { role: 'admin' } });
assert.equal(res.statusCode, 403, res.body);
assert.ok(!calls.some((c) => c.sql.startsWith('UPDATE users SET role')),
'groepsleiding mag geen rol van een ander account wijzigen');
await app.close();
// schoolId koppelen/losmaken: alleen systeemmanager (req.user.allRoles.includes('super')).
// Op een eigen leerling (waar een groepsleiding verder wél bij mag) blijft
// dit alsnog verboden, dus hier specifiek getest met een leerling-doel.
const { app: app2, calls: calls2 } = await makeApp(teacherActor, { id: 7, role: 'pupil', school_id: 2, class_id: 40 });
const res2 = await app2.inject({ method: 'PATCH', url: '/api/admin/users/7', cookies,
payload: { schoolId: null } });
assert.ok(!calls2.some((c) => c.sql.startsWith('UPDATE users SET school_id')),
'groepsleiding mag een account niet van school koppelen/losmaken');
await app2.close();
// klassen aanmaken/koppelen: classes.manage is alleen super/admin
const { app: app3, calls: calls3 } = await makeApp(teacherActor, null);
const res3 = await app3.inject({ method: 'POST', url: '/api/admin/classes', cookies,
payload: { name: 'Nieuwe klas' } });
assert.equal(res3.statusCode, 403, res3.body);
assert.ok(!calls3.some((c) => c.sql.startsWith('INSERT INTO classes')));
await app3.close();
// scholen beheren: schools.manage is alleen super
const { app: app4 } = await makeApp(teacherActor);
const res4 = await app4.inject({ method: 'PATCH', url: '/api/admin/schools/2', cookies,
payload: { name: 'Andere naam' } });
assert.equal(res4.statusCode, 403, res4.body);
await app4.close();
});
test('systeemmanager koppelt een gebruiker aan een school en maakt hem weer los', async () => {
// koppelen: school bestaat -> update + klas-/toewijzing-opruiming
const { app, calls } = await makeApp(superUser, { id: 7, role: 'teacher', school_id: null, username: 'juf' });