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'); }); }); });