Skip to content

Commit e2e2f30

Browse files
committed
test(structures): add tests for AutoModeration structures
1 parent 334124e commit e2e2f30

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import {
2+
type APIAutoModerationAction,
3+
type APIAutoModerationActionMetadata,
4+
type APIAutoModerationRule,
5+
type APIAutoModerationRuleTriggerMetadata,
6+
AutoModerationActionType,
7+
AutoModerationRuleEventType,
8+
AutoModerationRuleTriggerType,
9+
} from 'discord-api-types/v10';
10+
import { describe, expect, test } from 'vitest';
11+
import {
12+
AutoModerationAction,
13+
AutoModerationActionMetadata,
14+
AutoModerationRule,
15+
AutoModerationRuleTriggerMetadata,
16+
} from '../src/automoderation/index.js';
17+
import { kPatch } from '../src/utils/symbols';
18+
19+
/**
20+
* For tests they should check
21+
*
22+
* correct values of all getters,
23+
* equality of the result of toJSON to the api data used to construct the structure,
24+
* expected return value of helper methods like url(), createdAt, flags, etc.
25+
* maybe for nullable fields patch() working as expected
26+
*/
27+
28+
const ruleTriggerMetadataData: APIAutoModerationRuleTriggerMetadata = {
29+
mention_total_limit: 5,
30+
};
31+
32+
const actionMetadataData: APIAutoModerationActionMetadata = {
33+
channel_id: '1',
34+
custom_message: 'go away.',
35+
};
36+
37+
const actions: APIAutoModerationAction[] = [
38+
{
39+
type: AutoModerationActionType.BlockMessage,
40+
metadata: actionMetadataData,
41+
},
42+
];
43+
44+
const ruleData: APIAutoModerationRule = {
45+
id: '1',
46+
guild_id: '2',
47+
name: 'ruleName',
48+
creator_id: '1',
49+
event_type: AutoModerationRuleEventType.MessageSend,
50+
trigger_metadata: ruleTriggerMetadataData,
51+
trigger_type: AutoModerationRuleTriggerType.MentionSpam,
52+
enabled: true,
53+
actions,
54+
exempt_channels: ['1'],
55+
exempt_roles: [],
56+
};
57+
58+
describe('AutoModerationRule structure', () => {
59+
const instance = new AutoModerationRule(ruleData);
60+
const data = ruleData;
61+
62+
test('correct value for all getters', () => {
63+
expect(instance.id).toBe(data.id);
64+
expect(instance.guildId).toBe(data.guild_id);
65+
expect(instance.name).toBe(data.name);
66+
expect(instance.creatorId).toBe(data.creator_id);
67+
expect(instance.eventType).toBe(data.event_type);
68+
expect(instance.enabled).toBe(data.enabled);
69+
});
70+
71+
test('toJSON() correctly mirrors API data', () => {
72+
expect(instance.toJSON()).toStrictEqual(data);
73+
});
74+
75+
test('Patching the AutoModerationRule works in place', () => {
76+
const patched = instance[kPatch]({
77+
exempt_channels: ['2'],
78+
exempt_roles: ['1', '2', '3'],
79+
});
80+
81+
expect(patched.toJSON()).not.toEqual(data);
82+
expect(instance.toJSON()).toEqual(patched.toJSON());
83+
});
84+
85+
describe('AutoModerationRuleTriggerMetadata sub-structure', () => {
86+
const instance = new AutoModerationRuleTriggerMetadata(ruleTriggerMetadataData);
87+
const data = ruleTriggerMetadataData;
88+
89+
test('getters return correct values', () => {
90+
expect(instance.allowList).toBe(data.allow_list);
91+
expect(instance.keywordFilter).toBe(data.keyword_filter);
92+
expect(instance.mentionRaidProtectionEnabled).toBe(data.mention_raid_protection_enabled);
93+
expect(instance.mentionTotalLimit).toBe(data.mention_total_limit);
94+
expect(instance.presets).toBe(data.presets);
95+
expect(instance.regexPatterns).toBe(data.regex_patterns);
96+
});
97+
98+
test('toJSON() returns expected API data', () => {
99+
expect(instance.toJSON()).toStrictEqual(data);
100+
});
101+
102+
test('patching the structure works in place', () => {
103+
const patched = instance[kPatch]({
104+
mention_total_limit: 10,
105+
});
106+
107+
expect(patched.mentionTotalLimit).toBe(patched.mentionTotalLimit);
108+
109+
expect(patched.toJSON()).toEqual(instance.toJSON());
110+
});
111+
});
112+
113+
describe('AutoModerationAction structure', () => {
114+
const instance = new AutoModerationAction(actions[0] as APIAutoModerationAction);
115+
const data = actions[0];
116+
117+
test('correct value for all getters', () => {
118+
expect(instance.type).toBe(data!.type);
119+
});
120+
121+
test('toJSON() returns expected API data', () => {
122+
expect(instance.toJSON()).toStrictEqual(data);
123+
});
124+
125+
test('patching the structure works in place', () => {
126+
const patched = instance[kPatch]({
127+
type: AutoModerationActionType.Timeout,
128+
});
129+
130+
expect(instance.type).toBe(patched.type);
131+
132+
expect(patched.toJSON()).toEqual(instance.toJSON());
133+
});
134+
});
135+
136+
describe('AutoModerationActionMetadata sub-structure', () => {
137+
const instance = new AutoModerationActionMetadata(actionMetadataData);
138+
const data = actionMetadataData;
139+
140+
test('all getters working as expected', () => {
141+
expect(instance.channelId).toBe(data.channel_id);
142+
expect(instance.customMessage).toBe(data.custom_message);
143+
expect(instance.durationSeconds).toBe(data.duration_seconds);
144+
});
145+
146+
test('toJSON() returns expected results', () => {
147+
expect(instance.toJSON()).toStrictEqual(data);
148+
});
149+
150+
test('patching the structure works in place', () => {
151+
const patched = instance[kPatch]({
152+
custom_message: 'noo come back',
153+
duration_seconds: 100,
154+
});
155+
156+
expect(patched.toJSON()).toStrictEqual(instance.toJSON());
157+
expect(patched.customMessage).toBe(instance.customMessage);
158+
expect(patched.durationSeconds).toBe(instance.durationSeconds);
159+
});
160+
});
161+
});

0 commit comments

Comments
 (0)