mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
Adds a permissions array to PluginDeclaration, a type-level Permissions registry that plugins extend with module augmentation, and registerPluginPermissions() called from all entrypoints. checkPermission and the web UI hasPermission helpers now take PermissionName so typos are compile errors. Core definitions move into a corePermissions array that the interface derives its keys from. Closes #987 Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com>
88 lines
3.1 KiB
JavaScript
88 lines
3.1 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import * as lib from "@clusterio/lib";
|
|
|
|
|
|
describe("lib/users", function() {
|
|
describe("definePermission()", function() {
|
|
it("should validate the types of its arguments", function() {
|
|
assert.throws(
|
|
() => lib.definePermission({ name: 123, title: "Test", description: "A test" }),
|
|
new Error("Expected name to be a non-empty string")
|
|
);
|
|
assert.throws(
|
|
() => lib.definePermission({ name: "test", title: 123, description: "A test" }),
|
|
new Error("Expected title to be a non-empty string")
|
|
);
|
|
assert.throws(
|
|
() => lib.definePermission({ name: "test", title: "Test", description: 123 }),
|
|
new Error("Expected description to be a non-empty string")
|
|
);
|
|
assert.throws(
|
|
() => lib.definePermission({
|
|
name: "test", title: "Test", description: "A test", grantByDefault: 1,
|
|
}),
|
|
new Error("Expected grantByDefault to be a boolean")
|
|
);
|
|
});
|
|
|
|
it("should define a permission", function() {
|
|
lib.definePermission({ name: "test", title: "Test", description: "A test" });
|
|
assert(lib.permissions.has("test"), "Permission was not defined");
|
|
|
|
let test = lib.permissions.get("test");
|
|
assert.equal(test.name, "test");
|
|
assert.equal(test.title, "Test");
|
|
assert.equal(test.description, "A test");
|
|
assert.equal(test.grantByDefault, false);
|
|
});
|
|
|
|
it("should throw on already defined permission", function() {
|
|
assert.throws(
|
|
() => lib.definePermission({ name: "test", title: "Test", description: "A test" }),
|
|
new Error("Permission 'test' is already defined")
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("registerPluginPermissions()", function() {
|
|
it("should define the permissions declared by plugins", function() {
|
|
lib.registerPluginPermissions([
|
|
{ name: "foo", permissions: [
|
|
{ name: "foo.first", title: "First", description: "The first" },
|
|
{ name: "foo.second", title: "Second", description: "The second", grantByDefault: true },
|
|
]},
|
|
{ name: "bar" },
|
|
{ name: "baz", permissions: [] },
|
|
]);
|
|
assert(lib.permissions.has("foo.first"), "foo.first was not defined");
|
|
assert.equal(lib.permissions.get("foo.first").grantByDefault, false);
|
|
assert(lib.permissions.has("foo.second"), "foo.second was not defined");
|
|
assert.equal(lib.permissions.get("foo.second").grantByDefault, true);
|
|
});
|
|
|
|
it("should throw if the name does not start with the plugin name", function() {
|
|
assert.throws(
|
|
() => lib.registerPluginPermissions([
|
|
{ name: "foo", permissions: [{ name: "bar.spam", title: "Spam", description: "Spam" }] },
|
|
]),
|
|
new Error("Expected name of permission 'bar.spam' for foo to start with 'foo.'")
|
|
);
|
|
assert.throws(
|
|
() => lib.registerPluginPermissions([
|
|
{ name: "foo", permissions: [{ title: "Spam", description: "Spam" }] },
|
|
]),
|
|
new Error("Expected name of permission 'undefined' for foo to start with 'foo.'")
|
|
);
|
|
});
|
|
|
|
it("should throw on already defined permission", function() {
|
|
assert.throws(
|
|
() => lib.registerPluginPermissions([
|
|
{ name: "foo", permissions: [{ name: "foo.first", title: "First", description: "The first" }] },
|
|
]),
|
|
new Error("Permission 'foo.first' is already defined")
|
|
);
|
|
});
|
|
});
|
|
});
|