diff --git a/src/buttonEvents/Effects/List.ts b/src/buttonEvents/Effects/List.ts index 059623b..d86dfce 100644 --- a/src/buttonEvents/Effects/List.ts +++ b/src/buttonEvents/Effects/List.ts @@ -11,7 +11,7 @@ export default async function List(interaction: ButtonInteraction) { return; } - const result = await EffectHelper.GenerateEffectEmbed(interaction.user.id, page); + const result = await EffectHelper.GenerateEffectListEmbed(interaction.user.id, page); await interaction.update({ embeds: [ result.embed ], diff --git a/src/commands/effects/List.ts b/src/commands/effects/List.ts index cc91321..14e6085 100644 --- a/src/commands/effects/List.ts +++ b/src/commands/effects/List.ts @@ -6,7 +6,7 @@ export default async function List(interaction: CommandInteraction) { const page = !isNaN(Number(pageOption?.value)) ? Number(pageOption?.value) : 1; - const result = await EffectHelper.GenerateEffectEmbed(interaction.user.id, page); + const result = await EffectHelper.GenerateEffectListEmbed(interaction.user.id, page); await interaction.reply({ embeds: [ result.embed ], diff --git a/src/helpers/EffectHelper.ts b/src/helpers/EffectHelper.ts index 6c38cac..235ea08 100644 --- a/src/helpers/EffectHelper.ts +++ b/src/helpers/EffectHelper.ts @@ -2,6 +2,9 @@ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "disc import UserEffect from "../database/entities/app/UserEffect"; import EmbedColours from "../constants/EmbedColours"; import { EffectDetails } from "../constants/EffectDetails"; +import User from "../database/entities/app/User"; +import CardConstants from "../constants/CardConstants"; +import AppLogger from "../client/appLogger"; export default class EffectHelper { public static async AddEffectToUserInventory(userId: string, name: string, quantity: number = 1) { @@ -66,7 +69,7 @@ export default class EffectHelper { return true; } - public static async GenerateEffectEmbed(userId: string, page: number): Promise<{ + public static async GenerateEffectListEmbed(userId: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder, }> { @@ -126,4 +129,66 @@ export default class EffectHelper { row, }; } + + public static async GenerateEffectBuyEmbed(userId: string, id: string, quantity: number, disabled: boolean): Promise<{ + embed: EmbedBuilder, + row: ActionRowBuilder, + } | string> { + const effectDetail = EffectDetails.get(id); + + if (!effectDetail) { + return "Effect detail not found!"; + } + + const totalCost = effectDetail.cost * quantity; + + let user = await User.FetchOneById(User, userId); + + if (!user) { + user = new User(userId, CardConstants.StartingCurrency); + await user.Save(User, user); + + AppLogger.LogInfo("EffectHelper", `Created initial user entity for : ${userId}`); + } + + if (user.Currency < totalCost) { + return `You don't have enough currency to buy this! You have \`${user.Currency} Currency\` and need \`${totalCost} Currency\`!`; + } + + const embed = new EmbedBuilder() + .setTitle("Buy Effect") + .setDescription(effectDetail.friendlyName) + .setColor(EmbedColours.Ok) + .addFields([ + { + name: "Cost", + value: `${totalCost}`, + inline: true, + }, + { + name: "Quantity", + value: `${quantity}`, + inline: true, + }, + ]); + + const row = new ActionRowBuilder() + .addComponents([ + new ButtonBuilder() + .setCustomId(`effects buy confirm ${id} ${quantity}`) + .setLabel("Confirm") + .setStyle(ButtonStyle.Success) + .setDisabled(disabled), + new ButtonBuilder() + .setCustomId(`effects buy cancel ${id} ${quantity}`) + .setLabel("Cancel") + .setStyle(ButtonStyle.Danger) + .setDisabled(disabled), + ]); + + return { + embed, + row, + } + } } diff --git a/tests/buttonEvents/Effects/List.test.ts b/tests/buttonEvents/Effects/List.test.ts index 52fa550..5b42c61 100644 --- a/tests/buttonEvents/Effects/List.test.ts +++ b/tests/buttonEvents/Effects/List.test.ts @@ -10,7 +10,7 @@ let interaction: ReturnType>; beforeEach(() => { jest.resetAllMocks(); - (EffectHelper.GenerateEffectEmbed as jest.Mock).mockResolvedValue({ + (EffectHelper.GenerateEffectListEmbed as jest.Mock).mockResolvedValue({ embed: mock(), row: mock>(), }); @@ -31,7 +31,7 @@ test("GIVEN pageOption is NOT a number, EXPECT error", async () => { expect(interaction.reply).toHaveBeenCalledTimes(1); expect(interaction.reply).toHaveBeenCalledWith("Page option is not a valid number") - expect(EffectHelper.GenerateEffectEmbed).not.toHaveBeenCalled(); + expect(EffectHelper.GenerateEffectListEmbed).not.toHaveBeenCalled(); expect(interaction.update).not.toHaveBeenCalled(); }); @@ -43,8 +43,8 @@ test("GIVEN pageOption is a number, EXPECT interaction updated", async () => { await List(interaction); // Assert - expect(EffectHelper.GenerateEffectEmbed).toHaveBeenCalledTimes(1); - expect(EffectHelper.GenerateEffectEmbed).toHaveBeenCalledWith("userId", 1); + expect(EffectHelper.GenerateEffectListEmbed).toHaveBeenCalledTimes(1); + expect(EffectHelper.GenerateEffectListEmbed).toHaveBeenCalledWith("userId", 1); expect(interaction.update).toHaveBeenCalledTimes(1); }); \ No newline at end of file diff --git a/tests/helpers/EffectHelper.test.ts b/tests/helpers/EffectHelper.test.ts index b0dd12d..dcab744 100644 --- a/tests/helpers/EffectHelper.test.ts +++ b/tests/helpers/EffectHelper.test.ts @@ -3,7 +3,7 @@ import UserEffect from "../../src/database/entities/app/UserEffect"; jest.mock("../../src/database/entities/app/UserEffect"); -describe("GenerateEffectEmbed", () => { +describe("GenerateEffectListEmbed", () => { test("GIVEN user has an effect, EXPECT detailed embed to be returned", async () => { // Arrange (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ @@ -17,7 +17,7 @@ describe("GenerateEffectEmbed", () => { ]); // Act - const result = await EffectHelper.GenerateEffectEmbed("userId", 1); + const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); // Assert expect(result).toMatchSnapshot(); @@ -43,7 +43,7 @@ describe("GenerateEffectEmbed", () => { ]); // Act - const result = await EffectHelper.GenerateEffectEmbed("userId", 1); + const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); // Assert expect(result).toMatchSnapshot(); @@ -69,7 +69,7 @@ describe("GenerateEffectEmbed", () => { ]); // Act - const result = await EffectHelper.GenerateEffectEmbed("userId", 2); + const result = await EffectHelper.GenerateEffectListEmbed("userId", 2); // Assert expect(result).toMatchSnapshot(); @@ -83,7 +83,7 @@ describe("GenerateEffectEmbed", () => { ]); // Act - const result = await EffectHelper.GenerateEffectEmbed("userId", 1); + const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); // Assert expect(result).toMatchSnapshot(); @@ -107,9 +107,21 @@ describe("GenerateEffectEmbed", () => { }); // Act - const result = await EffectHelper.GenerateEffectEmbed("userId", 1); + const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); // Assert expect(result).toMatchSnapshot(); }); +}); + +describe("GenerateEffectBuyEmbed", () => { + test.todo("GIVEN Effect Details are not found, EXPECT error"); + + test.todo("GIVEN user is not in database, EXPECT blank user created"); + + test.todo("GIVEN user does not have enough currency, EXPECT error"); + + test.todo("GIVEN user does have enough currency, EXPECT embed returned"); + + test.todo("GIVEN disabled boolean is true, EXPECT buttons to be disabled"); }); \ No newline at end of file diff --git a/tests/helpers/__snapshots__/EffectHelper.test.ts.snap b/tests/helpers/__snapshots__/EffectHelper.test.ts.snap index f6e5e8e..fc3317e 100644 --- a/tests/helpers/__snapshots__/EffectHelper.test.ts.snap +++ b/tests/helpers/__snapshots__/EffectHelper.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`GenerateEffectEmbed GIVEN there is an active effect, EXPECT field added 1`] = ` +exports[`GenerateEffectListEmbed GIVEN there is an active effect, EXPECT field added 1`] = ` { "embed": { "color": 3166394, @@ -47,7 +47,7 @@ exports[`GenerateEffectEmbed GIVEN there is an active effect, EXPECT field added } `; -exports[`GenerateEffectEmbed GIVEN user does NOT have an effect, EXPECT empty embed to be returned 1`] = ` +exports[`GenerateEffectListEmbed GIVEN user does NOT have an effect, EXPECT empty embed to be returned 1`] = ` { "embed": { "color": 3166394, @@ -82,7 +82,7 @@ exports[`GenerateEffectEmbed GIVEN user does NOT have an effect, EXPECT empty em } `; -exports[`GenerateEffectEmbed GIVEN user has an effect, EXPECT detailed embed to be returned 1`] = ` +exports[`GenerateEffectListEmbed GIVEN user has an effect, EXPECT detailed embed to be returned 1`] = ` { "embed": { "color": 3166394, @@ -117,7 +117,7 @@ exports[`GenerateEffectEmbed GIVEN user has an effect, EXPECT detailed embed to } `; -exports[`GenerateEffectEmbed GIVEN user has more than 1 page of effects, EXPECT pagination enabled 1`] = ` +exports[`GenerateEffectListEmbed GIVEN user has more than 1 page of effects, EXPECT pagination enabled 1`] = ` { "embed": { "color": 3166394, @@ -166,7 +166,7 @@ Unclaimed Chance Up x1", } `; -exports[`GenerateEffectEmbed GIVEN user is on a page other than 1, EXPECT pagination enabled 1`] = ` +exports[`GenerateEffectListEmbed GIVEN user is on a page other than 1, EXPECT pagination enabled 1`] = ` { "embed": { "color": 3166394,