Files
fluxer/packages/api/src/test/TestConstants.tsx
2026-02-17 12:22:36 +00:00

176 lines
4.5 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
export const TEST_TIMEOUTS = {
IMMEDIATE: 20,
QUICK: 100,
DEFAULT: 1000,
MEDIUM: 2000,
LONG: 5000,
TICKET_EXPIRY_GRACE: 2000,
COOLDOWN_WAIT: 31000,
HARVEST_EXPIRY_BOUNDARY: 7000,
MAX: 10000,
} as const;
export const TEST_CREDENTIALS = {
STRONG_PASSWORD: 'a-strong-password',
ALT_PASSWORD_1: 'AnotherStrongPassword123!',
ALT_PASSWORD_2: 'SecurePass-2024!',
WEAK_PASSWORD: 'weak',
EMPTY_PASSWORD: '',
} as const;
export const TEST_USER_DATA = {
DEFAULT_DATE_OF_BIRTH: '2000-01-01',
DEFAULT_GLOBAL_NAME: 'Test User',
REGISTER_GLOBAL_NAME: 'Register User',
LOGIN_GLOBAL_NAME: 'Login Test User',
EMAIL_DOMAIN: 'example.com',
USERNAME_PREFIX: 'itest',
EMAIL_PREFIX: 'integration',
} as const;
export const TEST_GUILD_DATA = {
DEFAULT_NAME: 'Test Guild',
VALIDATION_NAME: 'Operation Test Guild',
SCHEDULING_NAME: 'sched-validation',
} as const;
export const TEST_CHANNEL_DATA = {
DEFAULT_NAME: 'test',
DEFAULT_NAME_ALT: 'general',
} as const;
export const HTTP_STATUS = {
OK: 200,
CREATED: 201,
NO_CONTENT: 204,
BAD_REQUEST: 400,
UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
CONFLICT: 409,
INTERNAL_SERVER_ERROR: 500,
ACCEPTED: 202,
} as const;
export const SUCCESS_CODES = [200, 201, 204] as const;
export const CLIENT_ERROR_CODES = [400, 401, 403, 404, 409] as const;
export const EXPECTED_RESPONSES = {
UNAUTHORIZED_OR_BAD_REQUEST: [400, 401] as const,
SUCCESS_OR_NO_CONTENT: [200, 204] as const,
DUPLICATE_EMAIL_OR_CONFLICT: [400, 409] as const,
EMAIL_SENT: [200, 202, 204] as const,
} as const;
export const TEST_IDS = {
NONEXISTENT_GUILD: '999999999999999999',
NONEXISTENT_CHANNEL: '999999999999999999',
NONEXISTENT_USER: '999999999999999999',
NONEXISTENT_MESSAGE: '999999999999999999',
NONEXISTENT_WEBHOOK: '999999999999999999',
} as const;
export const TEST_LIMITS = {
SCHEDULED_MESSAGE_MAX_DAYS: 30,
SCHEDULED_MESSAGE_MIN_DELAY_MS: 5 * 60 * 1000,
SCHEDULED_MESSAGE_MAX_DELAY_MS: 31 * 24 * 60 * 60 * 1000,
MFA_TICKET_SHORT_TTL: 1,
MFA_TICKET_LONG_TTL: 300,
PASSWORD_RESET_TOKEN_LENGTH: 64,
} as const;
export function generateTimestampedValue(prefix = 'test'): string {
return `${prefix}-${Date.now()}`;
}
export function generateUniquePassword(): string {
return `SecurePass-${Date.now()}!`;
}
export function generateTestEmail(prefix = 'test', domain = 'example.com'): string {
return `${prefix}-${Date.now()}@${domain}`;
}
export function generateFutureTimestamp(minutesInFuture = 5): string {
return new Date(Date.now() + minutesInFuture * 60 * 1000).toISOString();
}
export function generatePastTimestamp(hoursInPast = 1): string {
return new Date(Date.now() - hoursInPast * 60 * 60 * 1000).toISOString();
}
export function wait(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
export async function waitImmediate(): Promise<void> {
await wait(TEST_TIMEOUTS.IMMEDIATE);
}
export async function waitDefault(): Promise<void> {
await wait(TEST_TIMEOUTS.DEFAULT);
}
export async function waitTicketExpiry(): Promise<void> {
await wait(TEST_TIMEOUTS.TICKET_EXPIRY_GRACE);
}
export async function waitCooldown(): Promise<void> {
await wait(TEST_TIMEOUTS.COOLDOWN_WAIT);
}
export function isSuccessCode(status: number): boolean {
return status >= 200 && status < 300;
}
export function isClientErrorCode(status: number): boolean {
return status >= 400 && status < 500;
}
export function isServerErrorCode(status: number): boolean {
return status >= 500 && status < 600;
}
export function assertStatusCode(actual: number, expected: ReadonlyArray<number>, description?: string): void {
if (!expected.includes(actual)) {
const message = description
? `${description}: Expected status ${expected.join(' or ')}, got ${actual}`
: `Expected status ${expected.join(' or ')}, got ${actual}`;
throw new Error(message);
}
}