import { describe, it, expect } from 'vitest'; import { DriverProfileViewModel } from './DriverProfileViewModel'; const createDriverProfileDto = (): DriverProfileViewModel => ({ currentDriver: { id: 'driver-1', name: 'Test Driver', country: 'DE', avatarUrl: 'https://example.com/avatar.jpg', iracingId: 'ir-123', joinedAt: '2024-01-01T00:00:00Z', rating: 2500, globalRank: 42, consistency: 88, bio: 'Test bio', totalDrivers: 1000, }, stats: { totalRaces: 10, wins: 3, podiums: 5, dnfs: 1, avgFinish: 4.2, bestFinish: 1, worstFinish: 15, finishRate: 90, winRate: 30, podiumRate: 50, percentile: 95, rating: 2500, consistency: 88, overallRank: 10, }, finishDistribution: { totalRaces: 10, wins: 3, podiums: 5, topTen: 8, dnfs: 1, other: 1, }, teamMemberships: [ { teamId: 'team-1', teamName: 'Test Team', teamTag: 'TT', role: 'driver', joinedAt: '2023-01-01T00:00:00Z', isCurrent: true, }, ], socialSummary: { friendsCount: 5, friends: [ { id: 'friend-1', name: 'Friend 1', country: 'US', avatarUrl: 'https://example.com/friend.jpg', }, ], }, extendedProfile: { socialHandles: [ { platform: 'twitter', handle: '@test', url: 'https://twitter.com/test', }, ], achievements: [ { id: 'ach-1', title: 'Champion', description: 'Won a championship', icon: 'trophy', rarity: 'epic', earnedAt: '2024-01-10T00:00:00Z', }, ], racingStyle: 'Aggressive', favoriteTrack: 'Spa', favoriteCar: 'F3', timezone: 'Europe/Berlin', availableHours: 'Evenings', lookingForTeam: false, openToRequests: true, }, }); describe('DriverProfileViewModel', () => { it('exposes profile sections from DTO', () => { const dto = createDriverProfileDto(); const viewModel = new DriverProfileViewModel(dto); expect(viewModel.currentDriver).toEqual(dto.currentDriver); expect(viewModel.stats).toEqual(dto.stats); expect(viewModel.finishDistribution).toEqual(dto.finishDistribution); expect(viewModel.teamMemberships).toEqual(dto.teamMemberships); expect(viewModel.socialSummary).toEqual(dto.socialSummary); expect(viewModel.extendedProfile).toEqual(dto.extendedProfile); }); it('supports nullable sections', () => { const dto: DriverProfileViewModel = { ...createDriverProfileDto(), currentDriver: null, stats: null, finishDistribution: null, extendedProfile: null, }; const viewModel = new DriverProfileViewModel(dto); expect(viewModel.currentDriver).toBeNull(); expect(viewModel.stats).toBeNull(); expect(viewModel.finishDistribution).toBeNull(); expect(viewModel.extendedProfile).toBeNull(); }); it('returns original DTO from toDTO', () => { const dto = createDriverProfileDto(); const viewModel = new DriverProfileViewModel(dto); expect(viewModel.toDTO()).toBe(dto); }); });