import { describe, it, expect } from 'vitest'; import { LeagueRosterAdminViewDataBuilder } from './LeagueRosterAdminViewDataBuilder'; import type { LeagueRosterMemberDTO } from '@/lib/types/generated/LeagueRosterMemberDTO'; import type { LeagueRosterJoinRequestDTO } from '@/lib/types/generated/LeagueRosterJoinRequestDTO'; describe('LeagueRosterAdminViewDataBuilder', () => { describe('happy paths', () => { it('should transform roster DTOs to LeagueRosterAdminViewData correctly', () => { const members: LeagueRosterMemberDTO[] = [ { driverId: 'driver-1', driver: { id: 'driver-1', name: 'Alice', iracingId: '11111', country: 'UK', joinedAt: '2023-06-01T00:00:00.000Z', }, role: 'admin', joinedAt: '2023-06-01T00:00:00.000Z', }, { driverId: 'driver-2', driver: { id: 'driver-2', name: 'Bob', iracingId: '22222', country: 'Germany', joinedAt: '2023-07-01T00:00:00.000Z', }, role: 'member', joinedAt: '2023-07-01T00:00:00.000Z', }, ]; const joinRequests: LeagueRosterJoinRequestDTO[] = [ { id: 'request-1', leagueId: 'league-1', driverId: 'driver-3', requestedAt: '2024-01-15T10:00:00.000Z', message: 'I would like to join this league', driver: {}, }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members, joinRequests, }); expect(result.leagueId).toBe('league-1'); expect(result.members).toHaveLength(2); expect(result.members[0].driverId).toBe('driver-1'); expect(result.members[0].driver.id).toBe('driver-1'); expect(result.members[0].driver.name).toBe('Alice'); expect(result.members[0].role).toBe('admin'); expect(result.members[0].joinedAt).toBe('2023-06-01T00:00:00.000Z'); expect(result.members[0].formattedJoinedAt).toBeDefined(); expect(result.members[1].driverId).toBe('driver-2'); expect(result.members[1].driver.id).toBe('driver-2'); expect(result.members[1].driver.name).toBe('Bob'); expect(result.members[1].role).toBe('member'); expect(result.members[1].joinedAt).toBe('2023-07-01T00:00:00.000Z'); expect(result.members[1].formattedJoinedAt).toBeDefined(); expect(result.joinRequests).toHaveLength(1); expect(result.joinRequests[0].id).toBe('request-1'); expect(result.joinRequests[0].driver.id).toBe('driver-3'); expect(result.joinRequests[0].driver.name).toBe('Unknown Driver'); expect(result.joinRequests[0].requestedAt).toBe('2024-01-15T10:00:00.000Z'); expect(result.joinRequests[0].formattedRequestedAt).toBeDefined(); expect(result.joinRequests[0].message).toBe('I would like to join this league'); }); it('should handle empty members and join requests', () => { const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members: [], joinRequests: [], }); expect(result.leagueId).toBe('league-1'); expect(result.members).toHaveLength(0); expect(result.joinRequests).toHaveLength(0); }); it('should handle members without driver details', () => { const members: LeagueRosterMemberDTO[] = [ { driverId: 'driver-1', driver: undefined as any, role: 'member', joinedAt: '2023-06-01T00:00:00.000Z', }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members, joinRequests: [], }); expect(result.members[0].driver.name).toBe('Unknown Driver'); }); }); describe('data transformation', () => { it('should preserve all DTO fields in the output', () => { const members: LeagueRosterMemberDTO[] = [ { driverId: 'driver-1', driver: { id: 'driver-1', name: 'Alice', iracingId: '11111', country: 'UK', joinedAt: '2023-06-01T00:00:00.000Z', }, role: 'admin', joinedAt: '2023-06-01T00:00:00.000Z', }, ]; const joinRequests: LeagueRosterJoinRequestDTO[] = [ { id: 'request-1', leagueId: 'league-1', driverId: 'driver-3', requestedAt: '2024-01-15T10:00:00.000Z', message: 'I would like to join this league', driver: {}, }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members, joinRequests, }); expect(result.leagueId).toBe('league-1'); expect(result.members[0].driverId).toBe(members[0].driverId); expect(result.members[0].driver.id).toBe(members[0].driver.id); expect(result.members[0].driver.name).toBe(members[0].driver.name); expect(result.members[0].role).toBe(members[0].role); expect(result.members[0].joinedAt).toBe(members[0].joinedAt); expect(result.joinRequests[0].id).toBe(joinRequests[0].id); expect(result.joinRequests[0].requestedAt).toBe(joinRequests[0].requestedAt); expect(result.joinRequests[0].message).toBe(joinRequests[0].message); }); it('should not modify the input DTOs', () => { const members: LeagueRosterMemberDTO[] = [ { driverId: 'driver-1', driver: { id: 'driver-1', name: 'Alice', iracingId: '11111', country: 'UK', joinedAt: '2023-06-01T00:00:00.000Z', }, role: 'admin', joinedAt: '2023-06-01T00:00:00.000Z', }, ]; const joinRequests: LeagueRosterJoinRequestDTO[] = [ { id: 'request-1', leagueId: 'league-1', driverId: 'driver-3', requestedAt: '2024-01-15T10:00:00.000Z', message: 'I would like to join this league', driver: {}, }, ]; const originalMembers = JSON.parse(JSON.stringify(members)); const originalRequests = JSON.parse(JSON.stringify(joinRequests)); LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members, joinRequests, }); expect(members).toEqual(originalMembers); expect(joinRequests).toEqual(originalRequests); }); }); describe('edge cases', () => { it('should handle members with missing driver field', () => { const members: LeagueRosterMemberDTO[] = [ { driverId: 'driver-1', driver: undefined as any, role: 'member', joinedAt: '2023-06-01T00:00:00.000Z', }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members, joinRequests: [], }); expect(result.members[0].driver.name).toBe('Unknown Driver'); }); it('should handle join requests with missing driver field', () => { const joinRequests: LeagueRosterJoinRequestDTO[] = [ { id: 'request-1', leagueId: 'league-1', driverId: 'driver-3', requestedAt: '2024-01-15T10:00:00.000Z', message: 'I would like to join this league', driver: undefined, }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members: [], joinRequests, }); expect(result.joinRequests[0].driver.name).toBe('Unknown Driver'); }); it('should handle join requests without message', () => { const joinRequests: LeagueRosterJoinRequestDTO[] = [ { id: 'request-1', leagueId: 'league-1', driverId: 'driver-3', requestedAt: '2024-01-15T10:00:00.000Z', driver: {}, }, ]; const result = LeagueRosterAdminViewDataBuilder.build({ leagueId: 'league-1', members: [], joinRequests, }); expect(result.joinRequests[0].message).toBeUndefined(); }); }); });