| 1 | import assert from 'node:assert/strict'; |
| 2 | import { test } from 'node:test'; |
| 3 | import { allowed, isMuted, levelOf, parsePowerLevels } from '../src/lib/permissions.ts'; |
| 4 | |
| 5 | const levels = parsePowerLevels({ |
| 6 | ban: 50, |
| 7 | kick: 50, |
| 8 | events_default: 0, |
| 9 | state_default: 50, |
| 10 | users_default: 0, |
| 11 | users: [['@mod:x', 50], ['@admin:x', 100], ['@muted:x', -1]], |
| 12 | events: [['m.room.power_levels', 100]], |
| 13 | creators: ['@creator:x'] |
| 14 | })!; |
| 15 | |
| 16 | test('levels come from users, the default, or creator rank', () => { |
| 17 | assert.equal(levelOf(levels, '@admin:x'), 100); |
| 18 | assert.equal(levelOf(levels, '@someone:x'), 0); |
| 19 | assert.equal(levelOf(levels, '@creator:x'), Infinity); |
| 20 | assert.equal(isMuted(levels, '@muted:x'), true); |
| 21 | assert.equal(isMuted(levels, '@someone:x'), false); |
| 22 | }); |
| 23 | |
| 24 | test('you can only act on people below you', () => { |
| 25 | assert.deepEqual(allowed(levels, '@mod:x', '@someone:x'), { kick: true, ban: true, setLevel: false, maxLevel: 50 }); |
| 26 | assert.equal(allowed(levels, '@mod:x', '@admin:x').kick, false); |
| 27 | assert.equal(allowed(levels, '@mod:x', '@mod:x').kick, false); |
| 28 | assert.equal(allowed(levels, '@admin:x', '@mod:x').setLevel, true); |
| 29 | assert.equal(allowed(levels, '@admin:x', '@creator:x').ban, false); |
| 30 | assert.equal(allowed(levels, '@creator:x', '@admin:x').setLevel, true); |
| 31 | }); |
| 32 | |
| 33 | test('anyone can delete their own messages but others need the redact level', async () => { |
| 34 | const { canRedact } = await import('../src/lib/permissions.ts'); |
| 35 | assert.equal(canRedact(levels, '@someone:x', '@someone:x'), true); |
| 36 | assert.equal(canRedact(levels, '@someone:x', '@mod:x'), false); |
| 37 | assert.equal(canRedact(levels, '@mod:x', '@someone:x'), true); |
| 38 | assert.equal(canRedact(levels, '@muted:x', '@muted:x'), false); |
| 39 | }); |