import { describe, it, expect } from 'vitest'; import { GenerateAvatarsViewDataBuilder } from './GenerateAvatarsViewDataBuilder'; import type { RequestAvatarGenerationOutputDTO } from '@/lib/types/generated/RequestAvatarGenerationOutputDTO'; describe('GenerateAvatarsViewDataBuilder', () => { describe('happy paths', () => { it('should transform RequestAvatarGenerationOutputDTO to GenerateAvatarsViewData correctly', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1', 'avatar-url-2', 'avatar-url-3'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result).toEqual({ success: true, avatarUrls: ['avatar-url-1', 'avatar-url-2', 'avatar-url-3'], errorMessage: null, }); }); it('should handle empty avatar URLs', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: [], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toHaveLength(0); }); it('should handle single avatar URL', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toHaveLength(1); expect(result.avatarUrls[0]).toBe('avatar-url-1'); }); it('should handle multiple avatar URLs', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1', 'avatar-url-2', 'avatar-url-3', 'avatar-url-4', 'avatar-url-5'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toHaveLength(5); }); }); describe('data transformation', () => { it('should preserve all DTO fields in the output', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1', 'avatar-url-2'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.success).toBe(requestAvatarGenerationOutputDto.success); expect(result.avatarUrls).toEqual(requestAvatarGenerationOutputDto.avatarUrls); expect(result.errorMessage).toBe(requestAvatarGenerationOutputDto.errorMessage); }); it('should not modify the input DTO', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1'], errorMessage: null, }; const originalDto = { ...requestAvatarGenerationOutputDto }; GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(requestAvatarGenerationOutputDto).toEqual(originalDto); }); }); describe('edge cases', () => { it('should handle success false', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: false, avatarUrls: [], errorMessage: 'Generation failed', }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.success).toBe(false); }); it('should handle error message', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: false, avatarUrls: [], errorMessage: 'Invalid input data', }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.errorMessage).toBe('Invalid input data'); }); it('should handle null error message', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.errorMessage).toBeNull(); }); it('should handle undefined avatarUrls', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: undefined, errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toEqual([]); }); it('should handle empty string avatar URLs', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['', 'avatar-url-1', ''], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toEqual(['', 'avatar-url-1', '']); }); it('should handle special characters in avatar URLs', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: ['avatar-url-1?param=value', 'avatar-url-2#anchor', 'avatar-url-3?query=1&test=2'], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toEqual([ 'avatar-url-1?param=value', 'avatar-url-2#anchor', 'avatar-url-3?query=1&test=2', ]); }); it('should handle very long avatar URLs', () => { const longUrl = 'https://example.com/avatars/' + 'a'.repeat(1000) + '.png'; const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: [longUrl], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls[0]).toBe(longUrl); }); it('should handle avatar URLs with special characters', () => { const requestAvatarGenerationOutputDto: RequestAvatarGenerationOutputDTO = { success: true, avatarUrls: [ 'avatar-url-1?name=John%20Doe', 'avatar-url-2?email=test@example.com', 'avatar-url-3?query=hello%20world', ], errorMessage: null, }; const result = GenerateAvatarsViewDataBuilder.build(requestAvatarGenerationOutputDto); expect(result.avatarUrls).toEqual([ 'avatar-url-1?name=John%20Doe', 'avatar-url-2?email=test@example.com', 'avatar-url-3?query=hello%20world', ]); }); }); });