From fa7e35b4ddc8e1fea4ad4061a86c8b4e4e81fd99 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Mon, 6 May 2024 10:24:04 +0100 Subject: [PATCH] Create code command tests --- tests/commands/code.test.ts | 254 ++++++++++++++++++++++++++++++++++-- 1 file changed, 245 insertions(+), 9 deletions(-) diff --git a/tests/commands/code.test.ts b/tests/commands/code.test.ts index a94dc5b..3315c9d 100644 --- a/tests/commands/code.test.ts +++ b/tests/commands/code.test.ts @@ -1,25 +1,261 @@ +import { APIEmbed, APIVersion, ChatInputCommandInteraction, CommandInteraction, SlashCommandBuilder, SlashCommandSubcommandBuilder } from "discord.js"; +import Command from "../../src/commands/code"; +import StringTools from "../../src/helpers/StringTools"; +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("code"); + expect(commandBuilder.description).toBe("Manage the verification code of the server"); + expect(commandBuilder.options.length).toBe(2); + + const commandBuilderRandomiseSubcommand = commandBuilder.options[0] as SlashCommandSubcommandBuilder; + + expect(commandBuilderRandomiseSubcommand.name).toBe("randomise"); + expect(commandBuilderRandomiseSubcommand.description).toBe("Regenerates the verification code for this server"); + + const commandBuilderEmbedSubcommand = commandBuilder.options[1] as SlashCommandSubcommandBuilder; + + expect(commandBuilderEmbedSubcommand.name).toBe("embed"); + expect(commandBuilderEmbedSubcommand.description).toBe("Sends the embed with the current code to the current channel"); + }); }); 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 () => { + // Assert + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(false), + reply: jest.fn(), + } as unknown as CommandInteraction; + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.isChatInputCommand).toHaveBeenCalledTimes(1); + expect(interaction.reply).not.toHaveBeenCalled(); + }); }); describe("randomise", () => { - test.todo("EXPECT entry code to be randomised"); + test("EXPECT entry code to be randomised", async () => { + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("randomise"), + }, + reply: jest.fn(), + guildId: "guildId", + } as unknown as ChatInputCommandInteraction; - test.todo("GIVEN interaction.guildId is null, EXPECT nothing to happen"); + StringTools.RandomString = jest.fn().mockReturnValue("12345"); + + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.isChatInputCommand).toHaveBeenCalledTimes(1); + expect(interaction.options.getSubcommand).toHaveBeenCalledTimes(1); + + expect(StringTools.RandomString).toHaveBeenCalledTimes(1); + expect(StringTools.RandomString).toHaveBeenCalledWith(5); + + expect(SettingsHelper.SetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.SetSetting).toHaveBeenCalledWith("verification.code", "guildId", "12345"); + + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("Entry code has been set to `12345`"); + }); + + test("GIVEN interaction.guildId is null, EXPECT nothing to happen", async () => { + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("randomise"), + }, + reply: jest.fn(), + guildId: null, + } as unknown as ChatInputCommandInteraction; + + StringTools.RandomString = jest.fn().mockReturnValue("12345"); + + SettingsHelper.SetSetting = jest.fn(); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.reply).not.toHaveBeenCalled(); + expect(SettingsHelper.SetSetting).not.toHaveBeenCalled(); + expect(StringTools.RandomString).not.toHaveBeenCalled(); + }); }); describe("embed", () => { - test.todo("EXPECT embed to be sent"); + test("EXPECT embed to be sent", async () => { + let repliedWithEmbed: any; - test.todo("GIVEN interaction.guildId is null, EXPECT nothing to happen"); + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("embed"), + }, + reply: jest.fn(), + guildId: "guildId", + channel: { + send: jest.fn().mockImplementation((options: any) => { + repliedWithEmbed = options.embeds[0]; + }), + }, + } as unknown as ChatInputCommandInteraction; - test.todo("GIVEN interaction.channel is null, EXPECT nothing to happen"); + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("12345"); - test.todo("GIVEN verification.code setting is null, EXPECT error"); + // Act + const command = new Command(); + await command.execute(interaction); - test.todo("GIVEN verification.code setting is empty, EXPECT error"); + // Assert + expect(interaction.isChatInputCommand).toHaveBeenCalledTimes(1); + expect(interaction.options.getSubcommand).toHaveBeenCalledTimes(1); + + expect(SettingsHelper.GetSetting).toHaveBeenCalledTimes(1); + expect(SettingsHelper.GetSetting).toHaveBeenCalledWith("verification.code", "guildId"); + + expect(interaction.channel!.send).toHaveBeenCalledTimes(1); + + expect(repliedWithEmbed).toBeDefined(); + expect(repliedWithEmbed.data.title).toBe("Entry Code"); + expect(repliedWithEmbed.data.description).toBe("12345"); + }); + + test("GIVEN interaction.guildId is null, EXPECT nothing to happen", async () => { + let repliedWithEmbed: any; + + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("embed"), + }, + reply: jest.fn(), + guildId: null, + channel: { + send: jest.fn().mockImplementation((options: any) => { + repliedWithEmbed = options.embeds[0]; + }), + }, + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("12345"); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.channel!.send).not.toHaveBeenCalled(); + expect(SettingsHelper.GetSetting).not.toHaveBeenCalled(); + + expect(repliedWithEmbed).toBeUndefined(); + }); + + test("GIVEN interaction.channel is null, EXPECT nothing to happen", async () => { + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("embed"), + }, + reply: jest.fn(), + guildId: "guildId", + channel: null, + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue("12345"); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(SettingsHelper.GetSetting).not.toHaveBeenCalled(); + }); + + test("GIVEN verification.code setting is undefined, EXPECT error", async () => { + let repliedWithEmbed: any; + + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("embed"), + }, + reply: jest.fn(), + guildId: "guildId", + channel: { + send: jest.fn().mockImplementation((options: any) => { + repliedWithEmbed = options.embeds[0]; + }), + }, + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue(undefined); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("There is no code for this server setup."); + + expect(interaction.channel! .send).not.toHaveBeenCalled(); + }); + + test("GIVEN verification.code setting is empty, EXPECT error", async () => { + let repliedWithEmbed: any; + + // Arrange + const interaction = { + isChatInputCommand: jest.fn().mockReturnValue(true), + options: { + getSubcommand: jest.fn().mockReturnValue("embed"), + }, + reply: jest.fn(), + guildId: "guildId", + channel: { + send: jest.fn().mockImplementation((options: any) => { + repliedWithEmbed = options.embeds[0]; + }), + }, + } as unknown as ChatInputCommandInteraction; + + SettingsHelper.GetSetting = jest.fn().mockResolvedValue(""); + + // Act + const command = new Command(); + await command.execute(interaction); + + // Assert + expect(interaction.reply).toHaveBeenCalledTimes(1); + expect(interaction.reply).toHaveBeenCalledWith("There is no code for this server setup."); + + expect(interaction.channel!.send).not.toHaveBeenCalled(); + }); }); \ No newline at end of file