import { describe, it, expect, vi, Mocked } from 'vitest'; import { MembershipFeeService, GetMembershipFeesOutputDto } from './MembershipFeeService'; import { PaymentsApiClient } from '../../api/payments/PaymentsApiClient'; import { MembershipFeeViewModel } from '../../view-models'; import type { MembershipFeeDto } from '../../types/generated'; describe('MembershipFeeService', () => { let mockApiClient: Mocked; let service: MembershipFeeService; beforeEach(() => { mockApiClient = { getMembershipFees: vi.fn(), } as Mocked; service = new MembershipFeeService(mockApiClient); }); describe('getMembershipFees', () => { it('should call apiClient.getMembershipFees with correct leagueId and return mapped view models', async () => { const leagueId = 'league-123'; const mockFees: MembershipFeeDto[] = [ { id: 'fee-1', leagueId: 'league-123' }, { id: 'fee-2', leagueId: 'league-123' }, ]; const mockOutput: GetMembershipFeesOutputDto = { fees: mockFees }; mockApiClient.getMembershipFees.mockResolvedValue(mockOutput); const result = await service.getMembershipFees(leagueId); expect(mockApiClient.getMembershipFees).toHaveBeenCalledWith(leagueId); expect(result).toHaveLength(2); expect(result[0]).toBeInstanceOf(MembershipFeeViewModel); expect(result[0].id).toEqual('fee-1'); expect(result[0].leagueId).toEqual('league-123'); expect(result[1]).toBeInstanceOf(MembershipFeeViewModel); expect(result[1].id).toEqual('fee-2'); expect(result[1].leagueId).toEqual('league-123'); }); it('should return empty array when no fees are returned', async () => { const leagueId = 'league-456'; const mockOutput: GetMembershipFeesOutputDto = { fees: [] }; mockApiClient.getMembershipFees.mockResolvedValue(mockOutput); const result = await service.getMembershipFees(leagueId); expect(mockApiClient.getMembershipFees).toHaveBeenCalledWith(leagueId); expect(result).toEqual([]); }); }); });