Initial commit: add .gitignore and README
This commit is contained in:
325
tests/compliance/audit-logging.test.ts
Normal file
325
tests/compliance/audit-logging.test.ts
Normal file
@@ -0,0 +1,325 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user