import { describe, it, expect } from 'vitest'; import { LeagueSponsorshipsViewDataBuilder } from './LeagueSponsorshipsViewDataBuilder'; import type { LeagueSponsorshipsApiDto } from '@/lib/types/tbd/LeagueSponsorshipsApiDto'; describe('LeagueSponsorshipsViewDataBuilder', () => { describe('happy paths', () => { it('should transform LeagueSponsorshipsApiDto to LeagueSponsorshipsViewData correctly', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-123', league: { id: 'league-123', name: 'Test League', }, sponsorshipSlots: [ { id: 'slot-1', name: 'Primary Sponsor', price: 1000, status: 'available', }, ], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Test Sponsor', sponsorLogo: 'logo-url', message: 'Test message', requestedAt: '2024-01-01T10:00:00Z', status: 'pending', }, ], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result).toEqual({ leagueId: 'league-123', activeTab: 'overview', onTabChange: expect.any(Function), league: { id: 'league-123', name: 'Test League', }, sponsorshipSlots: [ { id: 'slot-1', name: 'Primary Sponsor', price: 1000, status: 'available', }, ], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Test Sponsor', sponsorLogo: 'logo-url', message: 'Test message', requestedAt: '2024-01-01T10:00:00Z', status: 'pending', formattedRequestedAt: expect.any(String), statusLabel: expect.any(String), }, ], }); }); it('should handle empty sponsorship requests', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-456', league: { id: 'league-456', name: 'Test League', }, sponsorshipSlots: [ { id: 'slot-1', name: 'Primary Sponsor', price: 1000, status: 'available', }, ], sponsorshipRequests: [], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result.sponsorshipRequests).toHaveLength(0); }); it('should handle multiple sponsorship requests', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-789', league: { id: 'league-789', name: 'Test League', }, sponsorshipSlots: [], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Sponsor 1', sponsorLogo: 'logo-1', message: 'Message 1', requestedAt: '2024-01-01T10:00:00Z', status: 'pending', }, { id: 'request-2', sponsorId: 'sponsor-2', sponsorName: 'Sponsor 2', sponsorLogo: 'logo-2', message: 'Message 2', requestedAt: '2024-01-02T10:00:00Z', status: 'approved', }, ], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result.sponsorshipRequests).toHaveLength(2); }); }); describe('data transformation', () => { it('should preserve all DTO fields in the output', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-101', league: { id: 'league-101', name: 'Test League', }, sponsorshipSlots: [ { id: 'slot-1', name: 'Primary Sponsor', price: 1000, status: 'available', }, ], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Test Sponsor', sponsorLogo: 'logo-url', message: 'Test message', requestedAt: '2024-01-01T10:00:00Z', status: 'pending', }, ], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result.leagueId).toBe(leagueSponsorshipsApiDto.leagueId); expect(result.league).toEqual(leagueSponsorshipsApiDto.league); expect(result.sponsorshipSlots).toEqual(leagueSponsorshipsApiDto.sponsorshipSlots); }); it('should not modify the input DTO', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-102', league: { id: 'league-102', name: 'Test League', }, sponsorshipSlots: [], sponsorshipRequests: [], }; const originalDto = { ...leagueSponsorshipsApiDto }; LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(leagueSponsorshipsApiDto).toEqual(originalDto); }); }); describe('edge cases', () => { it('should handle requests without sponsor logo', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-103', league: { id: 'league-103', name: 'Test League', }, sponsorshipSlots: [], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Test Sponsor', sponsorLogo: null, message: 'Test message', requestedAt: '2024-01-01T10:00:00Z', status: 'pending', }, ], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result.sponsorshipRequests[0].sponsorLogoUrl).toBeNull(); }); it('should handle requests without message', () => { const leagueSponsorshipsApiDto: LeagueSponsorshipsApiDto = { leagueId: 'league-104', league: { id: 'league-104', name: 'Test League', }, sponsorshipSlots: [], sponsorshipRequests: [ { id: 'request-1', sponsorId: 'sponsor-1', sponsorName: 'Test Sponsor', sponsorLogo: 'logo-url', message: null, requestedAt: '2024-01-01T10:00:00Z', status: 'pending', }, ], }; const result = LeagueSponsorshipsViewDataBuilder.build(leagueSponsorshipsApiDto); expect(result.sponsorshipRequests[0].message).toBeNull(); }); }); });