Files
dbis_core-lite/tests/compliance/audit-logging.test.ts
2026-02-09 21:51:45 -08:00

326 lines
8.7 KiB
TypeScript

import { AuditLogger, AuditEventType } from '@/audit/logger/logger';
import { PaymentRepository } from '@/repositories/payment-repository';
import { TestHelpers } from '../utils/test-helpers';
import { PaymentType, Currency } from '@/models/payment';
import { PaymentRequest } from '@/gateway/validation/payment-validation';
describe('Audit Logging Compliance', () => {
let paymentRepository: PaymentRepository;
let testOperator: any;
beforeAll(async () => {
paymentRepository = new PaymentRepository();
});
beforeEach(async () => {
await TestHelpers.cleanDatabase();
testOperator = await TestHelpers.createTestOperator('TEST_AUDIT', 'MAKER' as any);
});
afterAll(async () => {
await TestHelpers.cleanDatabase();
});
describe('Payment Event Logging', () => {
it('should log payment initiation event', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const testPaymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const eventType = AuditEventType.PAYMENT_INITIATED;
await AuditLogger.logPaymentEvent(
eventType,
testPaymentId,
testOperator.id,
{
amount: 1000,
currency: 'USD',
}
);
expect(true).toBe(true);
});
it('should log payment approval event', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const checkerOperator = await TestHelpers.createTestOperator('TEST_CHECKER_AUDIT', 'CHECKER' as any);
await AuditLogger.logPaymentEvent(
AuditEventType.PAYMENT_APPROVED,
paymentId,
checkerOperator.id
);
expect(true).toBe(true);
});
it('should log payment rejection event', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
await AuditLogger.logPaymentEvent(
AuditEventType.PAYMENT_REJECTED,
paymentId,
testOperator.id,
{
reason: 'Test rejection',
}
);
expect(true).toBe(true);
});
});
describe('Compliance Screening Logging', () => {
it('should log compliance screening events', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const screeningId = 'test-screening-123';
await AuditLogger.logComplianceScreening(
paymentId,
screeningId,
'PASS',
{
beneficiaryName: 'Test Beneficiary',
screenedAt: new Date().toISOString(),
}
);
expect(true).toBe(true);
});
it('should log screening failures with reasons', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const screeningId = 'test-screening-fail-123';
await AuditLogger.logComplianceScreening(
paymentId,
screeningId,
'FAIL',
{
reasons: ['Sanctions match', 'BIC on blocked list'],
}
);
expect(true).toBe(true);
});
});
describe('Ledger Posting Logging', () => {
it('should log ledger posting events', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const transactionId = 'test-txn-123';
await AuditLogger.logLedgerPosting(
paymentId,
transactionId,
'ACC001',
1000,
'USD',
{
transactionType: 'DEBIT',
}
);
expect(true).toBe(true);
});
});
describe('Message Event Logging', () => {
it('should log message generation events', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const messageId = 'test-msg-123';
const uetr = '550e8400-e29b-41d4-a716-446655440000';
await AuditLogger.logMessageEvent(
AuditEventType.MESSAGE_GENERATED,
paymentId,
messageId,
uetr,
{
messageType: 'pacs.008',
msgId: 'MSG-12345',
}
);
expect(true).toBe(true);
});
});
describe('Audit Trail Integrity', () => {
it('should maintain chronological order of events', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
const events = [
{ type: AuditEventType.PAYMENT_INITIATED, timestamp: new Date() },
{ type: AuditEventType.PAYMENT_APPROVED, timestamp: new Date(Date.now() + 1000) },
{ type: AuditEventType.MESSAGE_GENERATED, timestamp: new Date(Date.now() + 2000) },
];
for (const event of events) {
await AuditLogger.logPaymentEvent(
event.type,
paymentId,
testOperator.id
);
await new Promise(resolve => setTimeout(resolve, 100));
}
expect(true).toBe(true);
});
it('should include all required audit fields', async () => {
const paymentRequest: PaymentRequest = {
type: PaymentType.CUSTOMER_CREDIT_TRANSFER,
amount: 1000,
currency: Currency.USD,
senderAccount: 'ACC001',
senderBIC: 'TESTBIC1',
receiverAccount: 'ACC002',
receiverBIC: 'TESTBIC2',
beneficiaryName: 'Test Beneficiary',
};
const paymentId = await paymentRepository.create(
paymentRequest,
testOperator.id,
`TEST-AUDIT-${Date.now()}`
);
await AuditLogger.logPaymentEvent(
AuditEventType.PAYMENT_INITIATED,
paymentId,
testOperator.id,
{
testField: 'testValue',
}
);
expect(true).toBe(true);
});
});
});