website refactor

This commit is contained in:
2026-01-16 12:55:48 +01:00
parent 0208334c59
commit 20a42c52fd
83 changed files with 1610 additions and 1238 deletions

View File

@@ -15,7 +15,7 @@ import { FeatureAvailabilityGuard } from '../policy/FeatureAvailabilityGuard';
describe('Payments domain (HTTP, module-wiring)', () => {
const originalEnv = { ...process.env };
let app: any;
let app: import("@nestjs/common").INestApplication;
beforeAll(async () => {
vi.resetModules();
@@ -62,9 +62,9 @@ describe('Payments domain (HTTP, module-wiring)', () => {
};
app.useGlobalGuards(
new AuthenticationGuard(sessionPort as any),
new AuthorizationGuard(reflector, authorizationService as any),
new FeatureAvailabilityGuard(reflector, policyService as any),
new AuthenticationGuard(sessionPort as never),
new AuthorizationGuard(reflector, authorizationService as never),
new FeatureAvailabilityGuard(reflector, policyService as never),
);
await app.init();

View File

@@ -377,7 +377,7 @@ describe('PaymentsController', () => {
});
describe('auth guards (HTTP)', () => {
let app: any;
let app: import("@nestjs/common").INestApplication;
const sessionPort: { getCurrentSession: () => Promise<null | { token: string; user: { id: string } }> } = {
getCurrentSession: vi.fn(async () => null),
@@ -415,9 +415,9 @@ describe('PaymentsController', () => {
const reflector = new Reflector();
app.useGlobalGuards(
new AuthenticationGuard(sessionPort as any),
new AuthorizationGuard(reflector, authorizationService as any),
new FeatureAvailabilityGuard(reflector, policyService as any),
new AuthenticationGuard(sessionPort as never),
new AuthorizationGuard(reflector, authorizationService as never),
new FeatureAvailabilityGuard(reflector, policyService as never),
);
await app.init();

View File

@@ -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');
});
});

View File

@@ -1,12 +0,0 @@
export * from './GetPaymentsPresenter';
export * from './CreatePaymentPresenter';
export * from './UpdatePaymentStatusPresenter';
export * from './GetMembershipFeesPresenter';
export * from './UpsertMembershipFeePresenter';
export * from './UpdateMemberPaymentPresenter';
export * from './GetPrizesPresenter';
export * from './CreatePrizePresenter';
export * from './AwardPrizePresenter';
export * from './DeletePrizePresenter';
export * from './GetWalletPresenter';
export * from './ProcessWalletTransactionPresenter';