| 1 | import { test } from "node:test"; |
| 2 | import assert from "node:assert/strict"; |
| 3 | |
| 4 | import { MAX_DEFAULT_CHANNELS, mayCreateChannel, mayManageChannel, permissionsFor, rowFor, settingsChange, settingsOf } from "./settings.ts"; |
| 5 | |
| 6 | test("a workspace without settings lets every member make channels, and new people land in #general", () => { |
| 7 | const settings = settingsOf(null, "chn_general"); |
| 8 | assert.deepEqual(settings, { |
| 9 | public_channels: "members", |
| 10 | private_channels: "members", |
| 11 | manage_channels: "channel_owners", |
| 12 | emoji_upload: "members", |
| 13 | default_channels: ["chn_general"], |
| 14 | }); |
| 15 | assert.deepEqual(settingsOf(null).default_channels, []); |
| 16 | }); |
| 17 | |
| 18 | test("default channels once chosen are kept as chosen, even none", () => { |
| 19 | const row = { emoji_upload: "admins", public_channels: "owners", private_channels: "members", manage_channels: "owners", default_channels: "[]" }; |
| 20 | const settings = settingsOf(row, "chn_general"); |
| 21 | assert.deepEqual(settings.default_channels, []); |
| 22 | assert.equal(settings.emoji_upload, "admins"); |
| 23 | assert.equal(settings.public_channels, "owners"); |
| 24 | assert.equal(settings.manage_channels, "owners"); |
| 25 | assert.deepEqual(settingsOf({ ...row, default_channels: '["a","b"]' }).default_channels, ["a", "b"]); |
| 26 | // Anything unreadable is the defaults, never an error. |
| 27 | assert.deepEqual(settingsOf({ ...row, default_channels: "{nope" }).default_channels, []); |
| 28 | assert.equal(settingsOf({ ...row, public_channels: "everyone" }).public_channels, "members"); |
| 29 | }); |
| 30 | |
| 31 | test("who may make a channel follows its visibility's setting", () => { |
| 32 | const settings = settingsOf({ emoji_upload: null, public_channels: "members", private_channels: "owners", manage_channels: null, default_channels: null }); |
| 33 | assert.equal(mayCreateChannel(settings, "member", false), true); |
| 34 | assert.equal(mayCreateChannel(settings, "member", true), false); |
| 35 | assert.equal(mayCreateChannel(settings, "owner", true), true); |
| 36 | assert.equal(mayCreateChannel(settings, null, false), false); |
| 37 | }); |
| 38 | |
| 39 | test("renaming and archiving: workspace owners always, a channel's owners unless kept to workspace owners", () => { |
| 40 | const open = settingsOf(null); |
| 41 | assert.equal(mayManageChannel(open, "owner", null), true); |
| 42 | assert.equal(mayManageChannel(open, "member", "owner"), true); |
| 43 | assert.equal(mayManageChannel(open, "member", "member"), false); |
| 44 | assert.equal(mayManageChannel(open, null, "owner"), false); |
| 45 | const strict = { ...open, manage_channels: "owners" as const }; |
| 46 | assert.equal(mayManageChannel(strict, "member", "owner"), false); |
| 47 | assert.equal(mayManageChannel(strict, "owner", "member"), true); |
| 48 | }); |
| 49 | |
| 50 | test("what a role may do, for the page", () => { |
| 51 | const settings = { ...settingsOf(null), public_channels: "owners" as const, emoji_upload: "admins" as const }; |
| 52 | assert.deepEqual(permissionsFor(settings, "member"), { |
| 53 | create_public_channels: false, |
| 54 | create_private_channels: true, |
| 55 | add_emoji: false, |
| 56 | manage_settings: false, |
| 57 | }); |
| 58 | assert.deepEqual(permissionsFor(settings, "owner"), { |
| 59 | create_public_channels: true, |
| 60 | create_private_channels: true, |
| 61 | add_emoji: true, |
| 62 | manage_settings: true, |
| 63 | }); |
| 64 | }); |
| 65 | |
| 66 | test("a change is checked field by field; what is left out stays", () => { |
| 67 | assert.deepEqual(settingsChange({ public_channels: "owners" }), { ok: true, change: { public_channels: "owners" } }); |
| 68 | assert.deepEqual(settingsChange({ default_channels: ["a", "a", "b"] }), { ok: true, change: { default_channels: ["a", "b"] } }); |
| 69 | assert.equal(settingsChange({ public_channels: "admins" }).ok, false); |
| 70 | assert.equal(settingsChange({ manage_channels: "members" }).ok, false); |
| 71 | assert.equal(settingsChange({ emoji_upload: "owners" }).ok, false); |
| 72 | assert.equal(settingsChange({ default_channels: "general" }).ok, false); |
| 73 | assert.equal(settingsChange({ default_channels: Array.from({ length: MAX_DEFAULT_CHANNELS + 1 }, (_, i) => `c${i}`) }).ok, false); |
| 74 | assert.equal(settingsChange(null).ok, false); |
| 75 | }); |
| 76 | |
| 77 | test("settings are kept with their default channels as JSON", () => { |
| 78 | assert.deepEqual(rowFor({ ...settingsOf(null), default_channels: ["x"] }), { |
| 79 | emoji_upload: "members", |
| 80 | public_channels: "members", |
| 81 | private_channels: "members", |
| 82 | manage_channels: "channel_owners", |
| 83 | default_channels: '["x"]', |
| 84 | }); |
| 85 | }); |