224 lines
7.6 KiB
TypeScript
224 lines
7.6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { SponsorshipRequestsPageViewDataBuilder } from './SponsorshipRequestsPageViewDataBuilder';
|
|
import type { GetPendingSponsorshipRequestsOutputDTO } from '@/lib/types/generated/GetPendingSponsorshipRequestsOutputDTO';
|
|
|
|
describe('SponsorshipRequestsPageViewDataBuilder', () => {
|
|
describe('happy paths', () => {
|
|
it('should transform GetPendingSponsorshipRequestsOutputDTO to SponsorshipRequestsViewData correctly', () => {
|
|
const sponsorshipRequestsPageDto: 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 = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
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 sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'team',
|
|
entityId: 'team-456',
|
|
requests: [],
|
|
};
|
|
|
|
const result = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections).toHaveLength(1);
|
|
expect(result.sections[0].requests).toHaveLength(0);
|
|
});
|
|
|
|
it('should handle multiple requests', () => {
|
|
const sponsorshipRequestsPageDto: 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 = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].requests).toHaveLength(2);
|
|
});
|
|
});
|
|
|
|
describe('data transformation', () => {
|
|
it('should preserve all DTO fields in the output', () => {
|
|
const sponsorshipRequestsPageDto: 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 = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].entityType).toBe(sponsorshipRequestsPageDto.entityType);
|
|
expect(result.sections[0].entityId).toBe(sponsorshipRequestsPageDto.entityId);
|
|
expect(result.sections[0].requests[0].id).toBe(sponsorshipRequestsPageDto.requests[0].id);
|
|
expect(result.sections[0].requests[0].sponsorId).toBe(sponsorshipRequestsPageDto.requests[0].sponsorId);
|
|
expect(result.sections[0].requests[0].sponsorName).toBe(sponsorshipRequestsPageDto.requests[0].sponsorName);
|
|
expect(result.sections[0].requests[0].sponsorLogoUrl).toBe(sponsorshipRequestsPageDto.requests[0].sponsorLogo);
|
|
expect(result.sections[0].requests[0].message).toBe(sponsorshipRequestsPageDto.requests[0].message);
|
|
expect(result.sections[0].requests[0].createdAtIso).toBe(sponsorshipRequestsPageDto.requests[0].createdAt);
|
|
});
|
|
|
|
it('should not modify the input DTO', () => {
|
|
const sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'team',
|
|
entityId: 'team-102',
|
|
requests: [],
|
|
};
|
|
|
|
const originalDto = { ...sponsorshipRequestsPageDto };
|
|
SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(sponsorshipRequestsPageDto).toEqual(originalDto);
|
|
});
|
|
});
|
|
|
|
describe('edge cases', () => {
|
|
it('should handle requests without sponsor logo', () => {
|
|
const sponsorshipRequestsPageDto: 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 = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].requests[0].sponsorLogoUrl).toBeNull();
|
|
});
|
|
|
|
it('should handle requests without message', () => {
|
|
const sponsorshipRequestsPageDto: 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 = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].requests[0].message).toBeNull();
|
|
});
|
|
|
|
it('should handle different entity types', () => {
|
|
const sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'team',
|
|
entityId: 'team-105',
|
|
requests: [],
|
|
};
|
|
|
|
const result = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].entityType).toBe('team');
|
|
});
|
|
|
|
it('should handle entity name for driver type', () => {
|
|
const sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'driver',
|
|
entityId: 'driver-106',
|
|
requests: [],
|
|
};
|
|
|
|
const result = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].entityName).toBe('driver');
|
|
});
|
|
|
|
it('should handle entity name for team type', () => {
|
|
const sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'team',
|
|
entityId: 'team-107',
|
|
requests: [],
|
|
};
|
|
|
|
const result = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].entityName).toBe('team');
|
|
});
|
|
|
|
it('should handle entity name for season type', () => {
|
|
const sponsorshipRequestsPageDto: GetPendingSponsorshipRequestsOutputDTO = {
|
|
entityType: 'season',
|
|
entityId: 'season-108',
|
|
requests: [],
|
|
};
|
|
|
|
const result = SponsorshipRequestsPageViewDataBuilder.build(sponsorshipRequestsPageDto);
|
|
|
|
expect(result.sections[0].entityName).toBe('season');
|
|
});
|
|
});
|
|
});
|