Files
gridpilot.gg/apps/website/lib/view-models/AvatarViewModel.test.ts
2026-01-24 01:25:46 +01:00

113 lines
3.4 KiB
TypeScript

import type { AvatarViewData } from '@/lib/view-data/AvatarViewData';
import { describe, expect, it } from 'vitest';
import { AvatarViewModel } from './AvatarViewModel';
describe('AvatarViewModel', () => {
describe('constructor', () => {
it('should create instance with valid AvatarViewData', () => {
const viewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.bufferBase64).toBe('dGVzdC1pbWFnZS1kYXRh');
expect(viewModel.contentTypeLabel).toBe('PNG');
expect(viewModel.hasValidData).toBe(true);
});
it('should create instance with empty buffer', () => {
const viewData: AvatarViewData = {
buffer: '',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.bufferBase64).toBe('');
expect(viewModel.contentTypeLabel).toBe('PNG');
expect(viewModel.hasValidData).toBe(false);
});
});
describe('derived fields', () => {
it('should derive bufferBase64 correctly', () => {
const viewData: AvatarViewData = {
buffer: 'dGVzdA==',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.bufferBase64).toBe('dGVzdA==');
});
it('should derive contentTypeLabel correctly', () => {
const viewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.contentTypeLabel).toBe('PNG');
});
it('should derive contentTypeLabel for different content types', () => {
const pngViewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/png',
};
const pngViewModel = new AvatarViewModel(pngViewData);
expect(pngViewModel.contentTypeLabel).toBe('PNG');
const jpegViewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/jpeg',
};
const jpegViewModel = new AvatarViewModel(jpegViewData);
expect(jpegViewModel.contentTypeLabel).toBe('JPEG');
const svgViewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/svg+xml',
};
const svgViewModel = new AvatarViewModel(svgViewData);
expect(svgViewModel.contentTypeLabel).toBe('SVG+XML');
});
it('should derive hasValidData as true when buffer has content', () => {
const viewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.hasValidData).toBe(true);
});
it('should derive hasValidData as false when buffer is empty', () => {
const viewData: AvatarViewData = {
buffer: '',
contentType: 'image/png',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.hasValidData).toBe(false);
});
it('should derive hasValidData as false when contentType is empty', () => {
const viewData: AvatarViewData = {
buffer: 'dGVzdC1pbWFnZS1kYXRh',
contentType: '',
};
const viewModel = new AvatarViewModel(viewData);
expect(viewModel.hasValidData).toBe(false);
});
});
});