|
|
|
|
@@ -5,7 +5,9 @@ import { PaymentsService } from './PaymentsService';
|
|
|
|
|
describe('PaymentsService', () => {
|
|
|
|
|
const logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() };
|
|
|
|
|
|
|
|
|
|
function makeService(overrides?: Partial<Record<string, any>>) {
|
|
|
|
|
type MockUseCase = { execute: ReturnType<typeof vi.fn> };
|
|
|
|
|
|
|
|
|
|
function makeService(overrides?: Partial<Record<string, MockUseCase>>) {
|
|
|
|
|
const getPaymentsUseCase = overrides?.getPaymentsUseCase ?? { execute: vi.fn(async () => Result.ok({ payments: [] })) };
|
|
|
|
|
const createPaymentUseCase = overrides?.createPaymentUseCase ?? { execute: vi.fn(async () => Result.ok({ paymentId: 'p1' })) };
|
|
|
|
|
const updatePaymentStatusUseCase =
|
|
|
|
|
@@ -25,19 +27,19 @@ describe('PaymentsService', () => {
|
|
|
|
|
overrides?.processWalletTransactionUseCase ?? { execute: vi.fn(async () => Result.ok({ success: true })) };
|
|
|
|
|
|
|
|
|
|
const service = new PaymentsService(
|
|
|
|
|
getPaymentsUseCase as any,
|
|
|
|
|
createPaymentUseCase as any,
|
|
|
|
|
updatePaymentStatusUseCase as any,
|
|
|
|
|
getMembershipFeesUseCase as any,
|
|
|
|
|
upsertMembershipFeeUseCase as any,
|
|
|
|
|
updateMemberPaymentUseCase as any,
|
|
|
|
|
getPrizesUseCase as any,
|
|
|
|
|
createPrizeUseCase as any,
|
|
|
|
|
awardPrizeUseCase as any,
|
|
|
|
|
deletePrizeUseCase as any,
|
|
|
|
|
getWalletUseCase as any,
|
|
|
|
|
processWalletTransactionUseCase as any,
|
|
|
|
|
logger as any,
|
|
|
|
|
getPaymentsUseCase as never,
|
|
|
|
|
createPaymentUseCase as never,
|
|
|
|
|
updatePaymentStatusUseCase as never,
|
|
|
|
|
getMembershipFeesUseCase as never,
|
|
|
|
|
upsertMembershipFeeUseCase as never,
|
|
|
|
|
updateMemberPaymentUseCase as never,
|
|
|
|
|
getPrizesUseCase as never,
|
|
|
|
|
createPrizeUseCase as never,
|
|
|
|
|
awardPrizeUseCase as never,
|
|
|
|
|
deletePrizeUseCase as never,
|
|
|
|
|
getWalletUseCase as never,
|
|
|
|
|
processWalletTransactionUseCase as never,
|
|
|
|
|
logger as never,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
@@ -59,7 +61,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
|
|
|
|
|
it('getPayments returns presenter model on success', async () => {
|
|
|
|
|
const { service, getPaymentsUseCase } = makeService();
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as any)).resolves.toEqual({ payments: [] });
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as never)).resolves.toEqual({ payments: [] });
|
|
|
|
|
expect(getPaymentsUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -67,12 +69,12 @@ describe('PaymentsService', () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
getPaymentsUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' })) },
|
|
|
|
|
});
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as any)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as never)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('createPayment returns presenter model on success', async () => {
|
|
|
|
|
const { service, createPaymentUseCase } = makeService();
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as any)).resolves.toEqual({ paymentId: 'p1' });
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as never)).resolves.toEqual({ paymentId: 'p1' });
|
|
|
|
|
expect(createPaymentUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -80,12 +82,12 @@ describe('PaymentsService', () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
createPaymentUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' })) },
|
|
|
|
|
});
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as any)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as never)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('updatePaymentStatus returns presenter model on success', async () => {
|
|
|
|
|
const { service, updatePaymentStatusUseCase } = makeService();
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(updatePaymentStatusUseCase.execute).toHaveBeenCalledWith({ paymentId: 'p1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -93,7 +95,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
updatePaymentStatusUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' })) },
|
|
|
|
|
});
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as any)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as never)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('getMembershipFees returns viewModel on success', async () => {
|
|
|
|
|
@@ -101,7 +103,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
getMembershipFeesUseCase: { execute: vi.fn(async () => Result.ok({ fee: { amount: 1 }, payments: [] })) }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1', driverId: 'd1' } as any)).resolves.toEqual({
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1', driverId: 'd1' } as never)).resolves.toEqual({
|
|
|
|
|
fee: { amount: 1 },
|
|
|
|
|
payments: [],
|
|
|
|
|
});
|
|
|
|
|
@@ -112,22 +114,22 @@ describe('PaymentsService', () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
getMembershipFeesUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' })) },
|
|
|
|
|
});
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1' } as any)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1' } as never)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('upsertMembershipFee returns viewModel on success', async () => {
|
|
|
|
|
const { service, upsertMembershipFeeUseCase } = makeService();
|
|
|
|
|
|
|
|
|
|
await expect(service.upsertMembershipFee({ leagueId: 'l1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.upsertMembershipFee({ leagueId: 'l1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(upsertMembershipFeeUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('upsertMembershipFee throws on error branch (defensive check)', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
upsertMembershipFeeUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' } as any)) },
|
|
|
|
|
upsertMembershipFeeUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' } as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.upsertMembershipFee({ leagueId: 'l1' } as any)).rejects.toThrow(
|
|
|
|
|
await expect(service.upsertMembershipFee({ leagueId: 'l1' } as never)).rejects.toThrow(
|
|
|
|
|
'Failed to upsert membership fee',
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
@@ -135,7 +137,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
it('updateMemberPayment returns viewModel on success', async () => {
|
|
|
|
|
const { service, updateMemberPaymentUseCase } = makeService();
|
|
|
|
|
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(updateMemberPaymentUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -144,7 +146,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
updateMemberPaymentUseCase: { execute: vi.fn(async () => Result.err({ code: 'REPOSITORY_ERROR' })) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as any)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as never)).rejects.toThrow('REPOSITORY_ERROR');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('getPrizes maps seasonId optional', async () => {
|
|
|
|
|
@@ -153,10 +155,10 @@ describe('PaymentsService', () => {
|
|
|
|
|
getPrizesUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.getPrizes({ leagueId: 'l1' } as any)).resolves.toEqual({ prizes: [] });
|
|
|
|
|
await expect(service.getPrizes({ leagueId: 'l1' } as never)).resolves.toEqual({ prizes: [] });
|
|
|
|
|
expect(getPrizesUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
|
|
|
|
|
await expect(service.getPrizes({ leagueId: 'l1', seasonId: 's1' } as any)).resolves.toEqual({ prizes: [] });
|
|
|
|
|
await expect(service.getPrizes({ leagueId: 'l1', seasonId: 's1' } as never)).resolves.toEqual({ prizes: [] });
|
|
|
|
|
expect(getPrizesUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1', seasonId: 's1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -166,7 +168,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
createPrizeUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.createPrize({ leagueId: 'l1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.createPrize({ leagueId: 'l1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(createPrizeUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -176,7 +178,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
awardPrizeUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.awardPrize({ prizeId: 'p1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.awardPrize({ prizeId: 'p1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(awardPrizeUseCase.execute).toHaveBeenCalledWith({ prizeId: 'p1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -186,7 +188,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
deletePrizeUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.deletePrize({ prizeId: 'p1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.deletePrize({ prizeId: 'p1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(deletePrizeUseCase.execute).toHaveBeenCalledWith({ prizeId: 'p1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -196,7 +198,7 @@ describe('PaymentsService', () => {
|
|
|
|
|
getWalletUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.getWallet({ leagueId: 'l1' } as any)).resolves.toEqual({ balance: 10 });
|
|
|
|
|
await expect(service.getWallet({ leagueId: 'l1' } as never)).resolves.toEqual({ balance: 10 });
|
|
|
|
|
expect(getWalletUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -206,47 +208,47 @@ describe('PaymentsService', () => {
|
|
|
|
|
processWalletTransactionUseCase,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.processWalletTransaction({ leagueId: 'l1' } as any)).resolves.toEqual({ success: true });
|
|
|
|
|
await expect(service.processWalletTransaction({ leagueId: 'l1' } as never)).resolves.toEqual({ success: true });
|
|
|
|
|
expect(processWalletTransactionUseCase.execute).toHaveBeenCalledWith({ leagueId: 'l1' });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('getPayments throws fallback message when error has no code', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
getPaymentsUseCase: { execute: vi.fn(async () => Result.err({} as any)) },
|
|
|
|
|
getPaymentsUseCase: { execute: vi.fn(async () => Result.err({} as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as any)).rejects.toThrow('Failed to get payments');
|
|
|
|
|
await expect(service.getPayments({ leagueId: 'l1' } as never)).rejects.toThrow('Failed to get payments');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('createPayment throws fallback message when error has no code', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
createPaymentUseCase: { execute: vi.fn(async () => Result.err({} as any)) },
|
|
|
|
|
createPaymentUseCase: { execute: vi.fn(async () => Result.err({} as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as any)).rejects.toThrow('Failed to create payment');
|
|
|
|
|
await expect(service.createPayment({ leagueId: 'l1' } as never)).rejects.toThrow('Failed to create payment');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('updatePaymentStatus throws fallback message when error has no code', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
updatePaymentStatusUseCase: { execute: vi.fn(async () => Result.err({} as any)) },
|
|
|
|
|
updatePaymentStatusUseCase: { execute: vi.fn(async () => Result.err({} as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as any)).rejects.toThrow('Failed to update payment status');
|
|
|
|
|
await expect(service.updatePaymentStatus({ paymentId: 'p1' } as never)).rejects.toThrow('Failed to update payment status');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('getMembershipFees throws fallback message when error has no code', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
getMembershipFeesUseCase: { execute: vi.fn(async () => Result.err({} as any)) },
|
|
|
|
|
getMembershipFeesUseCase: { execute: vi.fn(async () => Result.err({} as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1', driverId: 'd1' } as any)).rejects.toThrow('Failed to get membership fees');
|
|
|
|
|
await expect(service.getMembershipFees({ leagueId: 'l1', driverId: 'd1' } as never)).rejects.toThrow('Failed to get membership fees');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('updateMemberPayment throws fallback message when error has no code', async () => {
|
|
|
|
|
const { service } = makeService({
|
|
|
|
|
updateMemberPaymentUseCase: { execute: vi.fn(async () => Result.err({} as any)) },
|
|
|
|
|
updateMemberPaymentUseCase: { execute: vi.fn(async () => Result.err({} as never)) },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as any)).rejects.toThrow('Failed to update member payment');
|
|
|
|
|
await expect(service.updateMemberPayment({ leagueId: 'l1' } as never)).rejects.toThrow('Failed to update member payment');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|