source: Klonkt/test/hub-permissions.test.js@ 8398935

main
Last change on this file since 8398935 was 8398935, checked in by roboburr <roboburr@…>, 3 months ago

Tests: unit tests for the hub permissions layer (node:test, in-memory SQLite)

Covers canAdminSite (god/owner/collaborator-admin/member/stranger/null), delegation
via canEditPost, and getPrimarySite (is_primary + oldest-fallback). canAdminSite
in particular was silently broken for a long time — these tests will catch
regressions. npm test = node --test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

  • Property mode set to 100644
File size: 4.4 KB
Line 
1// Unit-tests voor de hub-permissielaag — juist `canAdminSite` was lang stil kapot
2// (las een nooit-gevulde user.siteRoles), dus dit dekt 'm nu af. Draait op de
3// ingebouwde node:test (geen extra deps). In-memory SQLite → raakt geen echte data.
4//
5// Run: npm test (= node --test)
6
7import { test } from 'node:test';
8import assert from 'node:assert/strict';
9
10// Isoleer van de echte DB: ':memory:' MOET gezet zijn vóór de eerste import van
11// config/database.js (die maakt de singleton-connectie op basis van deze env).
12process.env.DATABASE_PATH = ':memory:';
13
14const dbMod = await import('../src/config/database.js');
15const db = dbMod.default;
16const PermissionsService = (await import('../src/services/PermissionsService.js')).default;
17const { getPrimarySite } = await import('../src/middleware/site.js');
18
19dbMod.initializeDatabase();
20
21// ── Seed ────────────────────────────────────────────────────────────────
22function addUser(id, role) {
23 db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
24 .run(id, id, id + '@test', 'x', role);
25}
26function addSite(id, slug, ownerId, isPrimary = 0) {
27 db.prepare('INSERT INTO sites (id, slug, title, owner_id, is_primary) VALUES (?,?,?,?,?)')
28 .run(id, slug, slug, ownerId, isPrimary);
29}
30addUser('u-god', 'god');
31addUser('u-owner', 'member');
32addUser('u-collab', 'member');
33addUser('u-stranger', 'member');
34addSite('s1', 'site-een', 'u-owner', 1);
35
36const god = { id: 'u-god', role: 'god' };
37const owner = { id: 'u-owner', role: 'member' };
38const collab = { id: 'u-collab', role: 'member' };
39const stranger = { id: 'u-stranger', role: 'member' };
40const site = () => db.prepare('SELECT * FROM sites WHERE id = ?').get('s1');
41
42// ── canAdminSite ─────────────────────────────────────────────────────────
43test('canAdminSite: god mag altijd', () => {
44 assert.equal(PermissionsService.canAdminSite(god, site()), true);
45});
46test('canAdminSite: owner mag', () => {
47 assert.equal(PermissionsService.canAdminSite(owner, site()), true);
48});
49test('canAdminSite: vreemde zonder membership mag niet', () => {
50 assert.equal(PermissionsService.canAdminSite(stranger, site()), false);
51});
52test('canAdminSite: collaborator zonder membership mag niet', () => {
53 assert.equal(PermissionsService.canAdminSite(collab, site()), false);
54});
55test('canAdminSite: collaborator MET site_members-admin mag (de gefixte dode code)', () => {
56 db.prepare("INSERT OR REPLACE INTO site_members (site_id, user_id, role) VALUES ('s1','u-collab','admin')").run();
57 assert.equal(PermissionsService.canAdminSite(collab, site()), true);
58});
59test('canAdminSite: site_members met rol "member" (geen admin) mag niet', () => {
60 db.prepare("INSERT OR REPLACE INTO site_members (site_id, user_id, role) VALUES ('s1','u-stranger','member')").run();
61 assert.equal(PermissionsService.canAdminSite(stranger, site()), false);
62});
63test('canAdminSite: null user of null site → false (geen crash)', () => {
64 assert.equal(PermissionsService.canAdminSite(null, site()), false);
65 assert.equal(PermissionsService.canAdminSite(owner, null), false);
66});
67
68// ── Delegatie: canEditPost via canAdminSite ──────────────────────────────
69test('canEditPost: collaborator-admin kan een post van een ander bewerken (via canAdminSite)', () => {
70 const post = { author_id: 'iemand-anders' };
71 assert.equal(PermissionsService.canEditPost(collab, post, site()), true);
72});
73test('canEditPost: vreemde kan een post van een ander NIET bewerken', () => {
74 const post = { author_id: 'iemand-anders' };
75 assert.equal(PermissionsService.canEditPost(stranger, post, site()), false);
76});
77
78// ── getPrimarySite (#3) ──────────────────────────────────────────────────
79test('getPrimarySite: geeft de is_primary-site', () => {
80 assert.equal(getPrimarySite().id, 's1');
81});
82test('getPrimarySite: valt terug op de oudste als geen is_primary gemarkeerd is', () => {
83 db.prepare('UPDATE sites SET is_primary = 0').run();
84 assert.equal(getPrimarySite().id, 's1'); // s1 is de oudste/enige
85 db.prepare("UPDATE sites SET is_primary = 1 WHERE id = 's1'").run(); // herstel
86});
Note: See TracBrowser for help on using the repository browser.