view data fixes
This commit is contained in:
@@ -1,138 +1,79 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { MediaViewModel } from './MediaViewModel';
|
||||
import type { MediaViewData } from '@/lib/view-data/MediaViewData';
|
||||
|
||||
describe('MediaViewModel', () => {
|
||||
it('should create instance with all properties', () => {
|
||||
const dto = {
|
||||
it('creates instance from asset ViewData', () => {
|
||||
const asset: MediaViewData['assets'][number] = {
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
src: 'https://example.com/image.jpg',
|
||||
title: 'Race Day Photo',
|
||||
category: 'avatar',
|
||||
uploadedAt: '2023-01-15T00:00:00.000Z',
|
||||
size: 2048000,
|
||||
date: '2023-01-15',
|
||||
dimensions: '1920×1080',
|
||||
};
|
||||
|
||||
const viewModel = new MediaViewModel(dto);
|
||||
const viewModel = new MediaViewModel(asset);
|
||||
|
||||
expect(viewModel.id).toBe('media-123');
|
||||
expect(viewModel.url).toBe('https://example.com/image.jpg');
|
||||
expect(viewModel.type).toBe('image');
|
||||
expect(viewModel.src).toBe('https://example.com/image.jpg');
|
||||
expect(viewModel.title).toBe('Race Day Photo');
|
||||
expect(viewModel.category).toBe('avatar');
|
||||
expect(viewModel.uploadedAt).toEqual(new Date('2023-01-15'));
|
||||
expect(viewModel.size).toBe(2048000);
|
||||
expect(viewModel.date).toBe('2023-01-15');
|
||||
expect(viewModel.dimensions).toBe('1920×1080');
|
||||
});
|
||||
|
||||
it('should create instance without optional properties', () => {
|
||||
const dto = {
|
||||
it('subtitle matches MediaCard subtitle formatting', () => {
|
||||
const asset: MediaViewData['assets'][number] = {
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: '2023-01-15T00:00:00.000Z',
|
||||
src: 'https://example.com/image.jpg',
|
||||
title: 'Race Day Photo',
|
||||
category: 'avatar',
|
||||
dimensions: '1920×1080',
|
||||
};
|
||||
|
||||
const viewModel = new MediaViewModel(dto);
|
||||
const viewModel = new MediaViewModel(asset);
|
||||
|
||||
expect(viewModel.category).toBeUndefined();
|
||||
expect(viewModel.size).toBeUndefined();
|
||||
expect(viewModel.subtitle).toBe('avatar • 1920×1080');
|
||||
});
|
||||
|
||||
it('should return "Unknown" for formattedSize when size is undefined', () => {
|
||||
const viewModel = new MediaViewModel({
|
||||
it('subtitle omits dimensions when missing', () => {
|
||||
const asset: MediaViewData['assets'][number] = {
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
});
|
||||
src: 'https://example.com/image.jpg',
|
||||
title: 'Race Day Photo',
|
||||
category: 'avatar',
|
||||
};
|
||||
|
||||
expect(viewModel.formattedSize).toBe('Unknown');
|
||||
const viewModel = new MediaViewModel(asset);
|
||||
|
||||
expect(viewModel.subtitle).toBe('avatar');
|
||||
});
|
||||
|
||||
it('should format size in KB when less than 1 MB', () => {
|
||||
const viewModel = new MediaViewModel({
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
size: 512000, // 500 KB
|
||||
});
|
||||
|
||||
expect(viewModel.formattedSize).toBe('500.00 KB');
|
||||
});
|
||||
|
||||
it('should format size in MB when 1 MB or larger', () => {
|
||||
const viewModel = new MediaViewModel({
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
size: 2048000, // 2 MB in base-10, ~1.95 MB in base-2
|
||||
});
|
||||
|
||||
expect(viewModel.formattedSize).toBe('1.95 MB');
|
||||
});
|
||||
|
||||
it('should handle very small file sizes', () => {
|
||||
const viewModel = new MediaViewModel({
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
size: 1024, // 1 KB
|
||||
});
|
||||
|
||||
expect(viewModel.formattedSize).toBe('1.00 KB');
|
||||
});
|
||||
|
||||
it('should handle very large file sizes', () => {
|
||||
const viewModel = new MediaViewModel({
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/video.mp4',
|
||||
type: 'video',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
size: 104857600, // 100 MB
|
||||
});
|
||||
|
||||
expect(viewModel.formattedSize).toBe('100.00 MB');
|
||||
});
|
||||
|
||||
it('should support all media types', () => {
|
||||
const imageVm = new MediaViewModel({
|
||||
it('hasMetadata reflects presence of date or dimensions', () => {
|
||||
const noMeta = new MediaViewModel({
|
||||
id: '1',
|
||||
url: 'image.jpg',
|
||||
type: 'image',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
src: 'a.jpg',
|
||||
title: 'A',
|
||||
category: 'misc',
|
||||
});
|
||||
const videoVm = new MediaViewModel({
|
||||
const withDate = new MediaViewModel({
|
||||
id: '2',
|
||||
url: 'video.mp4',
|
||||
type: 'video',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
src: 'b.jpg',
|
||||
title: 'B',
|
||||
category: 'misc',
|
||||
date: '2023-01-15',
|
||||
});
|
||||
const docVm = new MediaViewModel({
|
||||
const withDimensions = new MediaViewModel({
|
||||
id: '3',
|
||||
url: 'doc.pdf',
|
||||
type: 'document',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
src: 'c.jpg',
|
||||
title: 'C',
|
||||
category: 'misc',
|
||||
dimensions: '800×600',
|
||||
});
|
||||
|
||||
expect(imageVm.type).toBe('image');
|
||||
expect(videoVm.type).toBe('video');
|
||||
expect(docVm.type).toBe('document');
|
||||
});
|
||||
|
||||
it('should support all media categories', () => {
|
||||
const categories = ['avatar', 'team-logo', 'league-cover', 'race-result'] as const;
|
||||
|
||||
categories.forEach(category => {
|
||||
const viewModel = new MediaViewModel({
|
||||
id: 'media-123',
|
||||
url: 'https://example.com/image.jpg',
|
||||
type: 'image',
|
||||
category,
|
||||
uploadedAt: new Date().toISOString(),
|
||||
});
|
||||
|
||||
expect(viewModel.category).toBe(category);
|
||||
});
|
||||
expect(noMeta.hasMetadata).toBe(false);
|
||||
expect(withDate.hasMetadata).toBe(true);
|
||||
expect(withDimensions.hasMetadata).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user