79 lines
1.8 KiB
TypeScript
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',
|
|
);
|
|
});
|
|
});
|