diff --git a/package-lock.json b/package-lock.json index 42629ac..8eb69ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1347,9 +1347,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -4838,11 +4838,11 @@ } }, "node_modules/jest-mock-extended": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.7.tgz", - "integrity": "sha512-7lsKdLFcW9B9l5NzZ66S/yTQ9k8rFtnwYdCNuRU/81fqDWicNDVhitTSPnrGmNeNm0xyw0JHexEOShrIKRCIRQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.6.tgz", + "integrity": "sha512-DJuEoFzio0loqdX8NIwkbE9dgIXNzaj//pefOQxGkoivohpxbSQeNHCAiXkDNA/fmM4EIJDoZnSibP4w3dUJ9g==", "dependencies": { - "ts-essentials": "^10.0.0" + "ts-essentials": "^9.4.2" }, "peerDependencies": { "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", @@ -8083,11 +8083,11 @@ } }, "node_modules/ts-essentials": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-10.0.0.tgz", - "integrity": "sha512-77FHNJEyysF9+1s4G6eejuA1lxw7uMchT3ZPy3CIbh7GIunffpshtM8pTe5G6N5dpOzNevqRHew859ceLWVBfw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.2.tgz", + "integrity": "sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==", "peerDependencies": { - "typescript": ">=4.5.0" + "typescript": ">=4.1.0" }, "peerDependenciesMeta": { "typescript": { diff --git a/src/commands/config.ts b/src/commands/config.ts index d5dc551..74a2a5e 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -70,7 +70,7 @@ export default class Config extends Command { await this.SendHelpText(interaction); break; case 'reset': - await this.ResetValue(interaction, server); + await this.ResetValue(interaction); break; case 'get': await this.GetValue(interaction); @@ -95,6 +95,8 @@ export default class Config extends Command { } private async GetValue(interaction: CommandInteraction) { + if (!interaction.guildId) return; + const key = interaction.options.get('key'); if (!key || !key.value) { @@ -102,7 +104,7 @@ export default class Config extends Command { return; } - const server = await Server.FetchOneById(Server, interaction.guildId!, [ + const server = await Server.FetchOneById(Server, interaction.guildId, [ "Settings", ]); @@ -126,7 +128,7 @@ export default class Config extends Command { } } - private async ResetValue(interaction: CommandInteraction, server: Server) { + private async ResetValue(interaction: CommandInteraction) { if (!interaction.guildId) return; const key = interaction.options.get('key'); @@ -136,6 +138,15 @@ export default class Config extends Command { return; } + const server = await Server.FetchOneById(Server, interaction.guildId, [ + "Settings", + ]); + + if (!server) { + await interaction.reply('Server not found.'); + return; + } + const setting = server.Settings.filter(x => x.Key == key.value)[0]; if (!setting) { diff --git a/tests/commands/config.test.ts b/tests/commands/config.test.ts index 0e0c5c3..b28a0b4 100644 --- a/tests/commands/config.test.ts +++ b/tests/commands/config.test.ts @@ -1,13 +1,6 @@ -import { ChatInputCommandInteraction, CommandInteraction, PermissionsBitField, SlashCommandBuilder, SlashCommandStringOption, SlashCommandSubcommandBuilder } from "discord.js"; +import { ChatInputCommandInteraction, PermissionsBitField, SlashCommandBuilder, SlashCommandStringOption, SlashCommandSubcommandBuilder } from "discord.js"; import Command from "../../src/commands/config"; import Server from "../../src/database/entities/Server"; -import fs from "fs"; -import EmbedColours from "../../src/constants/EmbedColours"; -import Setting from "../../src/database/entities/Setting"; - -beforeEach(() => { - process.cwd = jest.fn().mockReturnValue("/cwd"); -}); describe("constructor", () => { test("EXPECT properties to be set", () => { @@ -162,121 +155,20 @@ describe("execute", () => { }); describe("list", () => { - test("EXPECT help text to be sent", async () => { - let repliedWith: any; - - // Assert - const interaction = { - isChatInputCommand: jest.fn().mockReturnValue(true), - guildId: "guildId", - options: { - getSubcommand: jest.fn().mockReturnValue("list"), - }, - reply: jest.fn().mockImplementation((options: any) => { - repliedWith = options.embeds[0]; - }), - } as unknown as CommandInteraction; - - Server.FetchOneById = jest.fn().mockResolvedValue({}); - - const readFileSyncMock = jest.spyOn(fs, "readFileSync").mockReturnValue("Example config text"); - - // Act - const command = new Command(); - await command.execute(interaction); - - // Assert - expect(readFileSyncMock).toHaveBeenCalledTimes(1); - expect(readFileSyncMock).toHaveBeenCalledWith("/cwd/data/usage/config.txt"); - - expect(repliedWith).toBeDefined(); - expect(repliedWith.data.color).toBe(EmbedColours.Ok); - expect(repliedWith.data.title).toBe("Config"); - expect(repliedWith.data.description).toBe("Example config text"); - }); + test.todo("EXPECT help text to be sent"); }); describe("reset", () => { - test("EXPECT setting value to be set to default", async () => { - // Assert - const interaction = { - isChatInputCommand: jest.fn().mockReturnValue(true), - guildId: "guildId", - options: { - getSubcommand: jest.fn().mockReturnValue("reset"), - get: jest.fn().mockReturnValue({ - value: "test.key", - }), - }, - reply: jest.fn(), - } as unknown as CommandInteraction; + test.todo("EXPECT setting value to be set to default"); - Server.FetchOneById = jest.fn().mockResolvedValue({ - Settings: [ - { - Key: "test.key", - Value: "12345", - }, - ], - }); + test.todo("GIVEN interaction.guildId is null, EXPECT nothing to happen"); - Setting.Remove = jest.fn(); - - // Act - const command = new Command(); - await command.execute(interaction); - - // Assert - expect(interaction.options.get).toHaveBeenCalledTimes(1); - expect(interaction.options.get).toHaveBeenCalledWith("key"); - - expect(Server.FetchOneById).toHaveBeenCalledTimes(1); - expect(Server.FetchOneById).toHaveBeenCalledWith(Server, "guildId", [ "Settings" ]); - - expect(Setting.Remove).toHaveBeenCalledTimes(1); - expect(Setting.Remove).toHaveBeenCalledWith(Setting, { - Key: "test.key", - Value: "12345", - }); - - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("The setting has been reset to the default."); - }); - - test("GIVEN key is null, EXPECT error", async () => { - // Assert - const interaction = { - isChatInputCommand: jest.fn().mockReturnValue(true), - guildId: "guildId", - options: { - getSubcommand: jest.fn().mockReturnValue("reset"), - get: jest.fn().mockReturnValue(null), - }, - reply: jest.fn(), - } as unknown as CommandInteraction; - - Server.FetchOneById = jest.fn().mockResolvedValue({ - Settings: [ - { - Key: "test.key", - Value: "12345", - }, - ], - }); - - Setting.Remove = jest.fn(); - - // Act - const command = new Command(); - await command.execute(interaction); - - // Assert - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Fields are required."); - }); + test.todo("GIVEN key is null, EXPECT error"); test.todo("GIVEN key.value is undefined, EXPECT error"); + test.todo("GIVEN server is not found in database, EXPECT error"); + test.todo("GIVEN setting is not found, EXPECT error"); });