mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
chore(repo): remove dead code and useless tests (#3375)
This commit is contained in:
1 parent
7e177a1c90
commit
1cd62eb661
1391 files changed
+783
-120415
No files matched your search
@@ -1,146 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
ASSET_FORMAT_POLICY,
|
||||
formatAssetUploadExtensions,
|
||||
formatKnownAnimatedAssetExtensions,
|
||||
getAcceptString,
|
||||
getUploadExtensions,
|
||||
isExtensionAllowed,
|
||||
} from '@fluxer/constants/src/AssetFormatPolicy';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('AssetFormatPolicy', () => {
|
||||
describe('ASSET_FORMAT_POLICY', () => {
|
||||
it('exposes an entry for every documented asset kind', () => {
|
||||
expect(Object.keys(ASSET_FORMAT_POLICY).sort()).toEqual(
|
||||
['attachment', 'avatar', 'banner', 'embed_splash', 'emoji', 'guild_icon', 'splash', 'sticker'].sort(),
|
||||
);
|
||||
});
|
||||
it('keeps animated-only assets out of static-only kinds', () => {
|
||||
for (const kind of ['splash', 'embed_splash'] as const) {
|
||||
const entry = ASSET_FORMAT_POLICY[kind];
|
||||
expect(entry.animated).toBe('never');
|
||||
expect(entry.upload).not.toContain('gif');
|
||||
expect(entry.upload).not.toContain('apng');
|
||||
}
|
||||
});
|
||||
it('includes HEIC/JXL/AVIF on avatar uploads (iPhone + modern web)', () => {
|
||||
expect(ASSET_FORMAT_POLICY.avatar.upload).toEqual(
|
||||
expect.arrayContaining(['heic', 'heif', 'jxl', 'avif', 'apng']),
|
||||
);
|
||||
});
|
||||
it('limits sticker uploads to the historical sticker set plus jpeg and svg', () => {
|
||||
expect([...ASSET_FORMAT_POLICY.sticker.upload].sort()).toEqual([
|
||||
'apng',
|
||||
'avif',
|
||||
'gif',
|
||||
'jpeg',
|
||||
'png',
|
||||
'svg',
|
||||
'webp',
|
||||
]);
|
||||
});
|
||||
it('accepts svg uploads on every image asset kind', () => {
|
||||
for (const kind of [
|
||||
'avatar',
|
||||
'guild_icon',
|
||||
'banner',
|
||||
'splash',
|
||||
'embed_splash',
|
||||
'emoji',
|
||||
'sticker',
|
||||
'attachment',
|
||||
] as const) {
|
||||
expect(ASSET_FORMAT_POLICY[kind].upload).toContain('svg');
|
||||
expect(ASSET_FORMAT_POLICY[kind].mimes.svg).toBe('image/svg+xml');
|
||||
}
|
||||
});
|
||||
it('has a mime entry for every accepted extension', () => {
|
||||
for (const entry of Object.values(ASSET_FORMAT_POLICY)) {
|
||||
for (const ext of entry.upload) {
|
||||
expect(entry.mimes[ext]).toMatch(/^image\//);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
describe('getAcceptString', () => {
|
||||
it('returns extensions and MIMEs joined by commas', () => {
|
||||
const accept = getAcceptString('avatar');
|
||||
expect(accept).toContain('.png');
|
||||
expect(accept).toContain('image/png');
|
||||
expect(accept).toContain('.heic');
|
||||
expect(accept).toContain('image/heic');
|
||||
expect(accept).toContain('.jxl');
|
||||
});
|
||||
it('does not include image/* wildcard (we want strict negotiation)', () => {
|
||||
expect(getAcceptString('emoji')).not.toContain('image/*');
|
||||
});
|
||||
it('can filter extension-only animated formats when animation is unavailable', () => {
|
||||
const accept = getAcceptString('guild_icon', {animatedAllowed: false});
|
||||
expect(accept).not.toContain('.gif');
|
||||
expect(accept).not.toContain('image/gif');
|
||||
expect(accept).not.toContain('.apng');
|
||||
expect(accept).not.toContain('image/apng');
|
||||
expect(accept).toContain('.svg');
|
||||
expect(accept).toContain('image/svg+xml');
|
||||
expect(accept).toContain('.avif');
|
||||
expect(accept).toContain('image/avif');
|
||||
});
|
||||
});
|
||||
describe('getUploadExtensions', () => {
|
||||
it('returns the full backend upload policy by default', () => {
|
||||
expect(getUploadExtensions('avatar')).toEqual([
|
||||
'png',
|
||||
'jpeg',
|
||||
'webp',
|
||||
'gif',
|
||||
'apng',
|
||||
'avif',
|
||||
'heic',
|
||||
'heif',
|
||||
'jxl',
|
||||
'svg',
|
||||
]);
|
||||
});
|
||||
it('keeps static-capable expanded formats when filtering animation-only extensions', () => {
|
||||
expect(getUploadExtensions('avatar', {animatedAllowed: false})).toEqual([
|
||||
'png',
|
||||
'jpeg',
|
||||
'webp',
|
||||
'avif',
|
||||
'heic',
|
||||
'heif',
|
||||
'jxl',
|
||||
'svg',
|
||||
]);
|
||||
});
|
||||
});
|
||||
describe('formatAssetUploadExtensions', () => {
|
||||
it('formats user-facing labels from the upload policy', () => {
|
||||
expect(formatAssetUploadExtensions('avatar')).toBe('PNG, JPEG, WebP, GIF, APNG, AVIF, HEIC, HEIF, JXL, SVG');
|
||||
});
|
||||
it('supports extension-style labels for API validation details', () => {
|
||||
expect(formatAssetUploadExtensions('avatar', {labelStyle: 'extension'})).toBe(
|
||||
'png, jpeg, webp, gif, apng, avif, heic, heif, jxl, svg',
|
||||
);
|
||||
});
|
||||
});
|
||||
describe('formatKnownAnimatedAssetExtensions', () => {
|
||||
it('lists animated formats that are accepted as animated assets', () => {
|
||||
expect(formatKnownAnimatedAssetExtensions('avatar')).toBe('GIF, APNG, WebP');
|
||||
});
|
||||
});
|
||||
describe('isExtensionAllowed', () => {
|
||||
it('accepts both raw and dot-prefixed extensions', () => {
|
||||
expect(isExtensionAllowed('avatar', 'png')).toBe(true);
|
||||
expect(isExtensionAllowed('avatar', '.png')).toBe(true);
|
||||
expect(isExtensionAllowed('avatar', 'PNG')).toBe(true);
|
||||
expect(isExtensionAllowed('avatar', 'jpg')).toBe(true);
|
||||
});
|
||||
it('rejects extensions not in the upload list', () => {
|
||||
expect(isExtensionAllowed('splash', 'gif')).toBe(false);
|
||||
expect(isExtensionAllowed('emoji', 'mp4' as never)).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,46 +1,11 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
ANNOUNCEMENT_CONVERTIBLE_CHANNEL_TYPES,
|
||||
CHANNEL_FOLLOW_TARGET_TYPES,
|
||||
ChannelTypes,
|
||||
GUILD_TEXT_BASED_CHANNEL_TYPES,
|
||||
isMessageTypeDeletable,
|
||||
MessageFlags,
|
||||
MessageTypes,
|
||||
SENDABLE_MESSAGE_FLAGS,
|
||||
TEXT_BASED_CHANNEL_TYPES,
|
||||
WebhookTypes,
|
||||
} from '@fluxer/constants/src/ChannelConstants';
|
||||
import {MessageFlags, SENDABLE_MESSAGE_FLAGS} from '@fluxer/constants/src/ChannelConstants';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
|
||||
describe('announcement channel constants', () => {
|
||||
it('treats announcement channels as guild text-based channels', () => {
|
||||
expect(GUILD_TEXT_BASED_CHANNEL_TYPES.has(ChannelTypes.GUILD_ANNOUNCEMENT)).toBe(true);
|
||||
expect(TEXT_BASED_CHANNEL_TYPES.has(ChannelTypes.GUILD_ANNOUNCEMENT)).toBe(true);
|
||||
});
|
||||
|
||||
it('converts only between text and announcement channels', () => {
|
||||
expect([...ANNOUNCEMENT_CONVERTIBLE_CHANNEL_TYPES].sort()).toEqual([
|
||||
ChannelTypes.GUILD_TEXT,
|
||||
ChannelTypes.GUILD_ANNOUNCEMENT,
|
||||
]);
|
||||
});
|
||||
|
||||
it('lets follows post only into text channels', () => {
|
||||
expect([...CHANNEL_FOLLOW_TARGET_TYPES]).toEqual([ChannelTypes.GUILD_TEXT]);
|
||||
});
|
||||
|
||||
it('lets members delete channel follow system messages', () => {
|
||||
expect(isMessageTypeDeletable(MessageTypes.CHANNEL_FOLLOW_ADD)).toBe(true);
|
||||
});
|
||||
|
||||
it('keeps the crosspost flags out of the sendable flags', () => {
|
||||
const crosspostFlags = MessageFlags.CROSSPOSTED | MessageFlags.IS_CROSSPOST | MessageFlags.SOURCE_MESSAGE_DELETED;
|
||||
expect(crosspostFlags & SENDABLE_MESSAGE_FLAGS).toBe(0);
|
||||
});
|
||||
|
||||
it('names both webhook types', () => {
|
||||
expect(WebhookTypes).toEqual({INCOMING: 1, CHANNEL_FOLLOWER: 2});
|
||||
});
|
||||
});
|
||||
@@ -1,19 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
entranceSoundExtensionFromFormat,
|
||||
entranceSoundExtensionFromMime,
|
||||
} from '@fluxer/constants/src/EntranceSoundConstants';
|
||||
import {describe, expect, test} from 'vitest';
|
||||
|
||||
describe('entrance sound format detection', () => {
|
||||
test('accepts wav metadata produced by the in-app trimmer', () => {
|
||||
expect(entranceSoundExtensionFromFormat('wav')).toBe('wav');
|
||||
expect(entranceSoundExtensionFromMime('audio/wav')).toBe('wav');
|
||||
});
|
||||
|
||||
test('accepts common ffprobe compound format names', () => {
|
||||
expect(entranceSoundExtensionFromFormat('mp3,mp2,mp1')).toBe('mp3');
|
||||
expect(entranceSoundExtensionFromFormat('mov,mp4,m4a,3gp,3g2,mj2')).toBe('m4a');
|
||||
});
|
||||
});
|
||||
@@ -6,7 +6,6 @@ import {
|
||||
formatRecoveryKeyInput,
|
||||
generateRecoveryKey,
|
||||
normalizeRecoveryKey,
|
||||
RECOVERY_KEY_FORMATTED_LENGTH,
|
||||
RECOVERY_KEY_LENGTH,
|
||||
} from '@fluxer/constants/src/RecoveryKeyUtils';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
@@ -34,7 +33,7 @@ describe('generateRecoveryKey', () => {
|
||||
it('returns the raw key and its display form', () => {
|
||||
const {key, formatted} = generateRecoveryKey(new Uint8Array(20).fill(0xa5));
|
||||
expect(key).toHaveLength(RECOVERY_KEY_LENGTH);
|
||||
expect(formatted).toHaveLength(RECOVERY_KEY_FORMATTED_LENGTH);
|
||||
expect(formatted).toHaveLength(39);
|
||||
expect(formatted.split('-')).toHaveLength(8);
|
||||
expect(formatted.replaceAll('-', '')).toBe(key);
|
||||
expect(normalizeRecoveryKey(formatted)).toBe(key);
|
||||
|
||||
@@ -5,7 +5,6 @@ export const RECOVERY_KEY_BYTE_LENGTH = 20;
|
||||
export const RECOVERY_KEY_LENGTH = 32;
|
||||
const RECOVERY_KEY_GROUP_SIZE = 4;
|
||||
export const RECOVERY_KEY_SEPARATOR = '-';
|
||||
export const RECOVERY_KEY_FORMATTED_LENGTH = RECOVERY_KEY_LENGTH + RECOVERY_KEY_LENGTH / RECOVERY_KEY_GROUP_SIZE - 1;
|
||||
|
||||
const RECOVERY_KEY_ALIASES: Readonly<Record<string, string>> = {
|
||||
O: '0',
|
||||
|
||||
@@ -15,7 +15,6 @@ import {
|
||||
canViewThread,
|
||||
DEFAULT_THREAD_PERMISSIONS,
|
||||
isThreadModerator,
|
||||
messageSendPermissionFor,
|
||||
THREAD_AWARE_ALL_PERMISSIONS,
|
||||
THREAD_PERMISSIONS,
|
||||
type ThreadActorContext,
|
||||
@@ -156,15 +155,4 @@ describe('thread permission bits', () => {
|
||||
Permissions.SEND_MESSAGES,
|
||||
);
|
||||
});
|
||||
|
||||
it('picks the send bit by channel type', () => {
|
||||
expect(messageSendPermissionFor(ChannelTypes.ANNOUNCEMENT_THREAD)).toBe(
|
||||
ThreadPermissionFlags.SEND_MESSAGES_IN_THREADS,
|
||||
);
|
||||
expect(messageSendPermissionFor(ChannelTypes.PUBLIC_THREAD)).toBe(ThreadPermissionFlags.SEND_MESSAGES_IN_THREADS);
|
||||
expect(messageSendPermissionFor(ChannelTypes.PRIVATE_THREAD)).toBe(ThreadPermissionFlags.SEND_MESSAGES_IN_THREADS);
|
||||
expect(messageSendPermissionFor(ChannelTypes.GUILD_TEXT)).toBe(Permissions.SEND_MESSAGES);
|
||||
expect(messageSendPermissionFor(ChannelTypes.GUILD_ANNOUNCEMENT)).toBe(Permissions.SEND_MESSAGES);
|
||||
expect(messageSendPermissionFor(ChannelTypes.GUILD_FORUM)).toBe(Permissions.SEND_MESSAGES);
|
||||
});
|
||||
});
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import {ALL_PERMISSIONS, ChannelTypes, Permissions} from '@fluxer/constants/src/ChannelConstants';
|
||||
import {THREAD_CHANNEL_TYPES} from '@fluxer/constants/src/ThreadConstants';
|
||||
|
||||
export const ThreadPermissionFlags = {
|
||||
MANAGE_THREADS: 1n << 34n,
|
||||
@@ -89,10 +88,6 @@ export function threadViewPermissions(parentPerms: bigint): bigint {
|
||||
: withoutSend;
|
||||
}
|
||||
|
||||
export function messageSendPermissionFor(type: number): bigint {
|
||||
return THREAD_CHANNEL_TYPES.has(type) ? ThreadPermissionFlags.SEND_MESSAGES_IN_THREADS : Permissions.SEND_MESSAGES;
|
||||
}
|
||||
|
||||
export function canViewThread(ctx: ThreadActorContext): ThreadDenial | null {
|
||||
const perms = withImplicitThreadBits(ctx.permissions);
|
||||
if (!ctx.isOwner && !has(perms, Permissions.VIEW_CHANNEL)) return APIErrorCodes.MISSING_ACCESS;
|
||||
|
||||
@@ -12,9 +12,7 @@ export const ValidationErrorCodes = {
|
||||
ANIMATED_GUILD_BANNER_REQUIRES_FEATURE: 'ANIMATED_GUILD_BANNER_REQUIRES_FEATURE',
|
||||
AT_LEAST_ONE_ENTRY_IS_REQUIRED: 'AT_LEAST_ONE_ENTRY_IS_REQUIRED',
|
||||
AT_LEAST_ONE_RECIPIENT_REQUIRED: 'AT_LEAST_ONE_RECIPIENT_REQUIRED',
|
||||
ATTACHMENT_FIELDS_REQUIRED: 'ATTACHMENT_FIELDS_REQUIRED',
|
||||
ATTACHMENT_ID_NOT_FOUND_IN_MESSAGE: 'ATTACHMENT_ID_NOT_FOUND_IN_MESSAGE',
|
||||
ATTACHMENT_IDS_MUST_BE_VALID_INTEGERS: 'ATTACHMENT_IDS_MUST_BE_VALID_INTEGERS',
|
||||
ATTACHMENT_MUST_BE_IMAGE: 'ATTACHMENT_MUST_BE_IMAGE',
|
||||
ATTACHMENTS_NOT_ALLOWED_FOR_MESSAGE: 'ATTACHMENTS_NOT_ALLOWED_FOR_MESSAGE',
|
||||
AVATAR_CHANGED_TOO_MANY_TIMES: 'AVATAR_CHANGED_TOO_MANY_TIMES',
|
||||
@@ -22,7 +20,6 @@ export const ValidationErrorCodes = {
|
||||
BANNERS_REQUIRE_PREMIUM: 'BANNERS_REQUIRE_PREMIUM',
|
||||
BASE64_LENGTH_INVALID: 'BASE64_LENGTH_INVALID',
|
||||
BIO_CHANGED_TOO_MANY_TIMES: 'BIO_CHANGED_TOO_MANY_TIMES',
|
||||
BUCKET_IS_REQUIRED: 'BUCKET_IS_REQUIRED',
|
||||
CANNOT_ADD_YOURSELF_TO_GROUP_DM: 'CANNOT_ADD_YOURSELF_TO_GROUP_DM',
|
||||
CANNOT_DELETE_MORE_THAN_100_MESSAGES: 'CANNOT_DELETE_MORE_THAN_100_MESSAGES',
|
||||
CANNOT_DM_YOURSELF: 'CANNOT_DM_YOURSELF',
|
||||
@@ -183,9 +180,7 @@ export const ValidationErrorCodes = {
|
||||
RECIPIENT_IDS_MUST_BE_STRINGS: 'RECIPIENT_IDS_MUST_BE_STRINGS',
|
||||
RECIPIENT_IDS_MUST_BE_VALID_SNOWFLAKES: 'RECIPIENT_IDS_MUST_BE_VALID_SNOWFLAKES',
|
||||
REFERENCED_ATTACHMENT_NOT_FOUND: 'REFERENCED_ATTACHMENT_NOT_FOUND',
|
||||
ROWS_IS_REQUIRED: 'ROWS_IS_REQUIRED',
|
||||
SESSION_TIMEOUT: 'SESSION_TIMEOUT',
|
||||
SIZE_BYTES_MUST_BE_VALID_INTEGER: 'SIZE_BYTES_MUST_BE_VALID_INTEGER',
|
||||
SSO_IDENTITY_MISMATCH: 'SSO_IDENTITY_MISMATCH',
|
||||
SSO_MISCONFIGURED: 'SSO_MISCONFIGURED',
|
||||
SSO_PROVIDER_DID_NOT_RETURN_EMAIL: 'SSO_PROVIDER_DID_NOT_RETURN_EMAIL',
|
||||
|
||||
Reference in new issue
Block a user