201 lines
6.8 KiB
TypeScript
201 lines
6.8 KiB
TypeScript
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',
|
|
]);
|
|
});
|
|
});
|
|
});
|