import { validatePaymentRequest } from '@/gateway/validation/payment-validation'; import { PaymentType, Currency } from '@/models/payment'; describe('Payment Validation', () => { describe('validatePaymentRequest', () => { it('should validate correct payment request', () => { const validRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000.50, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', purpose: 'Payment for services', remittanceInfo: 'Invoice #12345', }; const result = validatePaymentRequest(validRequest); expect(result.error).toBeUndefined(); expect(result.value).toBeDefined(); expect(result.value?.type).toBe(PaymentType.CUSTOMER_CREDIT_TRANSFER); }); it('should reject missing required fields', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, // Missing currency, accounts, BICs, beneficiary }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); expect(result.value).toBeUndefined(); }); it('should reject invalid payment type', () => { const invalidRequest = { type: 'INVALID_TYPE', amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should reject negative amount', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: -1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should reject zero amount', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 0, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should reject invalid currency', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: 'INVALID', senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should reject invalid BIC format', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'INVALID', // Invalid BIC receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should accept valid BIC8 format', () => { const validRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', // BIC8 receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', // BIC8 beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(validRequest); expect(result.error).toBeUndefined(); }); it('should accept valid BIC11 format', () => { const validRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1XXX', // BIC11 receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2XXX', // BIC11 beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(validRequest); expect(result.error).toBeUndefined(); }); it('should accept optional fields', () => { const validRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', purpose: 'Optional purpose', remittanceInfo: 'Optional remittance', }; const result = validatePaymentRequest(validRequest); expect(result.error).toBeUndefined(); expect(result.value?.purpose).toBe('Optional purpose'); expect(result.value?.remittanceInfo).toBe('Optional remittance'); }); it('should handle both payment types', () => { const pacs008Request = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const pacs009Request = { ...pacs008Request, type: PaymentType.FI_TO_FI, }; expect(validatePaymentRequest(pacs008Request).error).toBeUndefined(); expect(validatePaymentRequest(pacs009Request).error).toBeUndefined(); }); it('should enforce maximum length for beneficiary name', () => { const invalidRequest = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000, currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'A'.repeat(256), // Too long }; const result = validatePaymentRequest(invalidRequest); expect(result.error).toBeDefined(); }); it('should enforce decimal precision for amount', () => { const requestWithManyDecimals = { type: PaymentType.CUSTOMER_CREDIT_TRANSFER, amount: 1000.123456, // Too many decimals currency: Currency.USD, senderAccount: 'ACC001', senderBIC: 'TESTBIC1', receiverAccount: 'ACC002', receiverBIC: 'TESTBIC2', beneficiaryName: 'John Doe', }; const result = validatePaymentRequest(requestWithManyDecimals); // Should either reject or round to 2 decimals expect(result).toBeDefined(); }); }); });