Compare commits

..

4 commits

Author SHA1 Message Date
7e625b232e Create clear command tests
All checks were successful
Test / build (push) Successful in 17s
2024-05-04 16:48:00 +01:00
6323398e48 Merge branch 'develop' into feature/258-fix-tests 2024-05-04 16:09:30 +01:00
f1c513bd16 Update actions/checkout action to v4 (#430)
All checks were successful
Deploy To Stage / build (push) Successful in 7s
Deploy To Stage / deploy (push) Successful in 16s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://github.com/actions/checkout) | action | major | `v2` -> `v4` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

### [`v4`](https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v414)

[Compare Source](https://github.com/actions/checkout/compare/v3...v4)

-   Disable `extensions.worktreeConfig` when disabling `sparse-checkout` by [@&#8203;jww3](https://github.com/jww3) in https://github.com/actions/checkout/pull/1692
-   Add dependabot config by [@&#8203;cory-miller](https://github.com/cory-miller) in https://github.com/actions/checkout/pull/1688
-   Bump the minor-actions-dependencies group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/actions/checkout/pull/1693
-   Bump word-wrap from 1.2.3 to 1.2.5 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/actions/checkout/pull/1643

### [`v3`](https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v360)

[Compare Source](https://github.com/actions/checkout/compare/v2...v3)

-   [Fix: Mark test scripts with Bash'isms to be run via Bash](https://github.com/actions/checkout/pull/1377)
-   [Add option to fetch tags even if fetch-depth > 0](https://github.com/actions/checkout/pull/579)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjAiLCJ1cGRhdGVkSW5WZXIiOiIzNy4wLjAiLCJ0YXJnZXRCcmFuY2giOiJkZXZlbG9wIn0=-->

Reviewed-on: #430
Co-authored-by: Renovate Bot <renovate@vylpes.com>
Co-committed-by: Renovate Bot <renovate@vylpes.com>
2024-04-29 17:51:22 +01:00
942fea12bf Update dependency minimatch to v9.0.4 (#422)
All checks were successful
Deploy To Stage / build (push) Successful in 7s
Deploy To Stage / deploy (push) Successful in 15s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [minimatch](https://github.com/isaacs/minimatch) | dependencies | patch | [`9.0.3` -> `9.0.4`](https://renovatebot.com/diffs/npm/minimatch/9.0.3/9.0.4) |

---

### Release Notes

<details>
<summary>isaacs/minimatch (minimatch)</summary>

### [`v9.0.4`](https://github.com/isaacs/minimatch/compare/v9.0.3...v9.0.4)

[Compare Source](https://github.com/isaacs/minimatch/compare/v9.0.3...v9.0.4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjAiLCJ1cGRhdGVkSW5WZXIiOiIzNy4wLjAiLCJ0YXJnZXRCcmFuY2giOiJkZXZlbG9wIn0=-->

Reviewed-on: #422
Co-authored-by: Renovate Bot <renovate@vylpes.com>
Co-committed-by: Renovate Bot <renovate@vylpes.com>
2024-04-29 17:50:11 +01:00
6 changed files with 209 additions and 16 deletions

View file

@ -12,7 +12,7 @@ jobs:
runs-on: node
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v1
with:

View file

@ -12,7 +12,7 @@ jobs:
runs-on: node
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v1
with:

View file

@ -14,7 +14,7 @@ jobs:
runs-on: node
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v1
with:

8
package-lock.json generated
View file

@ -17,7 +17,7 @@
"emoji-regex": "^10.0.0",
"jest": "^29.0.0",
"jest-mock-extended": "^3.0.0",
"minimatch": "9.0.3",
"minimatch": "9.0.4",
"mysql": "^2.18.1",
"random-bunny": "^2.1.6",
"ts-jest": "^29.0.0",
@ -5968,9 +5968,9 @@
}
},
"node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"version": "9.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dependencies": {
"brace-expansion": "^2.0.1"
},

View file

@ -35,7 +35,7 @@
"emoji-regex": "^10.0.0",
"jest": "^29.0.0",
"jest-mock-extended": "^3.0.0",
"minimatch": "9.0.3",
"minimatch": "9.0.4",
"mysql": "^2.18.1",
"random-bunny": "^2.1.6",
"ts-jest": "^29.0.0",

View file

@ -1,23 +1,216 @@
import { ChatInputCommandInteraction, PermissionsBitField, SlashCommandBuilder, SlashCommandNumberOption, TextChannel } from "discord.js";
import Command from "../../src/commands/clear";
beforeEach(() => {
process.env = {};
});
describe('Constructor', () => {
test.todo("EXPECT values to be set");
test("EXPECT values to be set", () => {
const command = new Command();
expect(command.CommandBuilder).toBeDefined();
const commandBuilder = command.CommandBuilder as SlashCommandBuilder;
expect(commandBuilder.name).toBe("clear");
expect(commandBuilder.description).toBe("Clears the channel of messages");
expect(commandBuilder.default_member_permissions).toBe(PermissionsBitField.Flags.ManageMessages.toString());
expect(commandBuilder.options.length).toBe(1);
const commandBuilderCountOption = commandBuilder.options[0] as SlashCommandNumberOption;
expect(commandBuilderCountOption.name).toBe("count");
expect(commandBuilderCountOption.description).toBe("The amount to delete");
expect(commandBuilderCountOption.required).toBe(true);
expect(commandBuilderCountOption.min_value).toBe(1);
expect(commandBuilderCountOption.max_value).toBe(100);
});
});
describe('Execute', () => {
test.todo("GIVEN input is valid, EXPECT messages to be cleared");
test("GIVEN input is valid, EXPECT messages to be cleared", async () => {
// Arrange
const channel = {
manageable: true,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
test.todo("GIVEN interaction is NOT a chat input command, EXPECT nothing to happen");
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(50),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
test.todo("GIVEN interaction.channel is null, EXPECT nothing to happen");
// Act
const command = new Command();
await command.execute(interaction);
test.todo("GIVEN totalClear input is NOT supplied, EXPECT invalid error");
// Assert
expect(interaction.isChatInputCommand).toHaveBeenCalledTimes(1);
test.todo("GIVEN totalClear is less than or equal to 0, EXPECT invalid error");
expect(interaction.options.getNumber).toHaveBeenCalledTimes(1);
expect(interaction.options.getNumber).toHaveBeenCalledWith("count");
test.todo("GIVEN totalClear is greater than 100, EXPECT invalid error");
expect(channel.bulkDelete).toHaveBeenCalledTimes(1);
expect(channel.bulkDelete).toHaveBeenCalledWith(50);
test.todo("GIVEN channel is NOT manageable, EXPECT insufficient permissions error");
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("50 message(s) were removed.");
});
test("GIVEN interaction is NOT a chat input command, EXPECT nothing to happen", async () => {
// Arrange
const channel = {
manageable: true,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(false),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(50),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).not.toHaveBeenCalled();
expect(channel.bulkDelete).not.toHaveBeenCalled();
});
test("GIVEN interaction.channel is null, EXPECT nothing to happen", async () => {
// Arrange
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: null,
options: {
getNumber: jest.fn().mockReturnValue(50),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).not.toHaveBeenCalled();
});
test("GIVEN totalClear input is NOT supplied, EXPECT invalid error", async () => {
// Arrange
const channel = {
manageable: true,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(null),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("Please specify an amount between 1 and 100.");
expect(channel.bulkDelete).not.toHaveBeenCalled();
});
test("GIVEN totalClear is less than or equal to 0, EXPECT invalid error", async () => {
// Arrange
const channel = {
manageable: true,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(0),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("Please specify an amount between 1 and 100.");
expect(channel.bulkDelete).not.toHaveBeenCalled();
});
test("GIVEN totalClear is greater than 100, EXPECT invalid error", async () => {
// Arrange
const channel = {
manageable: true,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(101),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("Please specify an amount between 1 and 100.");
expect(channel.bulkDelete).not.toHaveBeenCalled();
});
test("GIVEN channel is NOT manageable, EXPECT insufficient permissions error", async () => {
// Arrange
const channel = {
manageable: false,
bulkDelete: jest.fn(),
} as unknown as TextChannel;
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
channel: channel,
options: {
getNumber: jest.fn().mockReturnValue(50),
},
reply: jest.fn(),
} as unknown as ChatInputCommandInteraction;
// Act
const command = new Command();
await command.execute(interaction);
// Assert
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("Insufficient permissions. Please contact a moderator.");
expect(channel.bulkDelete).not.toHaveBeenCalled();
});
});