feat(permissions): B5 — группы прав (секции в UI + вкл/выкл всей группы)

registry: карта GROUP (Вопросы / Класс и ученики / Библиотека / Курсы и шаблоны /
Геймификация / Контент / Тесты и активность / Профиль), проброшена в byRole.group.
permissions.js: вкладка «Доступ · роли» рендерит права секциями по группам, у
каждой — «включить все / выключить все» (с подтверждением, если в группе есть
requireConfirmOff). Карточка вынесена в permCard(). Тест: definitions содержат group.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-03 14:21:52 +03:00
parent 86935c43b0
commit 0a24a66a2e
3 changed files with 91 additions and 29 deletions
+9
View File
@@ -197,6 +197,15 @@ describe('Permissions', () => {
{ role: 'student', permission: 'simulations.access', enabled: true }, adminToken);
});
// ── B5: группы прав в определениях ─────────────────────────────────────────
it('B5: GET /api/permissions — у каждого определения есть group', async () => {
const res = await inject('GET', '/api/permissions', null, adminToken);
assert.equal(res.status, 200);
assert.ok(Array.isArray(res.body.definitions) && res.body.definitions.length > 0);
assert.ok(res.body.definitions.every(d => typeof d.group === 'string' && d.group.length > 0),
'у каждого определения есть непустой group');
});
// ── 11. A3: история изменений прав ─────────────────────────────────────────
it('GET /api/permissions/log — история (admin видит записи; не-админу 403)', async () => {
await inject('POST', '/api/permissions',