mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
test(backend): remove duplicate and useless tests (#2820)
This commit is contained in:
1 parent
deac653a9e
commit
56e04e7b53
102 files changed
+10
-15831
No files matched your search
@@ -1,245 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {MAX_GROUP_DM_RECIPIENTS} from '@fluxer/constants/src/LimitConstants';
|
||||
import {
|
||||
ChannelOverwriteResponse,
|
||||
ChannelPartialResponse,
|
||||
ChannelResponse,
|
||||
} from '@fluxer/schema/src/domains/channel/ChannelSchemas';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('ChannelOverwriteResponse', () => {
|
||||
it('accepts valid channel overwrite', () => {
|
||||
const result = ChannelOverwriteResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 0,
|
||||
allow: '8',
|
||||
deny: '0',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.id).toBe('123456789012345678');
|
||||
expect(result.data.type).toBe(0);
|
||||
}
|
||||
});
|
||||
it('requires all fields', () => {
|
||||
const result = ChannelOverwriteResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 0,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires type to be integer', () => {
|
||||
const result = ChannelOverwriteResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 'role',
|
||||
allow: '8',
|
||||
deny: '0',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts member type (1)', () => {
|
||||
const result = ChannelOverwriteResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 1,
|
||||
allow: '8',
|
||||
deny: '0',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('ChannelResponse', () => {
|
||||
const validChannel = {
|
||||
id: '123456789012345678',
|
||||
type: 0,
|
||||
guild_id: '987654321098765432',
|
||||
name: 'general',
|
||||
topic: 'General discussion',
|
||||
position: 0,
|
||||
nsfw: false,
|
||||
rate_limit_per_user: 0,
|
||||
};
|
||||
it('accepts valid channel response', () => {
|
||||
const result = ChannelResponse.parse(validChannel);
|
||||
expect(result.id).toBe('123456789012345678');
|
||||
expect(result.name).toBe('general');
|
||||
});
|
||||
it('requires id and type', () => {
|
||||
const {id, ...channelWithoutId} = validChannel;
|
||||
const result = ChannelResponse.safeParse(channelWithoutId);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts DM channel without guild_id', () => {
|
||||
const dmChannel = {
|
||||
id: '123456789012345678',
|
||||
type: 1,
|
||||
recipients: [
|
||||
{
|
||||
id: '111111111111111111',
|
||||
username: 'testuser',
|
||||
discriminator: '0001',
|
||||
global_name: null,
|
||||
avatar: null,
|
||||
avatar_color: null,
|
||||
flags: 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
const result = ChannelResponse.safeParse(dmChannel);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts channel with permission_overwrites', () => {
|
||||
const channel = {
|
||||
...validChannel,
|
||||
permission_overwrites: [
|
||||
{id: '111111111111111111', type: 0, allow: '8', deny: '0'},
|
||||
{id: '222222222222222222', type: 1, allow: '0', deny: '2048'},
|
||||
],
|
||||
};
|
||||
const result = ChannelResponse.parse(channel);
|
||||
expect(result.permission_overwrites).toHaveLength(2);
|
||||
});
|
||||
it('accepts more permission_overwrites than the old response ceiling', () => {
|
||||
const channel = {
|
||||
...validChannel,
|
||||
permission_overwrites: Array.from({length: 501}, (_, index) => ({
|
||||
id: String(100000000000000000n + BigInt(index)),
|
||||
type: 0,
|
||||
allow: '8',
|
||||
deny: '0',
|
||||
})),
|
||||
};
|
||||
const result = ChannelResponse.parse(channel);
|
||||
expect(result.permission_overwrites).toHaveLength(501);
|
||||
});
|
||||
it('accepts voice channel properties', () => {
|
||||
const voiceChannel = {
|
||||
...validChannel,
|
||||
type: 2,
|
||||
bitrate: 64000,
|
||||
user_limit: 10,
|
||||
voice_connection_limit: 5,
|
||||
rtc_region: 'us-west',
|
||||
};
|
||||
const result = ChannelResponse.parse(voiceChannel);
|
||||
expect(result.bitrate).toBe(64000);
|
||||
expect(result.user_limit).toBe(10);
|
||||
expect(result.voice_connection_limit).toBe(5);
|
||||
});
|
||||
it('accepts null optional fields', () => {
|
||||
const channel = {
|
||||
...validChannel,
|
||||
topic: null,
|
||||
parent_id: null,
|
||||
last_message_id: null,
|
||||
last_pin_timestamp: null,
|
||||
};
|
||||
const result = ChannelResponse.safeParse(channel);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts channel with nicks', () => {
|
||||
const channel = {
|
||||
id: '123456789012345678',
|
||||
type: 3,
|
||||
nicks: {
|
||||
'111111111111111111': 'Friend 1',
|
||||
'222222222222222222': 'Friend 2',
|
||||
},
|
||||
};
|
||||
const result = ChannelResponse.parse(channel);
|
||||
expect(result.nicks).toBeDefined();
|
||||
});
|
||||
it('accepts valid last_pin_timestamp', () => {
|
||||
const channel = {
|
||||
...validChannel,
|
||||
last_pin_timestamp: '2024-01-15T12:30:00.000Z',
|
||||
};
|
||||
const result = ChannelResponse.safeParse(channel);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts valid url', () => {
|
||||
const channel = {
|
||||
...validChannel,
|
||||
url: 'https://example.com',
|
||||
};
|
||||
const result = ChannelResponse.safeParse(channel);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires type to be integer', () => {
|
||||
const channel = {...validChannel, type: 'text'};
|
||||
const result = ChannelResponse.safeParse(channel);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires position to be integer when present', () => {
|
||||
const channel = {...validChannel, position: 1.5};
|
||||
const result = ChannelResponse.safeParse(channel);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('ChannelPartialResponse', () => {
|
||||
it('accepts valid partial channel', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
name: 'general',
|
||||
type: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.id).toBe('123456789012345678');
|
||||
expect(result.data.name).toBe('general');
|
||||
}
|
||||
});
|
||||
it('requires id and type', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
name: 'general',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts null name', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
name: null,
|
||||
type: 1,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts DM channel with recipients', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 1,
|
||||
recipients: [{username: 'testuser'}],
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.recipients).toHaveLength(1);
|
||||
}
|
||||
});
|
||||
it('accepts channel without name or recipients', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts a full group DM with every recipient listed', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 3,
|
||||
recipients: Array.from({length: MAX_GROUP_DM_RECIPIENTS}, (_, index) => ({username: `user${index}`})),
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.recipients).toHaveLength(MAX_GROUP_DM_RECIPIENTS);
|
||||
}
|
||||
});
|
||||
it('rejects more recipients than a group DM can hold', () => {
|
||||
const result = ChannelPartialResponse.safeParse({
|
||||
id: '123456789012345678',
|
||||
type: 3,
|
||||
recipients: Array.from({length: MAX_GROUP_DM_RECIPIENTS + 1}, (_, index) => ({username: `user${index}`})),
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -1,323 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
EmbedAuthorResponse,
|
||||
EmbedFieldResponse,
|
||||
EmbedFooterResponse,
|
||||
EmbedMediaResponse,
|
||||
MessageEmbedResponse,
|
||||
} from '@fluxer/schema/src/domains/message/EmbedSchemas';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('EmbedAuthorResponse', () => {
|
||||
it('accepts valid author with name only', () => {
|
||||
const result = EmbedAuthorResponse.safeParse({
|
||||
name: 'Test Author',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.name).toBe('Test Author');
|
||||
}
|
||||
});
|
||||
it('accepts author with all fields', () => {
|
||||
const result = EmbedAuthorResponse.safeParse({
|
||||
name: 'Test Author',
|
||||
url: 'https://example.com',
|
||||
icon_url: 'https://example.com/icon.png',
|
||||
proxy_icon_url: 'https://proxy.example.com/icon.png',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.url).toBe('https://example.com');
|
||||
}
|
||||
});
|
||||
it('accepts null optional fields', () => {
|
||||
const result = EmbedAuthorResponse.safeParse({
|
||||
name: 'Test Author',
|
||||
url: null,
|
||||
icon_url: null,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires name', () => {
|
||||
const result = EmbedAuthorResponse.safeParse({
|
||||
url: 'https://example.com',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('EmbedFooterResponse', () => {
|
||||
it('accepts valid footer with text only', () => {
|
||||
const result = EmbedFooterResponse.safeParse({
|
||||
text: 'Footer text',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.text).toBe('Footer text');
|
||||
}
|
||||
});
|
||||
it('accepts footer with all fields', () => {
|
||||
const result = EmbedFooterResponse.safeParse({
|
||||
text: 'Footer text',
|
||||
icon_url: 'https://example.com/icon.png',
|
||||
proxy_icon_url: 'https://proxy.example.com/icon.png',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts null icon urls', () => {
|
||||
const result = EmbedFooterResponse.safeParse({
|
||||
text: 'Footer text',
|
||||
icon_url: null,
|
||||
proxy_icon_url: null,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires text', () => {
|
||||
const result = EmbedFooterResponse.safeParse({
|
||||
icon_url: 'https://example.com/icon.png',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('EmbedMediaResponse', () => {
|
||||
it('accepts valid media with url and flags', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
url: 'https://example.com/image.png',
|
||||
flags: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.url).toBe('https://example.com/image.png');
|
||||
}
|
||||
});
|
||||
it('accepts media with all fields', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
url: 'https://example.com/image.png',
|
||||
proxy_url: 'https://proxy.example.com/image.png',
|
||||
content_type: 'image/png',
|
||||
content_hash: 'abc123',
|
||||
width: 800,
|
||||
height: 600,
|
||||
description: 'An image',
|
||||
placeholder: 'placeholder-data',
|
||||
duration: 0,
|
||||
flags: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.width).toBe(800);
|
||||
expect(result.data.height).toBe(600);
|
||||
}
|
||||
});
|
||||
it('accepts null optional fields', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
url: 'https://example.com/image.png',
|
||||
proxy_url: null,
|
||||
content_type: null,
|
||||
content_hash: null,
|
||||
width: null,
|
||||
height: null,
|
||||
flags: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires url', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
flags: 0,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires flags', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
url: 'https://example.com/image.png',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires width and height to be integers', () => {
|
||||
const result = EmbedMediaResponse.safeParse({
|
||||
url: 'https://example.com/image.png',
|
||||
width: 800.5,
|
||||
height: 600,
|
||||
flags: 0,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('EmbedFieldResponse', () => {
|
||||
it('accepts valid field', () => {
|
||||
const result = EmbedFieldResponse.safeParse({
|
||||
name: 'Field Name',
|
||||
value: 'Field Value',
|
||||
inline: false,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.name).toBe('Field Name');
|
||||
expect(result.data.value).toBe('Field Value');
|
||||
}
|
||||
});
|
||||
it('accepts inline field', () => {
|
||||
const result = EmbedFieldResponse.safeParse({
|
||||
name: 'Field Name',
|
||||
value: 'Field Value',
|
||||
inline: true,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.inline).toBe(true);
|
||||
}
|
||||
});
|
||||
it('requires all fields', () => {
|
||||
const result = EmbedFieldResponse.safeParse({
|
||||
name: 'Field Name',
|
||||
value: 'Field Value',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires name', () => {
|
||||
const result = EmbedFieldResponse.safeParse({
|
||||
value: 'Field Value',
|
||||
inline: false,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires value', () => {
|
||||
const result = EmbedFieldResponse.safeParse({
|
||||
name: 'Field Name',
|
||||
inline: false,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('MessageEmbedResponse', () => {
|
||||
it('accepts valid embed with type only', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.type).toBe('rich');
|
||||
}
|
||||
});
|
||||
it('accepts full rich embed', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
url: 'https://example.com',
|
||||
title: 'Embed Title',
|
||||
color: 0xff5500,
|
||||
timestamp: '2024-01-15T12:30:00.000Z',
|
||||
description: 'This is a description',
|
||||
author: {
|
||||
name: 'Author Name',
|
||||
url: 'https://example.com/author',
|
||||
},
|
||||
image: {
|
||||
url: 'https://example.com/image.png',
|
||||
flags: 0,
|
||||
},
|
||||
thumbnail: {
|
||||
url: 'https://example.com/thumb.png',
|
||||
flags: 0,
|
||||
},
|
||||
footer: {
|
||||
text: 'Footer text',
|
||||
},
|
||||
fields: [
|
||||
{name: 'Field 1', value: 'Value 1', inline: false},
|
||||
{name: 'Field 2', value: 'Value 2', inline: true},
|
||||
],
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.title).toBe('Embed Title');
|
||||
expect(result.data.fields).toHaveLength(2);
|
||||
}
|
||||
});
|
||||
it('accepts video embed', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'video',
|
||||
url: 'https://example.com/video',
|
||||
video: {
|
||||
url: 'https://example.com/video.mp4',
|
||||
flags: 0,
|
||||
width: 1920,
|
||||
height: 1080,
|
||||
},
|
||||
provider: {
|
||||
name: 'Video Provider',
|
||||
},
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts audio embed', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'audio',
|
||||
audio: {
|
||||
url: 'https://example.com/audio.mp3',
|
||||
flags: 0,
|
||||
duration: 180,
|
||||
},
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts null optional fields', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
url: null,
|
||||
title: null,
|
||||
color: null,
|
||||
timestamp: null,
|
||||
description: null,
|
||||
author: null,
|
||||
image: null,
|
||||
thumbnail: null,
|
||||
footer: null,
|
||||
fields: null,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires type', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
title: 'Title without type',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts nsfw flag', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'image',
|
||||
nsfw: true,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.nsfw).toBe(true);
|
||||
}
|
||||
});
|
||||
it('accepts color as integer', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
color: 16711680,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.color).toBe(16711680);
|
||||
}
|
||||
});
|
||||
it('rejects non-integer color', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
color: 123.45,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts valid ISO timestamp', () => {
|
||||
const result = MessageEmbedResponse.safeParse({
|
||||
type: 'rich',
|
||||
timestamp: '2024-01-15T12:30:00Z',
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -1,247 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {GuildFeatures, GuildSplashCardAlignment} from '@fluxer/constants/src/GuildConstants';
|
||||
import {
|
||||
GuildPartialResponse,
|
||||
GuildResponse,
|
||||
GuildVanityURLResponse,
|
||||
} from '@fluxer/schema/src/domains/guild/GuildResponseSchemas';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('GuildResponse', () => {
|
||||
const validGuild = {
|
||||
id: '123456789012345678',
|
||||
name: 'Test Guild',
|
||||
icon: 'icon_hash',
|
||||
banner: 'banner_hash',
|
||||
banner_width: 1920,
|
||||
banner_height: 1080,
|
||||
splash: 'splash_hash',
|
||||
splash_width: 1920,
|
||||
splash_height: 1080,
|
||||
splash_card_alignment: GuildSplashCardAlignment.CENTER,
|
||||
embed_splash: 'embed_splash_hash',
|
||||
embed_splash_width: 800,
|
||||
embed_splash_height: 600,
|
||||
vanity_url_code: 'myserver',
|
||||
owner_id: '987654321098765432',
|
||||
system_channel_id: '111111111111111111',
|
||||
system_channel_flags: 0,
|
||||
rules_channel_id: '222222222222222222',
|
||||
afk_channel_id: '333333333333333333',
|
||||
afk_timeout: 300,
|
||||
features: [GuildFeatures.VERIFIED, GuildFeatures.VANITY_URL],
|
||||
verification_level: 2,
|
||||
mfa_level: 1,
|
||||
nsfw_level: 0,
|
||||
nsfw: false,
|
||||
content_warning_level: 0,
|
||||
content_warning_text: null,
|
||||
explicit_content_filter: 2,
|
||||
default_message_notifications: 1,
|
||||
disabled_operations: 0,
|
||||
message_history_cutoff: null,
|
||||
permissions: '8',
|
||||
};
|
||||
it('accepts valid guild response', () => {
|
||||
const result = GuildResponse.parse(validGuild);
|
||||
expect(result.id).toBe('123456789012345678');
|
||||
expect(result.name).toBe('Test Guild');
|
||||
});
|
||||
it('accepts guild with null optional fields', () => {
|
||||
const guild = {
|
||||
...validGuild,
|
||||
icon: null,
|
||||
banner: null,
|
||||
splash: null,
|
||||
vanity_url_code: null,
|
||||
system_channel_id: null,
|
||||
rules_channel_id: null,
|
||||
afk_channel_id: null,
|
||||
};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('rejects null permissions because the field is omitted when unavailable', () => {
|
||||
const guild = {...validGuild, permissions: null};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts all splash_card_alignment values', () => {
|
||||
for (const alignment of [
|
||||
GuildSplashCardAlignment.LEFT,
|
||||
GuildSplashCardAlignment.CENTER,
|
||||
GuildSplashCardAlignment.RIGHT,
|
||||
]) {
|
||||
const guild = {...validGuild, splash_card_alignment: alignment};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(true);
|
||||
}
|
||||
});
|
||||
it('rejects invalid splash_card_alignment', () => {
|
||||
const guild = {...validGuild, splash_card_alignment: 'invalid'};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('rejects missing required fields', () => {
|
||||
const {id, ...guildWithoutId} = validGuild;
|
||||
const result = GuildResponse.safeParse(guildWithoutId);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires owner_id', () => {
|
||||
const {owner_id, ...guildWithoutOwner} = validGuild;
|
||||
const result = GuildResponse.safeParse(guildWithoutOwner);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires name', () => {
|
||||
const {name, ...guildWithoutName} = validGuild;
|
||||
const result = GuildResponse.safeParse(guildWithoutName);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires features array', () => {
|
||||
const {features, ...guildWithoutFeatures} = validGuild;
|
||||
const result = GuildResponse.safeParse(guildWithoutFeatures);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts empty features array', () => {
|
||||
const guild = {...validGuild, features: []};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts RAID_DETECTED as a known guild feature', () => {
|
||||
const guild = {
|
||||
...validGuild,
|
||||
features: [GuildFeatures.RAID_DETECTED, GuildFeatures.VERIFIED],
|
||||
};
|
||||
const result = GuildResponse.parse(guild);
|
||||
expect(result.features).toEqual([GuildFeatures.RAID_DETECTED, GuildFeatures.VERIFIED]);
|
||||
});
|
||||
it('preserves unknown features in guild response', () => {
|
||||
const guild = {
|
||||
...validGuild,
|
||||
features: [GuildFeatures.VERIFIED, 'DISALLOW_UNCLAIMED_ACCOUNTS'],
|
||||
};
|
||||
const result = GuildResponse.parse(guild);
|
||||
expect(result.features).toEqual(['DISALLOW_UNCLAIMED_ACCOUNTS', GuildFeatures.VERIFIED]);
|
||||
});
|
||||
it('deduplicates and sorts guild features while preserving values', () => {
|
||||
const guild = {
|
||||
...validGuild,
|
||||
features: [GuildFeatures.VERIFIED, 'DISALLOW_UNCLAIMED_ACCOUNTS', GuildFeatures.VERIFIED],
|
||||
};
|
||||
const result = GuildResponse.parse(guild);
|
||||
expect(result.features).toEqual(['DISALLOW_UNCLAIMED_ACCOUNTS', GuildFeatures.VERIFIED]);
|
||||
});
|
||||
it('rejects non-integer system_channel_flags', () => {
|
||||
const guild = {...validGuild, system_channel_flags: 1.5};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('rejects non-integer verification_level', () => {
|
||||
const guild = {...validGuild, verification_level: 'high'};
|
||||
const result = GuildResponse.safeParse(guild);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('GuildPartialResponse', () => {
|
||||
const validPartialGuild = {
|
||||
id: '123456789012345678',
|
||||
name: 'Test Guild',
|
||||
icon: 'icon_hash',
|
||||
banner: 'banner_hash',
|
||||
banner_width: 1920,
|
||||
banner_height: 1080,
|
||||
splash: 'splash_hash',
|
||||
splash_width: 1920,
|
||||
splash_height: 1080,
|
||||
splash_card_alignment: GuildSplashCardAlignment.CENTER,
|
||||
embed_splash: 'embed_splash_hash',
|
||||
embed_splash_width: 800,
|
||||
embed_splash_height: 600,
|
||||
features: [GuildFeatures.VERIFIED],
|
||||
};
|
||||
it('accepts valid partial guild response', () => {
|
||||
const result = GuildPartialResponse.parse(validPartialGuild);
|
||||
expect(result.id).toBe('123456789012345678');
|
||||
expect(result.name).toBe('Test Guild');
|
||||
});
|
||||
it('accepts partial guild with null optional fields', () => {
|
||||
const guild = {
|
||||
...validPartialGuild,
|
||||
icon: null,
|
||||
banner: null,
|
||||
splash: null,
|
||||
embed_splash: null,
|
||||
};
|
||||
const result = GuildPartialResponse.safeParse(guild);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires id', () => {
|
||||
const {id, ...guildWithoutId} = validPartialGuild;
|
||||
const result = GuildPartialResponse.safeParse(guildWithoutId);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires name', () => {
|
||||
const {name, ...guildWithoutName} = validPartialGuild;
|
||||
const result = GuildPartialResponse.safeParse(guildWithoutName);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires features array', () => {
|
||||
const {features, ...guildWithoutFeatures} = validPartialGuild;
|
||||
const result = GuildPartialResponse.safeParse(guildWithoutFeatures);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('preserves unknown features in partial guild response', () => {
|
||||
const guild = {
|
||||
...validPartialGuild,
|
||||
features: [GuildFeatures.VERIFIED, 'DISALLOW_UNCLAIMED_ACCOUNTS'],
|
||||
};
|
||||
const result = GuildPartialResponse.parse(guild);
|
||||
expect(result.features).toEqual(['DISALLOW_UNCLAIMED_ACCOUNTS', GuildFeatures.VERIFIED]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('GuildVanityURLResponse', () => {
|
||||
it('accepts valid vanity URL response', () => {
|
||||
const result = GuildVanityURLResponse.safeParse({
|
||||
code: 'myserver',
|
||||
uses: 42,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.code).toBe('myserver');
|
||||
expect(result.data.uses).toBe(42);
|
||||
}
|
||||
});
|
||||
it('accepts null code', () => {
|
||||
const result = GuildVanityURLResponse.safeParse({
|
||||
code: null,
|
||||
uses: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.code).toBeNull();
|
||||
}
|
||||
});
|
||||
it('requires uses field', () => {
|
||||
const result = GuildVanityURLResponse.safeParse({
|
||||
code: 'myserver',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires uses to be integer', () => {
|
||||
const result = GuildVanityURLResponse.safeParse({
|
||||
code: 'myserver',
|
||||
uses: 1.5,
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts zero uses', () => {
|
||||
const result = GuildVanityURLResponse.safeParse({
|
||||
code: 'myserver',
|
||||
uses: 0,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -1,218 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
CustomStatusResponse,
|
||||
RelationshipResponse,
|
||||
UserPartialResponse,
|
||||
UserProfileFullResponse,
|
||||
} from '@fluxer/schema/src/domains/user/UserResponseSchemas';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('UserPartialResponse', () => {
|
||||
const validUser = {
|
||||
id: '123456789012345678',
|
||||
username: 'testuser',
|
||||
discriminator: '0001',
|
||||
global_name: 'Test User',
|
||||
avatar: 'avatar_hash',
|
||||
avatar_color: 0xff5500,
|
||||
flags: 0,
|
||||
};
|
||||
it('accepts valid user partial response', () => {
|
||||
const result = UserPartialResponse.parse(validUser);
|
||||
expect(result.id).toBe('123456789012345678');
|
||||
expect(result.username).toBe('testuser');
|
||||
});
|
||||
it('accepts null global_name and avatar', () => {
|
||||
const user = {
|
||||
...validUser,
|
||||
global_name: null,
|
||||
avatar: null,
|
||||
avatar_color: null,
|
||||
};
|
||||
const result = UserPartialResponse.safeParse(user);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts optional bot flag', () => {
|
||||
const user = {...validUser, bot: true};
|
||||
const result = UserPartialResponse.parse(user);
|
||||
expect(result.bot).toBe(true);
|
||||
});
|
||||
it('accepts optional system flag', () => {
|
||||
const user = {...validUser, system: true};
|
||||
const result = UserPartialResponse.parse(user);
|
||||
expect(result.system).toBe(true);
|
||||
});
|
||||
it('requires id', () => {
|
||||
const {id, ...userWithoutId} = validUser;
|
||||
const result = UserPartialResponse.safeParse(userWithoutId);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires username', () => {
|
||||
const {username, ...userWithoutUsername} = validUser;
|
||||
const result = UserPartialResponse.safeParse(userWithoutUsername);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires discriminator', () => {
|
||||
const {discriminator, ...userWithoutDiscriminator} = validUser;
|
||||
const result = UserPartialResponse.safeParse(userWithoutDiscriminator);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires flags', () => {
|
||||
const {flags, ...userWithoutFlags} = validUser;
|
||||
const result = UserPartialResponse.safeParse(userWithoutFlags);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('UserProfileFullResponse', () => {
|
||||
const user = {
|
||||
id: '123456789012345678',
|
||||
username: 'testuser',
|
||||
discriminator: '0001',
|
||||
global_name: 'Test User',
|
||||
avatar: null,
|
||||
avatar_color: null,
|
||||
flags: 0,
|
||||
};
|
||||
const profile = {
|
||||
user,
|
||||
user_profile: {
|
||||
bio: null,
|
||||
pronouns: null,
|
||||
banner: null,
|
||||
banner_color: null,
|
||||
accent_color: null,
|
||||
},
|
||||
guild_member_profile: null,
|
||||
timezone_offset: -240,
|
||||
};
|
||||
it('accepts negative timezone offsets', () => {
|
||||
const result = UserProfileFullResponse.safeParse(profile);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts null timezone offsets', () => {
|
||||
const result = UserProfileFullResponse.safeParse({...profile, timezone_offset: null});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('CustomStatusResponse', () => {
|
||||
it('accepts valid custom status', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
text: 'Working on a project',
|
||||
expires_at: '2024-01-15T18:00:00.000Z',
|
||||
emoji_id: '123456789012345678',
|
||||
emoji_name: 'custom_emoji',
|
||||
emoji_animated: false,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.text).toBe('Working on a project');
|
||||
}
|
||||
});
|
||||
it('accepts minimal custom status', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
emoji_animated: false,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts null optional fields', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
text: null,
|
||||
expires_at: null,
|
||||
emoji_id: null,
|
||||
emoji_name: null,
|
||||
emoji_animated: false,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts unicode emoji name', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
emoji_name: '\uD83D\uDE00',
|
||||
emoji_animated: false,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires emoji_animated', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
text: 'Hello',
|
||||
});
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts animated emoji', () => {
|
||||
const result = CustomStatusResponse.safeParse({
|
||||
emoji_id: '123456789012345678',
|
||||
emoji_name: 'animated_emoji',
|
||||
emoji_animated: true,
|
||||
});
|
||||
expect(result.success).toBe(true);
|
||||
if (result.success) {
|
||||
expect(result.data.emoji_animated).toBe(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('RelationshipResponse', () => {
|
||||
const validRelationship = {
|
||||
id: '123456789012345678',
|
||||
type: 1,
|
||||
user: {
|
||||
id: '987654321098765432',
|
||||
username: 'friend',
|
||||
discriminator: '0001',
|
||||
global_name: 'Friend',
|
||||
avatar: null,
|
||||
avatar_color: null,
|
||||
flags: 0,
|
||||
},
|
||||
nickname: 'Best Friend',
|
||||
share_voice_activity: true,
|
||||
friend_shares_voice_activity: true,
|
||||
};
|
||||
it('accepts valid relationship', () => {
|
||||
const result = RelationshipResponse.parse(validRelationship);
|
||||
expect(result.id).toBe('123456789012345678');
|
||||
expect(result.type).toBe(1);
|
||||
});
|
||||
it('accepts relationship with null nickname', () => {
|
||||
const relationship = {...validRelationship, nickname: null};
|
||||
const result = RelationshipResponse.safeParse(relationship);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('accepts relationship with since date', () => {
|
||||
const relationship = {...validRelationship, since: '2024-01-01T00:00:00.000Z'};
|
||||
const result = RelationshipResponse.safeParse(relationship);
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
it('requires id', () => {
|
||||
const {id, ...relationshipWithoutId} = validRelationship;
|
||||
const result = RelationshipResponse.safeParse(relationshipWithoutId);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires type', () => {
|
||||
const {type, ...relationshipWithoutType} = validRelationship;
|
||||
const result = RelationshipResponse.safeParse(relationshipWithoutType);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('requires user', () => {
|
||||
const {user, ...relationshipWithoutUser} = validRelationship;
|
||||
const result = RelationshipResponse.safeParse(relationshipWithoutUser);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('validates nested user object', () => {
|
||||
const relationship = {
|
||||
...validRelationship,
|
||||
user: {id: 'invalid'},
|
||||
};
|
||||
const result = RelationshipResponse.safeParse(relationship);
|
||||
expect(result.success).toBe(false);
|
||||
});
|
||||
it('accepts different relationship types', () => {
|
||||
for (const type of [1, 2, 3, 4]) {
|
||||
const relationship = {...validRelationship, type};
|
||||
const result = RelationshipResponse.safeParse(relationship);
|
||||
expect(result.success).toBe(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user