Files
dbis_core-lite/tests/validation/payment-validation.test.ts
2026-02-09 21:51:45 -08:00

226 lines
6.9 KiB
TypeScript

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();
});
});
});