256 lines
8.1 KiB
TypeScript
256 lines
8.1 KiB
TypeScript
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();
|
|
});
|
|
});
|
|
});
|