194 lines
No EOL
5.7 KiB
TypeScript
194 lines
No EOL
5.7 KiB
TypeScript
import { CommandInteraction, EmbedBuilder } from "discord.js";
|
|
import AddMoon from "../../../../src/commands/304276391837302787/moons/add";
|
|
import Moon from "../../../../src/database/entities/304276391837302787/Moon";
|
|
import UserSetting from "../../../../src/database/entities/UserSetting";
|
|
|
|
describe("GIVEN happy flow", () => {
|
|
let repliedWithEmbed: EmbedBuilder[] | undefined;
|
|
let savedMoon: Moon | undefined;
|
|
|
|
const interaction = {
|
|
reply: jest.fn((options: any) => {
|
|
repliedWithEmbed = options.embeds;
|
|
}),
|
|
options: {
|
|
get: jest.fn()
|
|
.mockReturnValueOnce({
|
|
value: "Test Description",
|
|
}),
|
|
},
|
|
user: {
|
|
id: "userId",
|
|
},
|
|
} as unknown as CommandInteraction;
|
|
|
|
const userSetting = {
|
|
Value: 1,
|
|
UpdateValue: jest.fn(),
|
|
Save: jest.fn(),
|
|
};
|
|
|
|
beforeAll(async () => {
|
|
Moon.FetchMoonCountByUserId = jest.fn().mockResolvedValue(1);
|
|
Moon.prototype.Save = jest.fn().mockImplementation((_, entity: Moon) => {
|
|
savedMoon = entity;
|
|
});
|
|
|
|
UserSetting.FetchOneByKey = jest.fn().mockResolvedValue(userSetting);
|
|
|
|
await AddMoon(interaction);
|
|
});
|
|
|
|
test("EXPECT description option to have been fetched", () => {
|
|
expect(interaction.options.get).toHaveBeenCalledTimes(1);
|
|
expect(interaction.options.get).toHaveBeenCalledWith("description", true);
|
|
});
|
|
|
|
test("EXPECT UserSetting to have been fetched", () => {
|
|
expect(UserSetting.FetchOneByKey).toHaveBeenCalledTimes(1);
|
|
expect(UserSetting.FetchOneByKey).toHaveBeenCalledWith("userId", "moons");
|
|
});
|
|
|
|
test("EXPECT moonCount to be updated +1", () => {
|
|
expect(userSetting.UpdateValue).toHaveBeenCalledTimes(1);
|
|
expect(userSetting.UpdateValue).toHaveBeenCalledWith("2");
|
|
});
|
|
|
|
test("EXPECT setting to be saved", () => {
|
|
expect(userSetting.Save).toHaveBeenCalledTimes(1);
|
|
expect(userSetting.Save).toHaveBeenCalledWith(UserSetting, userSetting);
|
|
});
|
|
|
|
test("EXPECT moon to be saved", () => {
|
|
expect(Moon.prototype.Save).toHaveBeenCalledTimes(1);
|
|
expect(Moon.prototype.Save).toHaveBeenCalledWith(Moon, expect.any(Moon));
|
|
|
|
expect(savedMoon).toBeDefined();
|
|
expect(savedMoon).toMatchSnapshot({
|
|
Id: expect.any(String),
|
|
WhenCreated: expect.any(Date),
|
|
WhenUpdated: expect.any(Date),
|
|
});
|
|
});
|
|
|
|
test("EXPECT embed to be replied", () => {
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(repliedWithEmbed).toBeDefined();
|
|
expect(repliedWithEmbed).toMatchSnapshot();
|
|
});
|
|
});
|
|
|
|
describe("GIVEN description is null", () => {
|
|
const interaction = {
|
|
reply: jest.fn(),
|
|
options: {
|
|
get: jest.fn().mockReturnValue({
|
|
value: null,
|
|
}),
|
|
},
|
|
} as unknown as CommandInteraction;
|
|
|
|
beforeEach(async () => {
|
|
await AddMoon(interaction);
|
|
});
|
|
|
|
test("EXPECT error replied", () => {
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
expect(interaction.reply).toHaveBeenCalledWith("Name must be less than 255 characters!");
|
|
});
|
|
});
|
|
|
|
describe("GIVEN description is greater than 255 characters", () => {
|
|
const optionGet = jest.fn();
|
|
|
|
const interaction = {
|
|
reply: jest.fn(),
|
|
options: {
|
|
get: optionGet,
|
|
},
|
|
} as unknown as CommandInteraction;
|
|
|
|
beforeEach(async () => {
|
|
let longString = "";
|
|
|
|
for (let i = 0; i < 30; i++) {
|
|
longString += "1234567890";
|
|
}
|
|
|
|
optionGet.mockReturnValue({
|
|
value: longString,
|
|
});
|
|
|
|
await AddMoon(interaction);
|
|
});
|
|
|
|
test("EXPECT error replied", () => {
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
expect(interaction.reply).toHaveBeenCalledWith("Name must be less than 255 characters!");
|
|
});
|
|
});
|
|
|
|
describe("GIVEN moon count setting exists", () => {
|
|
const moonSetting = {
|
|
Value: "1",
|
|
UpdateValue: jest.fn(),
|
|
Save: jest.fn(),
|
|
};
|
|
|
|
const interaction = {
|
|
reply: jest.fn(),
|
|
options: {
|
|
get: jest.fn().mockReturnValue({
|
|
value: "Test Description",
|
|
}),
|
|
},
|
|
user: {
|
|
id: "userId",
|
|
},
|
|
} as unknown as CommandInteraction;
|
|
|
|
beforeEach(async () => {
|
|
UserSetting.FetchOneByKey = jest.fn().mockResolvedValue(moonSetting);
|
|
|
|
await AddMoon(interaction);
|
|
});
|
|
|
|
test("EXPECT existing entity to be updated", () => {
|
|
expect(moonSetting.UpdateValue).toHaveBeenCalledTimes(1);
|
|
expect(moonSetting.UpdateValue).toHaveBeenCalledWith("2");
|
|
});
|
|
});
|
|
|
|
describe("GIVEN moon count setting does not exist", () => {
|
|
let savedSetting: UserSetting | undefined;
|
|
|
|
const interaction = {
|
|
reply: jest.fn(),
|
|
options: {
|
|
get: jest.fn().mockReturnValue({
|
|
value: "Test Description",
|
|
}),
|
|
},
|
|
user: {
|
|
id: "userId",
|
|
},
|
|
} as unknown as CommandInteraction;
|
|
|
|
beforeEach(async () => {
|
|
UserSetting.FetchOneByKey = jest.fn().mockResolvedValue(null);
|
|
UserSetting.prototype.Save = jest.fn().mockImplementation((_, setting: UserSetting) => {
|
|
savedSetting = setting;
|
|
});
|
|
|
|
await AddMoon(interaction);
|
|
});
|
|
|
|
test("EXPECT new entity to be created", () => {
|
|
// Expect the entity to have the new entity.
|
|
// Probably the best way we can really imply a new entity
|
|
// that I can think of
|
|
expect(savedSetting).toBeDefined();
|
|
expect(savedSetting?.Value).toBe("1");
|
|
});
|
|
}); |