From 7ebec080af05c139290c4099236eee11bd9b02b7 Mon Sep 17 00:00:00 2001 From: H01001000 Date: Sun, 25 Dec 2022 20:45:58 +0800 Subject: [PATCH] fix: automode rule helpers and test --- .../guilds/automod/createAutomodRule.ts | 10 +- .../guilds/automod/deleteAutomodRule.ts | 1 - .../helpers/guilds/automod/editAutomodRule.ts | 10 +- .../helpers/guilds/automod/getAutomodRule.ts | 15 +- .../helpers/guilds/automod/getAutomodRules.ts | 15 +- packages/rest/tests/e2e/automod.spec.ts | 279 ++++++++++++++++++ 6 files changed, 307 insertions(+), 23 deletions(-) create mode 100644 packages/rest/tests/e2e/automod.spec.ts diff --git a/packages/rest/src/helpers/guilds/automod/createAutomodRule.ts b/packages/rest/src/helpers/guilds/automod/createAutomodRule.ts index c737162c7..518b16bda 100644 --- a/packages/rest/src/helpers/guilds/automod/createAutomodRule.ts +++ b/packages/rest/src/helpers/guilds/automod/createAutomodRule.ts @@ -1,16 +1,17 @@ import { routes } from '@discordeno/constant' +import TRANSFORMERS from '@discordeno/transformer' import type { AutoModerationActionType, AutoModerationEventTypes, AutoModerationTriggerTypes, BigString, + Camelize, DiscordAutoModerationRule, DiscordAutoModerationRuleTriggerMetadataPresets, DiscordCreateAutomoderationRule, WithReason } from '@discordeno/types' import type { RestManager } from '../../../restManager.js' -import type { AutoModerationRule } from '../../../transformers/automodRule.js' /** * Creates an automod rule in a guild. @@ -18,7 +19,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js' * @param rest - The rest manager to use to make the request. * @param guildId - The ID of the guild to create the rule in. * @param options - The parameters for the creation of the rule. - * @returns An instance of the created {@link AutoModerationRule}. + * @returns An instance of the created {@link DiscordAutoModerationRule}. * * @remarks * Requires the `MANAGE_GUILD` permission. @@ -31,9 +32,8 @@ export async function createAutomodRule ( rest: RestManager, guildId: BigString, options: CreateAutoModerationRuleOptions -): Promise { +): Promise> { const result = await rest.runMethod( - 'POST', routes.AUTOMOD_RULES(guildId), { @@ -62,7 +62,7 @@ export async function createAutomodRule ( } as DiscordCreateAutomoderationRule ) - return rest.transformers.automodRule(rest, result) + return TRANSFORMERS.automodRule(result) } export interface CreateAutoModerationRuleOptions extends WithReason { diff --git a/packages/rest/src/helpers/guilds/automod/deleteAutomodRule.ts b/packages/rest/src/helpers/guilds/automod/deleteAutomodRule.ts index a727447d3..946c3a37d 100644 --- a/packages/rest/src/helpers/guilds/automod/deleteAutomodRule.ts +++ b/packages/rest/src/helpers/guilds/automod/deleteAutomodRule.ts @@ -23,7 +23,6 @@ export async function deleteAutomodRule ( reason?: string ): Promise { return await rest.runMethod( - 'DELETE', routes.AUTOMOD_RULE(guildId, ruleId), { reason } diff --git a/packages/rest/src/helpers/guilds/automod/editAutomodRule.ts b/packages/rest/src/helpers/guilds/automod/editAutomodRule.ts index 3296e3c1f..7769d20a1 100644 --- a/packages/rest/src/helpers/guilds/automod/editAutomodRule.ts +++ b/packages/rest/src/helpers/guilds/automod/editAutomodRule.ts @@ -1,15 +1,16 @@ import { routes } from '@discordeno/constant' +import TRANSFORMERS from '@discordeno/transformer' import type { AutoModerationActionType, AutoModerationEventTypes, BigString, + Camelize, DiscordAutoModerationRule, DiscordAutoModerationRuleTriggerMetadataPresets, DiscordModifyAutomoderationRule, WithReason } from '@discordeno/types' import type { RestManager } from '../../../restManager.js' -import type { AutoModerationRule } from '../../../transformers/automodRule.js' /** * Edits an automod rule. @@ -18,7 +19,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js' * @param guildId - The ID of the guild to edit the rule in. * @param ruleId - The ID of the rule to edit. * @param options - The parameters for the edit of the rule. - * @returns An instance of the edited {@link AutoModerationRule}. + * @returns An instance of the edited {@link DiscordAutoModerationRule}. * * @remarks * Requires the `MANAGE_GUILD` permission. @@ -32,9 +33,8 @@ export async function editAutomodRule ( guildId: BigString, ruleId: BigString, options: Partial -): Promise { +): Promise> { const result = await rest.runMethod( - 'PATCH', routes.AUTOMOD_RULE(guildId, ruleId), { @@ -62,7 +62,7 @@ export async function editAutomodRule ( } as DiscordModifyAutomoderationRule ) - return rest.transformers.automodRule(rest, result) + return TRANSFORMERS.automodRule(result) } export interface EditAutoModerationRuleOptions extends WithReason { diff --git a/packages/rest/src/helpers/guilds/automod/getAutomodRule.ts b/packages/rest/src/helpers/guilds/automod/getAutomodRule.ts index 253a7abba..743e27c83 100644 --- a/packages/rest/src/helpers/guilds/automod/getAutomodRule.ts +++ b/packages/rest/src/helpers/guilds/automod/getAutomodRule.ts @@ -1,7 +1,11 @@ import { routes } from '@discordeno/constant' -import type { BigString, DiscordAutoModerationRule } from '@discordeno/types' +import TRANSFORMERS from '@discordeno/transformer' +import type { + BigString, + Camelize, + DiscordAutoModerationRule +} from '@discordeno/types' import type { RestManager } from '../../../restManager.js' -import type { AutoModerationRule } from '../../../transformers/automodRule.js' /** * Gets an automod rule by its ID. @@ -9,7 +13,7 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js' * @param rest - The rest manager to use to make the request. * @param guildId - The ID of the guild to get the rule of. * @param ruleId - The ID of the rule to get. - * @returns An instance of {@link AutoModerationRule}. + * @returns An instance of {@link DiscordAutoModerationRule}. * * @remarks * Requires the `MANAGE_GUILD` permission. @@ -20,12 +24,11 @@ export async function getAutomodRule ( rest: RestManager, guildId: BigString, ruleId: BigString -): Promise { +): Promise> { const result = await rest.runMethod( - 'GET', routes.AUTOMOD_RULE(guildId, ruleId) ) - return rest.transformers.automodRule(rest, result) + return TRANSFORMERS.automodRule(result) } diff --git a/packages/rest/src/helpers/guilds/automod/getAutomodRules.ts b/packages/rest/src/helpers/guilds/automod/getAutomodRules.ts index 5faaece8d..c2b7105e6 100644 --- a/packages/rest/src/helpers/guilds/automod/getAutomodRules.ts +++ b/packages/rest/src/helpers/guilds/automod/getAutomodRules.ts @@ -1,15 +1,19 @@ import { routes } from '@discordeno/constant' -import type { BigString, DiscordAutoModerationRule } from '@discordeno/types' +import TRANSFORMERS from '@discordeno/transformer' +import type { + BigString, + Camelize, + DiscordAutoModerationRule +} from '@discordeno/types' import { Collection } from '@discordeno/utils' import type { RestManager } from '../../../restManager.js' -import type { AutoModerationRule } from '../../../transformers/automodRule.js' /** * Gets the list of automod rules for a guild. * * @param rest - The rest manager to use to make the request. * @param guildId - The ID of the guild to get the rules from. - * @returns A collection of {@link AutoModerationRule} objects assorted by rule ID. + * @returns A collection of {@link DiscordAutoModerationRule} objects assorted by rule ID. * * @remarks * Requires the `MANAGE_GUILD` permission. @@ -19,16 +23,15 @@ import type { AutoModerationRule } from '../../../transformers/automodRule.js' export async function getAutomodRules ( rest: RestManager, guildId: BigString -): Promise> { +): Promise>> { const results = await rest.runMethod( - 'GET', routes.AUTOMOD_RULES(guildId) ) return new Collection( results.map((result) => { - const rule = rest.transformers.automodRule(rest, result) + const rule = TRANSFORMERS.automodRule(result) return [rule.id, rule] }) ) diff --git a/packages/rest/tests/e2e/automod.spec.ts b/packages/rest/tests/e2e/automod.spec.ts new file mode 100644 index 000000000..812135984 --- /dev/null +++ b/packages/rest/tests/e2e/automod.spec.ts @@ -0,0 +1,279 @@ +import { + AutoModerationActionType, + AutoModerationEventTypes, + AutoModerationTriggerTypes +} from '@discordeno/types' +import { expect } from 'chai' +import { CACHED_COMMUNITY_GUILD_ID, rest } from './utils.js' + +describe('[automod] Run automod tests', async () => { + it('[automod] Create a MessageSend rule for Keyword with BlockMessage action.', async () => { + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.BlockMessage + } + ] + }) + + expect(rule.id).to.be.exist + + const fetchedRule = await rest.getAutomodRule( + CACHED_COMMUNITY_GUILD_ID, + rule.id + ) + + expect(fetchedRule.id).to.be.exist + expect(fetchedRule.name).to.equal(rule.name) + expect(fetchedRule.eventType).to.equal( + AutoModerationEventTypes.MessageSend + ) + expect(fetchedRule.triggerType).to.equal( + AutoModerationTriggerTypes.Keyword + ) + expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal( + 'iblamewolf' + ) + expect(fetchedRule.actions).to.be.exist + expect(fetchedRule.actions[0]).to.be.exist + expect(fetchedRule.actions[0].type).to.equal( + AutoModerationActionType.BlockMessage + ) + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + }) + + it('[automod] Create a MessageSend rule for Keyword with SendAlertMessage action.', async () => { + const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, { + name: 'test' + }) + expect(channel.id).to.be.exist + + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.SendAlertMessage, + metadata: { + channelId: channel.id + } + } + ] + }) + + expect(rule.id).to.be.exist + + const fetchedRule = await rest.getAutomodRule( + CACHED_COMMUNITY_GUILD_ID, + rule.id + ) + + expect(fetchedRule.id).to.be.exist + expect(fetchedRule.name).to.equal(rule.name) + expect(fetchedRule.eventType).to.equal( + AutoModerationEventTypes.MessageSend + ) + expect(fetchedRule.triggerType).to.equal( + AutoModerationTriggerTypes.Keyword + ) + expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal( + 'iblamewolf' + ) + expect(fetchedRule.actions).to.be.exist + expect(fetchedRule.actions[0]).to.be.exist + expect(fetchedRule.actions[0].type).to.equal( + AutoModerationActionType.SendAlertMessage + ) + expect(fetchedRule.actions[0].metadata?.channelId).to.equal(channel.id) + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + await rest.deleteChannel(channel.id) + }) + + it('[automod] Create a MessageSend rule for Keyword with Timeout action.', async () => { + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.Timeout, + metadata: { + durationSeconds: 10 + } + } + ] + }) + + expect(rule.id).to.be.exist + + const fetchedRule = await rest.getAutomodRule( + CACHED_COMMUNITY_GUILD_ID, + rule.id + ) + + expect(fetchedRule.id).to.be.exist + expect(fetchedRule.name).to.equal(rule.name) + expect(fetchedRule.eventType).to.equal( + AutoModerationEventTypes.MessageSend + ) + expect(fetchedRule.triggerType).to.equal( + AutoModerationTriggerTypes.Keyword + ) + expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal( + 'iblamewolf' + ) + expect(fetchedRule.actions).to.be.exist + expect(fetchedRule.actions[0]).to.be.exist + expect(fetchedRule.actions[0].type).to.equal( + AutoModerationActionType.Timeout + ) + expect(fetchedRule.actions[0].metadata?.durationSeconds).to.equal(10) + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + }) + + it('[automod] Create a MessageSend rule for Keyword with BlockMessage & Timeout action.', async () => { + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.BlockMessage + }, + { + type: AutoModerationActionType.Timeout, + metadata: { + durationSeconds: 10 + } + } + ] + }) + + expect(rule.id).to.be.exist + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + }) + + it('[automod] Create a MessageSend rule for Keyword with SendAlertMessage & Timeout action.', async () => { + const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, { + name: 'test' + }) + expect(channel.id).to.be.exist + + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.SendAlertMessage, + metadata: { + channelId: channel.id + } + }, + { + type: AutoModerationActionType.Timeout, + metadata: { + durationSeconds: 10 + } + } + ] + }) + + expect(rule.id).to.be.exist + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + await rest.deleteChannel(channel.id) + }) + + it('[automod] Create a MessageSend rule for Keyword with BlockMessage & SendAlertMessage & Timeout action.', async () => { + const channel = await rest.createChannel(CACHED_COMMUNITY_GUILD_ID, { + name: 'test' + }) + + const rule = await rest.createAutomodRule(CACHED_COMMUNITY_GUILD_ID, { + name: 'test', + eventType: AutoModerationEventTypes.MessageSend, + triggerType: AutoModerationTriggerTypes.Keyword, + triggerMetadata: { + keywordFilter: ['iblamewolf'] + }, + actions: [ + { + type: AutoModerationActionType.BlockMessage + }, + { + type: AutoModerationActionType.SendAlertMessage, + metadata: { + channelId: channel.id + } + }, + { + type: AutoModerationActionType.Timeout, + metadata: { + durationSeconds: 10 + } + } + ] + }) + + expect(rule.id).to.be.exist + + // Get the rule again to make sure it was created correctly + const fetchedRule = await rest.getAutomodRule( + CACHED_COMMUNITY_GUILD_ID, + rule.id + ) + expect(fetchedRule.id).to.be.exist + expect(fetchedRule.name).to.equal(rule.name) + expect(fetchedRule.eventType).to.equal( + AutoModerationEventTypes.MessageSend + ) + expect(fetchedRule.triggerType).to.equal( + AutoModerationTriggerTypes.Keyword + ) + expect(fetchedRule.triggerMetadata?.keywordFilter?.[0]).to.equal( + 'iblamewolf' + ) + expect(fetchedRule.actions).to.be.exist + expect(fetchedRule.actions[0]).to.be.exist + expect(fetchedRule.actions[1].metadata).to.be.exist + expect(fetchedRule.actions[2].metadata).to.be.exist + expect(fetchedRule.actions[1].metadata.channelId).to.equal(channel.id) + expect(fetchedRule.actions[2].metadata.durationSeconds).to.equal(10) + expect(fetchedRule.actions[0].type).to.equal( + AutoModerationActionType.BlockMessage + ) + expect(fetchedRule.actions[1].type).to.equal( + AutoModerationActionType.SendAlertMessage + ) + expect(fetchedRule.actions[2].type).to.equal( + AutoModerationActionType.Timeout + ) + + await rest.deleteAutomodRule(CACHED_COMMUNITY_GUILD_ID, rule.id) + await rest.deleteChannel(channel.id) + }) +})