79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import type { MediaViewData } from '@/lib/view-data/MediaViewData';
|
||
import { describe, expect, it } from 'vitest';
|
||
import { MediaViewModel } from './MediaViewModel';
|
||
|
||
describe('MediaViewModel', () => {
|
||
it('creates instance from asset ViewData', () => {
|
||
const asset: MediaViewData['assets'][number] = {
|
||
id: 'media-123',
|
||
src: 'https://example.com/image.jpg',
|
||
title: 'Race Day Photo',
|
||
category: 'avatar',
|
||
date: '2023-01-15',
|
||
dimensions: '1920×1080',
|
||
};
|
||
|
||
const viewModel = new MediaViewModel(asset);
|
||
|
||
expect(viewModel.id).toBe('media-123');
|
||
expect(viewModel.src).toBe('https://example.com/image.jpg');
|
||
expect(viewModel.title).toBe('Race Day Photo');
|
||
expect(viewModel.category).toBe('avatar');
|
||
expect(viewModel.date).toBe('2023-01-15');
|
||
expect(viewModel.dimensions).toBe('1920×1080');
|
||
});
|
||
|
||
it('subtitle matches MediaCard subtitle formatting', () => {
|
||
const asset: MediaViewData['assets'][number] = {
|
||
id: 'media-123',
|
||
src: 'https://example.com/image.jpg',
|
||
title: 'Race Day Photo',
|
||
category: 'avatar',
|
||
dimensions: '1920×1080',
|
||
};
|
||
|
||
const viewModel = new MediaViewModel(asset);
|
||
|
||
expect(viewModel.subtitle).toBe('avatar • 1920×1080');
|
||
});
|
||
|
||
it('subtitle omits dimensions when missing', () => {
|
||
const asset: MediaViewData['assets'][number] = {
|
||
id: 'media-123',
|
||
src: 'https://example.com/image.jpg',
|
||
title: 'Race Day Photo',
|
||
category: 'avatar',
|
||
};
|
||
|
||
const viewModel = new MediaViewModel(asset);
|
||
|
||
expect(viewModel.subtitle).toBe('avatar');
|
||
});
|
||
|
||
it('hasMetadata reflects presence of date or dimensions', () => {
|
||
const noMeta = new MediaViewModel({
|
||
id: '1',
|
||
src: 'a.jpg',
|
||
title: 'A',
|
||
category: 'misc',
|
||
});
|
||
const withDate = new MediaViewModel({
|
||
id: '2',
|
||
src: 'b.jpg',
|
||
title: 'B',
|
||
category: 'misc',
|
||
date: '2023-01-15',
|
||
});
|
||
const withDimensions = new MediaViewModel({
|
||
id: '3',
|
||
src: 'c.jpg',
|
||
title: 'C',
|
||
category: 'misc',
|
||
dimensions: '800×600',
|
||
});
|
||
|
||
expect(noMeta.hasMetadata).toBe(false);
|
||
expect(withDate.hasMetadata).toBe(true);
|
||
expect(withDimensions.hasMetadata).toBe(true);
|
||
});
|
||
}); |