226 lines
6.9 KiB
TypeScript
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();
|
|
});
|
|
});
|
|
});
|
|
|