view data tests
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user