Files
gridpilot.gg/apps/website/lib/builders/view-data/SponsorshipRequestsViewDataBuilder.test.ts
Marc Mintel 108cfbcd65
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m55s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data tests
2026-01-22 18:22:08 +01:00

224 lines
7.4 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { SponsorshipRequestsViewDataBuilder } from './SponsorshipRequestsViewDataBuilder';
import type { GetPendingSponsorshipRequestsOutputDTO } from '@/lib/types/generated/GetPendingSponsorshipRequestsOutputDTO';
describe('SponsorshipRequestsViewDataBuilder', () => {
describe('happy paths', () => {
it('should transform GetPendingSponsorshipRequestsOutputDTO to SponsorshipRequestsViewData correctly', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'driver',
entityId: 'driver-123',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Test Sponsor',
sponsorLogo: 'logo-url',
message: 'Test message',
createdAt: '2024-01-01T10:00:00Z',
},
],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result).toEqual({
sections: [
{
entityType: 'driver',
entityId: 'driver-123',
entityName: 'Driver',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Test Sponsor',
sponsorLogoUrl: 'logo-url',
message: 'Test message',
createdAtIso: '2024-01-01T10:00:00Z',
},
],
},
],
});
});
it('should handle empty requests', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'team',
entityId: 'team-456',
requests: [],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections).toHaveLength(1);
expect(result.sections[0].requests).toHaveLength(0);
});
it('should handle multiple requests', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'season',
entityId: 'season-789',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Sponsor 1',
sponsorLogo: 'logo-1',
message: 'Message 1',
createdAt: '2024-01-01T10:00:00Z',
},
{
id: 'request-2',
sponsorId: 'sponsor-2',
sponsorName: 'Sponsor 2',
sponsorLogo: 'logo-2',
message: 'Message 2',
createdAt: '2024-01-02T10:00:00Z',
},
],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].requests).toHaveLength(2);
});
});
describe('data transformation', () => {
it('should preserve all DTO fields in the output', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'driver',
entityId: 'driver-101',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Test Sponsor',
sponsorLogo: 'logo-url',
message: 'Test message',
createdAt: '2024-01-01T10:00:00Z',
},
],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].entityType).toBe(sponsorshipRequestsDto.entityType);
expect(result.sections[0].entityId).toBe(sponsorshipRequestsDto.entityId);
expect(result.sections[0].requests[0].id).toBe(sponsorshipRequestsDto.requests[0].id);
expect(result.sections[0].requests[0].sponsorId).toBe(sponsorshipRequestsDto.requests[0].sponsorId);
expect(result.sections[0].requests[0].sponsorName).toBe(sponsorshipRequestsDto.requests[0].sponsorName);
expect(result.sections[0].requests[0].sponsorLogoUrl).toBe(sponsorshipRequestsDto.requests[0].sponsorLogo);
expect(result.sections[0].requests[0].message).toBe(sponsorshipRequestsDto.requests[0].message);
expect(result.sections[0].requests[0].createdAtIso).toBe(sponsorshipRequestsDto.requests[0].createdAt);
});
it('should not modify the input DTO', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'team',
entityId: 'team-102',
requests: [],
};
const originalDto = { ...sponsorshipRequestsDto };
SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(sponsorshipRequestsDto).toEqual(originalDto);
});
});
describe('edge cases', () => {
it('should handle requests without sponsor logo', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'driver',
entityId: 'driver-103',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Test Sponsor',
sponsorLogo: null,
message: 'Test message',
createdAt: '2024-01-01T10:00:00Z',
},
],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].requests[0].sponsorLogoUrl).toBeNull();
});
it('should handle requests without message', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'driver',
entityId: 'driver-104',
requests: [
{
id: 'request-1',
sponsorId: 'sponsor-1',
sponsorName: 'Test Sponsor',
sponsorLogo: 'logo-url',
message: null,
createdAt: '2024-01-01T10:00:00Z',
},
],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].requests[0].message).toBeNull();
});
it('should handle different entity types', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'team',
entityId: 'team-105',
requests: [],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].entityType).toBe('team');
});
it('should handle entity name for driver type', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'driver',
entityId: 'driver-106',
requests: [],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].entityName).toBe('Driver');
});
it('should handle entity name for team type', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'team',
entityId: 'team-107',
requests: [],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].entityName).toBe('team');
});
it('should handle entity name for season type', () => {
const sponsorshipRequestsDto: GetPendingSponsorshipRequestsOutputDTO = {
entityType: 'season',
entityId: 'season-108',
requests: [],
};
const result = SponsorshipRequestsViewDataBuilder.build(sponsorshipRequestsDto);
expect(result.sections[0].entityName).toBe('season');
});
});
});