From ac51eb7f40d10d4fe35f064ea8dad3eb36787c16 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 11 May 2024 10:42:38 +0100 Subject: [PATCH] Create disable command tests --- src/commands/disable.ts | 26 +-- tests/commands/disable.test.ts | 278 +++++++++++++++++++++++++++++++-- 2 files changed, 272 insertions(+), 32 deletions(-) diff --git a/src/commands/disable.ts b/src/commands/disable.ts index 3f19bdb..e38eaed 100644 --- a/src/commands/disable.ts +++ b/src/commands/disable.ts @@ -48,17 +48,12 @@ export default class Disable extends Command { private async Add(interaction: CommandInteraction) { if (!interaction.guildId) return; - const commandName = interaction.options.get('name'); - - if (!commandName || !commandName.value) { - await interaction.reply('Fields are required.'); - return; - } + const commandName = interaction.options.get('name', true); const disabledCommandsString = await SettingsHelper.GetSetting("commands.disabled", interaction.guildId); - const disabledCommands = disabledCommandsString != "" ? disabledCommandsString?.split(",") : []; + const disabledCommands = disabledCommandsString != undefined ? disabledCommandsString?.split(",") : []; - disabledCommands?.push(commandName.value.toString()); + disabledCommands?.push(commandName.value!.toString()); await SettingsHelper.SetSetting("commands.disabled", interaction.guildId, disabledCommands!.join(",")); @@ -68,23 +63,18 @@ export default class Disable extends Command { private async Remove(interaction: CommandInteraction) { if (!interaction.guildId) return; - const commandName = interaction.options.get('name'); - - if (!commandName || !commandName.value) { - await interaction.reply('Fields are required.'); - return; - } + const commandName = interaction.options.get('name', true); const disabledCommandsString = await SettingsHelper.GetSetting("commands.disabled", interaction.guildId); - const disabledCommands = disabledCommandsString != "" ? disabledCommandsString?.split(",") : []; + const disabledCommands = disabledCommandsString != undefined ? disabledCommandsString?.split(",") : []; const disabledCommandsInstance = disabledCommands?.findIndex(x => x == commandName.value!.toString()); - if (disabledCommandsInstance! > -1) { - disabledCommands?.splice(disabledCommandsInstance!, 1); + if (disabledCommandsInstance > -1) { + disabledCommands?.splice(disabledCommandsInstance, 1); } - await SettingsHelper.SetSetting("commands.disabled", interaction.guildId, disabledCommands!.join(",")); + await SettingsHelper.SetSetting("commands.disabled", interaction.guildId, disabledCommands.join(",")); await interaction.reply(`Enabled command ${commandName.value}`); } diff --git a/tests/commands/disable.test.ts b/tests/commands/disable.test.ts index 03be771..6c2a74d 100644 --- a/tests/commands/disable.test.ts +++ b/tests/commands/disable.test.ts @@ -1,35 +1,285 @@ +import { ChatInputCommandInteraction, PermissionsBitField, SlashCommandBuilder, SlashCommandStringOption, SlashCommandSubcommandBuilder } from "discord.js"; +import Command from "../../src/commands/disable"; +import SettingsHelper from "../../src/helpers/SettingsHelper"; + describe('constructor', () => { - test.todo('EXPECT properties to be set'); + test('EXPECT properties to be set', () => { + const command = new Command(); + + expect(command.CommandBuilder).toBeDefined(); + + const commandBuilder = command.CommandBuilder as SlashCommandBuilder; + + expect(commandBuilder.name).toBe("disable"); + expect(commandBuilder.description).toBe("Disables a command"); + expect(commandBuilder.default_member_permissions).toBe(PermissionsBitField.Flags.Administrator.toString()); + expect(commandBuilder.options.length).toBe(2); + + const commandBuilderAddSubcommand = commandBuilder.options[0] as SlashCommandSubcommandBuilder; + + expect(commandBuilderAddSubcommand.name).toBe("add"); + expect(commandBuilderAddSubcommand.description).toBe("Disables a command for the server"); + expect(commandBuilderAddSubcommand.options.length).toBe(1); + + const commandBuilderAddSubcommandNameOption = commandBuilderAddSubcommand.options[0] as SlashCommandStringOption; + + expect(commandBuilderAddSubcommandNameOption.name).toBe("name"); + expect(commandBuilderAddSubcommandNameOption.description).toBe("The name of the command"); + expect(commandBuilderAddSubcommandNameOption.required).toBe(true); + + const commandBuilderRemoveSubcommand = commandBuilder.options[1] as SlashCommandSubcommandBuilder; + + expect(commandBuilderRemoveSubcommand.name).toBe("remove"); + expect(commandBuilderRemoveSubcommand.description).toBe("Enables a command for the server"); + expect(commandBuilderRemoveSubcommand.options.length).toBe(1); + + const commandBuilderRemoveSubcommandNameOption = commandBuilderRemoveSubcommand.options[0] as SlashCommandStringOption; + + expect(commandBuilderRemoveSubcommandNameOption.name).toBe("name"); + expect(commandBuilderRemoveSubcommandNameOption.description).toBe("The name of the command"); + expect(commandBuilderRemoveSubcommandNameOption.required).toBe(true); + }); }); describe('execute', () => { - test.todo("GIVEN interaction is not a chat input command, EXPECT nothing to happen"); + test("GIVEN interaction is not a chat input command, EXPECT nothing to happen", async () => { + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(false), + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; - test.todo("GIVEN subcommand is invalid, EXPECT error"); + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.isChatInputCommand).toHaveBeenCalledTimes(1); + expect(interaction.reply).not.toHaveBeenCalled(); + }); + + test("GIVEN subcommand is invalid, EXPECT error", async () => { + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("invalid"), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.options.getSubcommand).toHaveBeenCalledTimes(1); + + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("Subcommand not found."); + }); }); describe('add', () => { - test.todo("EXPECT command to be added to disabled list"); + test("EXPECT command to be added to disabled list", async () => { + // Arrange + const interaction = { + guildId: "guildId", + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("add"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; - test.todo("GIVEN interaction.guildId is null, EXPECT nothing to happen"); + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("otherCommand"); + SettingsHelper.SetSetting = jest.fn(); - test.todo("GIVEN commandName is null, EXPECT error"); + // Act + const command = new Command(); + await command.execute(interaction); - test.todo("GIVEN commandName.value is undefined, EXEPCT error"); + // Assert + expect(interaction.options.get).toHaveBeenCalledTimes(1); + expect(interaction.options.get).toHaveBeenCalledWith("name", true); - test.todo("GIVEN disabledCommandsString is empty, EXPECT empty disabledCommands array to be used"); + expect(SettingsHelper.GetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.GetSetting).toHaveBeenCalledWith("commands.disabled", "guildId"); + + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("commands.disabled", "guildId", "otherCommand,testCommand"); + + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("Disabled command testCommand"); + }); + + test("GIVEN interaction.guildId is null, EXPECT nothing to happen", async () => { + // Arrange + const interaction = { + guildId: null, + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("add"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("otherCommand"); + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.reply).not.toHaveBeenCalled(); + expect(SettingsHelper.SetSetting).not.toHaveBeenCalled(); + }); + + test("GIVEN disabledCommandsString is undefined, EXPECT empty disabledCommands array to be used", async () => { + // Arrange + const interaction = { + guildId: "guildId", + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("add"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue(undefined); + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("commands.disabled", "guildId", "testCommand"); + }); }); describe("remove", () => { - test.todo("EXPECT command to be removed from disabled list"); + test("EXPECT command to be removed from disabled list", async () => { + // Arrange + const interaction = { + guildId: "guildId", + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("remove"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; - test.todo("GIVEN interaction.guildId is null, EXPECT nothing to happen"); + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("otherCommand,testCommand"); + SettingsHelper.SetSetting = jest.fn(); - test.todo("GIVEN commandName is null, EXPECT error"); + // Act + const command = new Command(); + await command.execute(interaction); - test.todo("GIVEN commandName.value is undefined, EXPECT error"); + // Assert + expect(interaction.options.get).toHaveBeenCalledTimes(1); + expect(interaction.options.get).toHaveBeenCalledWith("name", true); - test.todo("GIVEN disabledCommandsString is empty, EXPECT empty disabledCommands array to be used"); + expect(SettingsHelper.GetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.GetSetting).toHaveBeenCalledWith("commands.disabled", "guildId"); - test.todo("GIVEN instance of commandName is not found in disabledCommands array, EXPECT it not to try to remove it"); + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("commands.disabled", "guildId", "otherCommand"); + + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("Enabled command testCommand"); + }); + + test("GIVEN interaction.guildId is null, EXPECT nothing to happen", async () => { + // Arrange + const interaction = { + guildId: null, + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("remove"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("otherCommand,testCommand"); + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.reply).not.toHaveBeenCalled(); + expect(SettingsHelper.SetSetting).not.toHaveBeenCalled(); + }); + + test("GIVEN disabledCommandsString is undefined, EXPECT empty disabledCommands array to be used", async () => { + // Arrange + const interaction = { + guildId: "guildId", + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("remove"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue(undefined); + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("commands.disabled", "guildId", ""); + }); + + test("GIVEN instance of commandName is not found in disabledCommands array, EXPECT it not to try to remove it", async () => { + // Arrange + const interaction = { + guildId: "guildId", + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("remove"), + get: jest.fn().mockReturnValue({ + value: "testCommand", + }), + }, + reply: jest.fn(), + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("otherCommand"); + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("commands.disabled", "guildId", "otherCommand"); + }); }); \ No newline at end of file