2024-03-27 12:51:51 +00:00
|
|
|
import { CommandInteraction, PermissionsBitField, SlashCommandBuilder, SlashCommandRoleOption } from "discord.js";
|
|
|
|
import Config from "../../../src/commands/Role/config";
|
|
|
|
import Role from "../../../src/database/entities/Role";
|
|
|
|
import Server from "../../../src/database/entities/Server";
|
|
|
|
|
2024-02-03 19:29:28 +00:00
|
|
|
describe('constructor', () => {
|
2024-03-27 12:51:51 +00:00
|
|
|
test('EXPECT properties to be set', () => {
|
|
|
|
const config = new Config();
|
|
|
|
|
|
|
|
expect(config.CommandBuilder).toBeDefined();
|
|
|
|
|
|
|
|
const commandBuilder = config.CommandBuilder as SlashCommandBuilder;
|
|
|
|
|
|
|
|
expect(commandBuilder.name).toBe("configrole");
|
|
|
|
expect(commandBuilder.description).toBe("Toggle your roles");
|
|
|
|
expect(commandBuilder.default_member_permissions).toBe(PermissionsBitField.Flags.ManageRoles.toString());
|
|
|
|
expect(commandBuilder.options.length).toBe(1);
|
|
|
|
|
|
|
|
const roleOption = commandBuilder.options[0] as SlashCommandRoleOption;
|
|
|
|
|
|
|
|
expect(roleOption.name).toBe("role");
|
|
|
|
expect(roleOption.description).toBe("The role name");
|
|
|
|
expect(roleOption.required).toBe(true);
|
|
|
|
});
|
2024-02-03 19:29:28 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
describe("execute", () => {
|
2024-03-27 12:51:51 +00:00
|
|
|
test("GIVEN role is marked as assignable, EXPECT role to be removed", async () => {
|
|
|
|
const role = {
|
|
|
|
role: {
|
|
|
|
id: "roleId",
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: {},
|
|
|
|
options: {
|
|
|
|
get: jest.fn().mockReturnValue(role),
|
|
|
|
},
|
|
|
|
reply: jest.fn(),
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
Role.FetchOneByRoleId = jest.fn().mockResolvedValue({});
|
|
|
|
Role.Remove = jest.fn();
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(Role.FetchOneByRoleId).toHaveBeenCalledTimes(1);
|
|
|
|
expect(Role.FetchOneByRoleId).toHaveBeenCalledWith("roleId");
|
|
|
|
|
|
|
|
expect(Role.Remove).toHaveBeenCalledTimes(1);
|
|
|
|
|
|
|
|
expect(interaction.options.get).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.options.get).toHaveBeenCalledWith("role");
|
|
|
|
|
|
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.reply).toHaveBeenCalledWith("Removed role from configuration.");
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN role is not marked as assignable, EXPECT role to be added", async () => {
|
|
|
|
let newRole: Role | undefined;
|
|
|
|
|
|
|
|
const role = {
|
|
|
|
role: {
|
|
|
|
id: "roleId",
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: {},
|
|
|
|
options: {
|
|
|
|
get: jest.fn().mockReturnValue(role),
|
|
|
|
},
|
|
|
|
reply: jest.fn(),
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
Role.FetchOneByRoleId = jest.fn().mockResolvedValue(null);
|
|
|
|
Role.prototype.SetServer = jest.fn();
|
|
|
|
Role.prototype.Save = jest.fn().mockImplementation((_, role) => {
|
|
|
|
newRole = role;
|
|
|
|
});
|
|
|
|
|
|
|
|
Server.FetchOneById = jest.fn().mockResolvedValue({});
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(Role.FetchOneByRoleId).toHaveBeenCalledTimes(1);
|
|
|
|
expect(Role.FetchOneByRoleId).toHaveBeenCalledWith("roleId");
|
|
|
|
|
|
|
|
expect(Role.prototype.SetServer).toHaveBeenCalledTimes(1);
|
|
|
|
|
|
|
|
expect(Role.prototype.Save).toHaveBeenCalledTimes(1);
|
|
|
|
expect(newRole).toBeDefined();
|
|
|
|
expect(newRole!.RoleId).toBe("roleId");
|
|
|
|
|
|
|
|
expect(interaction.options.get).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.options.get).toHaveBeenCalledWith("role");
|
|
|
|
|
|
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.reply).toHaveBeenCalledWith("Added role to configuration.");
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN interaction.guildId is null, EXPECT error", async () => {
|
|
|
|
const interaction = {
|
|
|
|
guildId: null,
|
|
|
|
options: {
|
|
|
|
get: jest.fn(),
|
|
|
|
}
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(interaction.options.get).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN interaction.guild is null, EXPECT error", async () => {
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: null,
|
|
|
|
options: {
|
|
|
|
get: jest.fn(),
|
|
|
|
}
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(interaction.options.get).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN interaction.member is null, EXPECT error", async () => {
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: null,
|
|
|
|
options: {
|
|
|
|
get: jest.fn(),
|
|
|
|
}
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(interaction.options.get).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN role is null, EXPECT error", async () => {
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: {},
|
|
|
|
options: {
|
|
|
|
get: jest.fn().mockReturnValue(null),
|
|
|
|
},
|
|
|
|
reply: jest.fn(),
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.reply).toHaveBeenCalledWith("Fields are required.");
|
|
|
|
});
|
|
|
|
|
|
|
|
test("GIVEN role.role is undefined, EXPECT error", async () => {
|
|
|
|
const role = {
|
|
|
|
role: null,
|
|
|
|
}
|
|
|
|
|
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: {},
|
|
|
|
options: {
|
|
|
|
get: jest.fn().mockReturnValue(role),
|
|
|
|
},
|
|
|
|
reply: jest.fn(),
|
|
|
|
} as unknown as CommandInteraction;
|
|
|
|
|
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
|
|
|
|
|
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.reply).toHaveBeenCalledWith("Fields are required.");
|
|
|
|
});
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
test("GIVEN server is not configured in the database, EXPECT error", async () => {
|
|
|
|
let newRole: Role | undefined;
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
const role = {
|
|
|
|
role: {
|
|
|
|
id: "roleId",
|
|
|
|
},
|
|
|
|
};
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
const interaction = {
|
|
|
|
guildId: "guildId",
|
|
|
|
guild: {},
|
|
|
|
member: {},
|
|
|
|
options: {
|
|
|
|
get: jest.fn().mockReturnValue(role),
|
|
|
|
},
|
|
|
|
reply: jest.fn(),
|
|
|
|
} as unknown as CommandInteraction;
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
Role.FetchOneByRoleId = jest.fn().mockResolvedValue(null);
|
|
|
|
Role.prototype.SetServer = jest.fn();
|
|
|
|
Role.prototype.Save = jest.fn().mockImplementation((_, role) => {
|
|
|
|
newRole = role;
|
|
|
|
});
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
Server.FetchOneById = jest.fn().mockResolvedValue(null);
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
const config = new Config();
|
|
|
|
await config.execute(interaction);
|
2024-02-03 19:29:28 +00:00
|
|
|
|
2024-03-27 12:51:51 +00:00
|
|
|
expect(interaction.reply).toHaveBeenCalledTimes(1);
|
|
|
|
expect(interaction.reply).toHaveBeenCalledWith("This server has not been setup.");
|
|
|
|
});
|
2024-02-03 19:29:28 +00:00
|
|
|
});
|