/** * Jest Test Setup * * Global test configuration and utilities */ // Make this file a module export {}; // Set test environment variables process.env.NODE_ENV = 'test'; process.env.APP_PORT = '3006'; process.env.DATABASE_URL = 'mysql://test:test@localhost:3306/test_db'; process.env.REDIS_HOST = 'localhost'; process.env.REDIS_PORT = '6379'; process.env.REDIS_DB = '15'; process.env.JWT_SECRET = 'test-jwt-secret-key-for-testing-only'; process.env.SHARE_MASTER_KEY = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; process.env.MPC_PARTY_ID = 'party-test-1'; process.env.MPC_COORDINATOR_URL = 'http://localhost:50051'; process.env.MPC_MESSAGE_ROUTER_WS_URL = 'ws://localhost:50052'; process.env.KAFKA_BROKERS = 'localhost:9092'; process.env.KAFKA_ENABLED = 'false'; // Increase timeout for async operations jest.setTimeout(30000); // Global beforeAll hook beforeAll(async () => { // Any global setup }); // Global afterAll hook afterAll(async () => { // Any global cleanup }); // Console error suppression for expected errors const originalError = console.error; console.error = (...args: any[]) => { // Suppress expected validation errors in tests if ( args[0]?.includes?.('Validation failed') || args[0]?.includes?.('Expected test error') ) { return; } originalError.call(console, ...args); }; // Add custom matchers expect.extend({ toBeValidUUID(received: string) { const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; const pass = uuidRegex.test(received); return { message: () => pass ? `expected ${received} not to be a valid UUID` : `expected ${received} to be a valid UUID`, pass, }; }, toBeValidHex(received: string, expectedLength?: number) { const hexRegex = /^[0-9a-f]+$/i; const isHex = hexRegex.test(received); const lengthMatch = expectedLength === undefined || received.length === expectedLength; const pass = isHex && lengthMatch; return { message: () => pass ? `expected ${received} not to be valid hex${expectedLength ? ` of length ${expectedLength}` : ''}` : `expected ${received} to be valid hex${expectedLength ? ` of length ${expectedLength}` : ''}`, pass, }; }, toBeValidPublicKey(received: string) { // Compressed public key is 33 bytes = 66 hex chars // Uncompressed public key is 65 bytes = 130 hex chars const hexRegex = /^[0-9a-f]+$/i; const isHex = hexRegex.test(received); const isValidLength = received.length === 66 || received.length === 130; const pass = isHex && isValidLength; return { message: () => pass ? `expected ${received} not to be a valid public key` : `expected ${received} to be a valid public key (66 or 130 hex chars)`, pass, }; }, toBeValidSignature(received: string) { // ECDSA signature components r, s are 32 bytes each = 64 bytes total = 128 hex chars // With recovery id (v) it's 65 bytes = 130 hex chars const hexRegex = /^[0-9a-f]+$/i; const isHex = hexRegex.test(received); const isValidLength = received.length === 128 || received.length === 130; const pass = isHex && isValidLength; return { message: () => pass ? `expected ${received} not to be a valid signature` : `expected ${received} to be a valid signature (128 or 130 hex chars)`, pass, }; }, }); // Type declarations for custom matchers declare global { namespace jest { interface Matchers { toBeValidUUID(): R; toBeValidHex(expectedLength?: number): R; toBeValidPublicKey(): R; toBeValidSignature(): R; } } }