Files
thebet365/apps/api/src/domains/ledger/funds-posting.service.spec.ts
2026-06-13 17:38:25 +08:00

79 lines
1.8 KiB
TypeScript

import { Decimal } from '@prisma/client/runtime/library';
import { FundsPostingService } from './funds-posting.service';
describe('FundsPostingService', () => {
const wallet = {
deposit: jest.fn(),
freezeForBet: jest.fn(),
settleBet: jest.fn(),
applyResettleDelta: jest.fn(),
};
let service: FundsPostingService;
beforeEach(() => {
jest.clearAllMocks();
service = new FundsPostingService(wallet as never);
});
it('freezes bet funds with a stable business key', async () => {
await service.freezeBet({
userId: 1n,
stake: new Decimal(50),
betNo: 'BET-001',
tx: {} as never,
});
expect(wallet.freezeForBet).toHaveBeenCalledWith(
1n,
expect.any(Decimal),
'BET-001',
expect.anything(),
'bet:BET-001:freeze',
);
});
it('settles bets with batch and bet identity in the business key', async () => {
await service.settleBet({
userId: 2n,
stake: new Decimal(100),
payout: new Decimal(180),
betNo: 'BET-002',
batchNo: 'SETTLE-001',
result: 'WIN',
tx: {} as never,
});
expect(wallet.settleBet).toHaveBeenCalledWith(
2n,
expect.any(Decimal),
expect.any(Decimal),
'BET-002',
'WIN',
expect.anything(),
'settle:SETTLE-001:BET-002',
);
});
it('passes caller-provided business keys for transfer postings', async () => {
await service.deposit({
userId: 3n,
amount: 25,
operatorId: 9n,
referenceId: 'REQ-1',
transactionType: 'ADMIN_DEPOSIT',
businessKey: 'admin-deposit:9:REQ-1',
});
expect(wallet.deposit).toHaveBeenCalledWith(
3n,
25,
9n,
undefined,
'REQ-1',
'ADMIN_DEPOSIT',
undefined,
'admin-deposit:9:REQ-1',
);
});
});