236 lines
6.8 KiB
TypeScript
236 lines
6.8 KiB
TypeScript
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();
|
|
});
|
|
});
|
|
});
|