Skip to content
85 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Chat controls, public profiles, shadcn selects, and no Docs tab in a project1import { test } from "node:test";
2import assert from "node:assert/strict";
3
4import { MAX_DEFAULT_CHANNELS, mayCreateChannel, mayManageChannel, permissionsFor, rowFor, settingsChange, settingsOf } from "./settings.ts";
5
6test("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
18test("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
31test("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
39test("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
50test("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
66test("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
77test("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});