WIP: Create buy embed generate helper function
Some checks failed
Test / build (push) Failing after 35s

This commit is contained in:
Ethan Lane 2025-02-08 18:45:39 +00:00
parent 904842ae32
commit b2807adf4d
6 changed files with 95 additions and 18 deletions

View file

@ -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 ],

View file

@ -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 ],

View file

@ -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<ButtonBuilder>,
}> {
@ -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<ButtonBuilder>,
} | 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<ButtonBuilder>()
.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,
}
}
}

View file

@ -10,7 +10,7 @@ let interaction: ReturnType<typeof mock<ButtonInteraction>>;
beforeEach(() => {
jest.resetAllMocks();
(EffectHelper.GenerateEffectEmbed as jest.Mock).mockResolvedValue({
(EffectHelper.GenerateEffectListEmbed as jest.Mock).mockResolvedValue({
embed: mock<EmbedBuilder>(),
row: mock<ActionRowBuilder<ButtonBuilder>>(),
});
@ -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);
});

View file

@ -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");
});

View file

@ -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,