element-web/test/unit-tests/autocomplete/CommandProvider-test.ts
Andy Balaam 562f7cc2bd
Move SlashCommands and SlashCommands-test into subdirs (#31979)
* Move SlashCommands into slash-commands

* Move SlashCommands test prep into a function that can be re-used from multiple files

* Move slash command tests into separate files

* Fix super-linear regexes and test some more slash commands

* Move splitAtFirstSpace tests into a separate file

* Test for parseCommandString

* Make parseCommandString able to handle leading whitespace and tabs

* Implement parseCommandString using splitAtFirstSpace

* Extract emoticons slash commands into a separate file and share their code
2026-02-09 11:08:51 +00:00

88 lines
2.9 KiB
TypeScript

/*
Copyright 2025 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import { type Room } from "matrix-js-sdk/src/matrix";
import CommandProvider from "../../../src/autocomplete/CommandProvider";
import { stubClient } from "../../test-utils";
import { Command } from "../../../src/slash-commands/command";
import { CommandCategories } from "../../../src/slash-commands/interface";
import { _td } from "../../../src/languageHandler";
import * as SlashCommands from "../../../src/slash-commands/SlashCommands";
describe("CommandProvider", () => {
let room: Room;
beforeEach(() => {
stubClient();
room = {
roomId: "!room:server",
} as Room;
});
it("should filter out disabled commands when arguments are provided", async () => {
// Create a disabled command
const disabledCommand = new Command({
command: "disabled",
args: "<arg>",
description: _td("slash_command|spoiler"),
runFn: jest.fn(),
category: CommandCategories.messages,
isEnabled: () => false,
});
// Create an enabled command
const enabledCommand = new Command({
command: "enabled",
args: "<arg>",
description: _td("slash_command|shrug"),
runFn: jest.fn(),
category: CommandCategories.messages,
isEnabled: () => true,
});
// Mock the Commands array and CommandMap
Object.defineProperty(SlashCommands, "Commands", {
value: [disabledCommand, enabledCommand],
configurable: true,
});
const mockCommandMap = new Map<string, Command>();
mockCommandMap.set("disabled", disabledCommand);
mockCommandMap.set("enabled", enabledCommand);
Object.defineProperty(SlashCommands, "CommandMap", {
value: mockCommandMap,
configurable: true,
});
const provider = new CommandProvider(room);
// When we search for a disabled command with arguments
const completions = await provider.getCompletions("/disabled test", {
beginning: true,
start: 0,
end: 14,
});
// Then we should get no completions because the command is disabled
expect(completions).toEqual([]);
// When we search for an enabled command with arguments
const enabledCompletions = await provider.getCompletions("/enabled test", {
beginning: true,
start: 0,
end: 13,
});
// Then we should get the completion because the command is enabled
// The completion preserves the arguments when the command matches
expect(enabledCompletions.length).toBe(1);
expect(enabledCompletions[0].completion).toBe("/enabled test");
});
});