atagen

malice

public
Star0
Watch0
31606c86aa9f9ed767d591ad237830e4df6a856c
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/test/permissions.test.ts

d8624c214c04atagen2026-10-24 08:24 UTC1
import assert from 'node:assert/strict';
d8624c214c04atagen2026-10-24 08:24 UTC2
import { test } from 'node:test';
dfd1feaae855atagen2026-10-24 10:54 UTC3
import { allowed, groupMembers, isMuted, levelOf, parsePowerLevels } from '../src/lib/permissions.ts';
d8624c214c04atagen2026-10-24 08:24 UTC4
d8624c214c04atagen2026-10-24 08:24 UTC5
const levels = parsePowerLevels({
d8624c214c04atagen2026-10-24 08:24 UTC6
  ban: 50,
d8624c214c04atagen2026-10-24 08:24 UTC7
  kick: 50,
d8624c214c04atagen2026-10-24 08:24 UTC8
  events_default: 0,
d8624c214c04atagen2026-10-24 08:24 UTC9
  state_default: 50,
d8624c214c04atagen2026-10-24 08:24 UTC10
  users_default: 0,
d8624c214c04atagen2026-10-24 08:24 UTC11
  users: [['@mod:x', 50], ['@admin:x', 100], ['@muted:x', -1]],
d8624c214c04atagen2026-10-24 08:24 UTC12
  events: [['m.room.power_levels', 100]],
d8624c214c04atagen2026-10-24 08:24 UTC13
  creators: ['@creator:x']
d8624c214c04atagen2026-10-24 08:24 UTC14
})!;
d8624c214c04atagen2026-10-24 08:24 UTC15
d8624c214c04atagen2026-10-24 08:24 UTC16
test('levels come from users, the default, or creator rank', () => {
d8624c214c04atagen2026-10-24 08:24 UTC17
  assert.equal(levelOf(levels, '@admin:x'), 100);
d8624c214c04atagen2026-10-24 08:24 UTC18
  assert.equal(levelOf(levels, '@someone:x'), 0);
d8624c214c04atagen2026-10-24 08:24 UTC19
  assert.equal(levelOf(levels, '@creator:x'), Infinity);
d8624c214c04atagen2026-10-24 08:24 UTC20
  assert.equal(isMuted(levels, '@muted:x'), true);
d8624c214c04atagen2026-10-24 08:24 UTC21
  assert.equal(isMuted(levels, '@someone:x'), false);
d8624c214c04atagen2026-10-24 08:24 UTC22
});
d8624c214c04atagen2026-10-24 08:24 UTC23
d8624c214c04atagen2026-10-24 08:24 UTC24
test('you can only act on people below you', () => {
d8624c214c04atagen2026-10-24 08:24 UTC25
  assert.deepEqual(allowed(levels, '@mod:x', '@someone:x'), { kick: true, ban: true, setLevel: false, maxLevel: 50 });
d8624c214c04atagen2026-10-24 08:24 UTC26
  assert.equal(allowed(levels, '@mod:x', '@admin:x').kick, false);
d8624c214c04atagen2026-10-24 08:24 UTC27
  assert.equal(allowed(levels, '@mod:x', '@mod:x').kick, false);
d8624c214c04atagen2026-10-24 08:24 UTC28
  assert.equal(allowed(levels, '@admin:x', '@mod:x').setLevel, true);
d8624c214c04atagen2026-10-24 08:24 UTC29
  assert.equal(allowed(levels, '@admin:x', '@creator:x').ban, false);
d8624c214c04atagen2026-10-24 08:24 UTC30
  assert.equal(allowed(levels, '@creator:x', '@admin:x').setLevel, true);
d8624c214c04atagen2026-10-24 08:24 UTC31
});
0380cd8c765catagen2026-10-24 09:08 UTC32
0380cd8c765catagen2026-10-24 09:08 UTC33
test('anyone can delete their own messages but others need the redact level', async () => {
0380cd8c765catagen2026-10-24 09:08 UTC34
  const { canRedact } = await import('../src/lib/permissions.ts');
0380cd8c765catagen2026-10-24 09:08 UTC35
  assert.equal(canRedact(levels, '@someone:x', '@someone:x'), true);
0380cd8c765catagen2026-10-24 09:08 UTC36
  assert.equal(canRedact(levels, '@someone:x', '@mod:x'), false);
0380cd8c765catagen2026-10-24 09:08 UTC37
  assert.equal(canRedact(levels, '@mod:x', '@someone:x'), true);
0380cd8c765catagen2026-10-24 09:08 UTC38
  assert.equal(canRedact(levels, '@muted:x', '@muted:x'), false);
0380cd8c765catagen2026-10-24 09:08 UTC39
});
dfd1feaae855atagen2026-10-24 10:54 UTC40
dfd1feaae855atagen2026-10-24 10:54 UTC41
test('members group by role, highest first, invites last', () => {
dfd1feaae855atagen2026-10-24 10:54 UTC42
  const m = (user_id: string, name: string, membership = 'Joined') => ({ user_id, name, display_name: null, membership });
dfd1feaae855atagen2026-10-24 10:54 UTC43
  const groups = groupMembers(
dfd1feaae855atagen2026-10-24 10:54 UTC44
    [m('@someone:x', 'zed'), m('@invitee:x', 'ivy', 'Invited'), m('@mod:x', 'mod'), m('@creator:x', 'cr'), m('@admin:x', 'ad'), m('@b:x', 'Abe'), m('@gone:x', 'gone', 'Left')],
dfd1feaae855atagen2026-10-24 10:54 UTC45
    levels
dfd1feaae855atagen2026-10-24 10:54 UTC46
  );
dfd1feaae855atagen2026-10-24 10:54 UTC47
  assert.deepEqual(
dfd1feaae855atagen2026-10-24 10:54 UTC48
    groups.map((g) => [g.label, g.members.map((x) => x.user_id)]),
dfd1feaae855atagen2026-10-24 10:54 UTC49
    [
dfd1feaae855atagen2026-10-24 10:54 UTC50
      ['Creator', ['@creator:x']],
dfd1feaae855atagen2026-10-24 10:54 UTC51
      ['Admin', ['@admin:x']],
dfd1feaae855atagen2026-10-24 10:54 UTC52
      ['Moderator', ['@mod:x']],
dfd1feaae855atagen2026-10-24 10:54 UTC53
      ['Members', ['@b:x', '@someone:x']],
dfd1feaae855atagen2026-10-24 10:54 UTC54
      ['Invited', ['@invitee:x']]
dfd1feaae855atagen2026-10-24 10:54 UTC55
    ]
dfd1feaae855atagen2026-10-24 10:54 UTC56
  );
dfd1feaae855atagen2026-10-24 10:54 UTC57
});