Files
gridpilot.gg/core/media/domain/entities/Avatar.test.ts
Marc Mintel 0a37454171
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m51s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data tests
2026-01-22 17:28:09 +01:00

183 lines
5.1 KiB
TypeScript

import { Avatar } from './Avatar';
import { MediaUrl } from '../value-objects/MediaUrl';
describe('Avatar', () => {
describe('create', () => {
it('creates a new avatar with required properties', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
});
expect(avatar.id).toBe('avatar-1');
expect(avatar.driverId).toBe('driver-1');
expect(avatar.mediaUrl).toBeInstanceOf(MediaUrl);
expect(avatar.mediaUrl.value).toBe('https://example.com/avatar.png');
expect(avatar.isActive).toBe(true);
expect(avatar.selectedAt).toBeInstanceOf(Date);
});
it('throws error when driverId is missing', () => {
expect(() =>
Avatar.create({
id: 'avatar-1',
driverId: '',
mediaUrl: 'https://example.com/avatar.png',
})
).toThrow('Driver ID is required');
});
it('throws error when mediaUrl is missing', () => {
expect(() =>
Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: '',
})
).toThrow('Media URL is required');
});
it('throws error when mediaUrl is invalid', () => {
expect(() =>
Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'invalid-url',
})
).toThrow();
});
});
describe('reconstitute', () => {
it('reconstitutes an avatar from props', () => {
const selectedAt = new Date('2024-01-01T00:00:00.000Z');
const avatar = Avatar.reconstitute({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
selectedAt,
isActive: true,
});
expect(avatar.id).toBe('avatar-1');
expect(avatar.driverId).toBe('driver-1');
expect(avatar.mediaUrl.value).toBe('https://example.com/avatar.png');
expect(avatar.selectedAt).toEqual(selectedAt);
expect(avatar.isActive).toBe(true);
});
it('reconstitutes an inactive avatar', () => {
const avatar = Avatar.reconstitute({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
selectedAt: new Date(),
isActive: false,
});
expect(avatar.isActive).toBe(false);
});
});
describe('deactivate', () => {
it('deactivates an active avatar', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
});
expect(avatar.isActive).toBe(true);
avatar.deactivate();
expect(avatar.isActive).toBe(false);
});
it('can deactivate an already inactive avatar', () => {
const avatar = Avatar.reconstitute({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
selectedAt: new Date(),
isActive: false,
});
avatar.deactivate();
expect(avatar.isActive).toBe(false);
});
});
describe('toProps', () => {
it('returns correct props for a new avatar', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
});
const props = avatar.toProps();
expect(props.id).toBe('avatar-1');
expect(props.driverId).toBe('driver-1');
expect(props.mediaUrl).toBe('https://example.com/avatar.png');
expect(props.selectedAt).toBeInstanceOf(Date);
expect(props.isActive).toBe(true);
});
it('returns correct props for an inactive avatar', () => {
const selectedAt = new Date('2024-01-01T00:00:00.000Z');
const avatar = Avatar.reconstitute({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
selectedAt,
isActive: false,
});
const props = avatar.toProps();
expect(props.id).toBe('avatar-1');
expect(props.driverId).toBe('driver-1');
expect(props.mediaUrl).toBe('https://example.com/avatar.png');
expect(props.selectedAt).toEqual(selectedAt);
expect(props.isActive).toBe(false);
});
});
describe('value object validation', () => {
it('validates mediaUrl as MediaUrl value object', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'https://example.com/avatar.png',
});
expect(avatar.mediaUrl).toBeInstanceOf(MediaUrl);
expect(avatar.mediaUrl.value).toBe('https://example.com/avatar.png');
});
it('accepts data URI for mediaUrl', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: 'data:image/png;base64,abc',
});
expect(avatar.mediaUrl.value).toBe('data:image/png;base64,abc');
});
it('accepts root-relative path for mediaUrl', () => {
const avatar = Avatar.create({
id: 'avatar-1',
driverId: 'driver-1',
mediaUrl: '/images/avatar.png',
});
expect(avatar.mediaUrl.value).toBe('/images/avatar.png');
});
});
});