245 lines
7.6 KiB
TypeScript
245 lines
7.6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { DriverLivery } from './DriverLivery';
|
|
import { LiveryDecal } from '../value-objects/LiveryDecal';
|
|
import { DecalOverride } from '../value-objects/DecalOverride';
|
|
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
|
|
|
|
describe('DriverLivery', () => {
|
|
const validProps = {
|
|
id: 'livery-1',
|
|
driverId: 'driver-1',
|
|
gameId: 'game-1',
|
|
carId: 'car-1',
|
|
uploadedImageUrl: 'https://example.com/image.png',
|
|
};
|
|
|
|
describe('create', () => {
|
|
it('should create a valid DriverLivery', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
|
|
expect(livery.id).toBe('livery-1');
|
|
expect(livery.driverId.toString()).toBe('driver-1');
|
|
expect(livery.gameId.toString()).toBe('game-1');
|
|
expect(livery.carId.toString()).toBe('car-1');
|
|
expect(livery.uploadedImageUrl.toString()).toBe('https://example.com/image.png');
|
|
expect(livery.userDecals).toEqual([]);
|
|
expect(livery.leagueOverrides).toEqual([]);
|
|
expect(livery.isValidated()).toBe(false);
|
|
});
|
|
|
|
it('should throw error for invalid id', () => {
|
|
expect(() => DriverLivery.create({ ...validProps, id: '' })).toThrow(RacingDomainValidationError);
|
|
});
|
|
|
|
it('should throw error for invalid driverId', () => {
|
|
expect(() => DriverLivery.create({ ...validProps, driverId: '' })).toThrow(RacingDomainValidationError);
|
|
});
|
|
|
|
it('should throw error for invalid gameId', () => {
|
|
expect(() => DriverLivery.create({ ...validProps, gameId: '' })).toThrow(RacingDomainValidationError);
|
|
});
|
|
|
|
it('should throw error for invalid carId', () => {
|
|
expect(() => DriverLivery.create({ ...validProps, carId: '' })).toThrow(RacingDomainValidationError);
|
|
});
|
|
|
|
it('should throw error for invalid uploadedImageUrl', () => {
|
|
expect(() => DriverLivery.create({ ...validProps, uploadedImageUrl: '' })).toThrow(RacingDomainValidationError);
|
|
});
|
|
});
|
|
|
|
describe('addDecal', () => {
|
|
it('should add a user decal', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
const decal = LiveryDecal.create({
|
|
id: 'decal-1',
|
|
imageUrl: 'https://example.com/decal.png',
|
|
x: 0.5,
|
|
y: 0.5,
|
|
width: 0.1,
|
|
height: 0.1,
|
|
zIndex: 1,
|
|
type: 'user',
|
|
});
|
|
|
|
const updatedLivery = livery.addDecal(decal);
|
|
|
|
expect(updatedLivery.userDecals).toHaveLength(1);
|
|
expect(updatedLivery.userDecals[0]).toBe(decal);
|
|
expect(updatedLivery.updatedAt).toBeInstanceOf(Date);
|
|
});
|
|
|
|
it('should throw error for non-user decal', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
const decal = LiveryDecal.create({
|
|
id: 'decal-1',
|
|
imageUrl: 'https://example.com/decal.png',
|
|
x: 0.5,
|
|
y: 0.5,
|
|
width: 0.1,
|
|
height: 0.1,
|
|
zIndex: 1,
|
|
type: 'sponsor',
|
|
});
|
|
|
|
expect(() => livery.addDecal(decal)).toThrow(RacingDomainInvariantError);
|
|
});
|
|
});
|
|
|
|
describe('removeDecal', () => {
|
|
it('should remove a decal', () => {
|
|
const decal = LiveryDecal.create({
|
|
id: 'decal-1',
|
|
imageUrl: 'https://example.com/decal.png',
|
|
x: 0.5,
|
|
y: 0.5,
|
|
width: 0.1,
|
|
height: 0.1,
|
|
zIndex: 1,
|
|
type: 'user',
|
|
});
|
|
const livery = DriverLivery.create({ ...validProps, userDecals: [decal] });
|
|
|
|
const updatedLivery = livery.removeDecal('decal-1');
|
|
|
|
expect(updatedLivery.userDecals).toHaveLength(0);
|
|
});
|
|
|
|
it('should throw error if decal not found', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
|
|
expect(() => livery.removeDecal('nonexistent')).toThrow(RacingDomainValidationError);
|
|
});
|
|
});
|
|
|
|
describe('updateDecal', () => {
|
|
it('should update a decal', () => {
|
|
const decal = LiveryDecal.create({
|
|
id: 'decal-1',
|
|
imageUrl: 'https://example.com/decal.png',
|
|
x: 0.5,
|
|
y: 0.5,
|
|
width: 0.1,
|
|
height: 0.1,
|
|
zIndex: 1,
|
|
type: 'user',
|
|
});
|
|
const livery = DriverLivery.create({ ...validProps, userDecals: [decal] });
|
|
const updatedDecal = decal.moveTo(0.6, 0.6);
|
|
|
|
const updatedLivery = livery.updateDecal('decal-1', updatedDecal);
|
|
|
|
expect(updatedLivery.userDecals[0]).toBe(updatedDecal);
|
|
});
|
|
|
|
it('should throw error if decal not found', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
const decal = LiveryDecal.create({
|
|
id: 'decal-1',
|
|
imageUrl: 'https://example.com/decal.png',
|
|
x: 0.5,
|
|
y: 0.5,
|
|
width: 0.1,
|
|
height: 0.1,
|
|
zIndex: 1,
|
|
type: 'user',
|
|
});
|
|
|
|
expect(() => livery.updateDecal('nonexistent', decal)).toThrow(RacingDomainValidationError);
|
|
});
|
|
});
|
|
|
|
describe('setLeagueOverride', () => {
|
|
it('should add a league override', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
|
|
const updatedLivery = livery.setLeagueOverride('league-1', 'season-1', 'decal-1', 0.5, 0.5);
|
|
|
|
expect(updatedLivery.leagueOverrides).toHaveLength(1);
|
|
expect(updatedLivery.leagueOverrides[0].leagueId).toBe('league-1');
|
|
});
|
|
|
|
it('should update existing override', () => {
|
|
const override = DecalOverride.create({
|
|
leagueId: 'league-1',
|
|
seasonId: 'season-1',
|
|
decalId: 'decal-1',
|
|
newX: 0.5,
|
|
newY: 0.5,
|
|
});
|
|
const livery = DriverLivery.create({ ...validProps, leagueOverrides: [override] });
|
|
|
|
const updatedLivery = livery.setLeagueOverride('league-1', 'season-1', 'decal-1', 0.6, 0.6);
|
|
|
|
expect(updatedLivery.leagueOverrides).toHaveLength(1);
|
|
expect(updatedLivery.leagueOverrides[0].newX).toBe(0.6);
|
|
});
|
|
});
|
|
|
|
describe('removeLeagueOverride', () => {
|
|
it('should remove a league override', () => {
|
|
const override = DecalOverride.create({
|
|
leagueId: 'league-1',
|
|
seasonId: 'season-1',
|
|
decalId: 'decal-1',
|
|
newX: 0.5,
|
|
newY: 0.5,
|
|
});
|
|
const livery = DriverLivery.create({ ...validProps, leagueOverrides: [override] });
|
|
|
|
const updatedLivery = livery.removeLeagueOverride('league-1', 'season-1', 'decal-1');
|
|
|
|
expect(updatedLivery.leagueOverrides).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
describe('getOverridesFor', () => {
|
|
it('should return overrides for league and season', () => {
|
|
const override1 = DecalOverride.create({
|
|
leagueId: 'league-1',
|
|
seasonId: 'season-1',
|
|
decalId: 'decal-1',
|
|
newX: 0.5,
|
|
newY: 0.5,
|
|
});
|
|
const override2 = DecalOverride.create({
|
|
leagueId: 'league-1',
|
|
seasonId: 'season-2',
|
|
decalId: 'decal-2',
|
|
newX: 0.6,
|
|
newY: 0.6,
|
|
});
|
|
const livery = DriverLivery.create({ ...validProps, leagueOverrides: [override1, override2] });
|
|
|
|
const overrides = livery.getOverridesFor('league-1', 'season-1');
|
|
|
|
expect(overrides).toHaveLength(1);
|
|
expect(overrides[0]).toBe(override1);
|
|
});
|
|
});
|
|
|
|
describe('markAsValidated', () => {
|
|
it('should mark livery as validated', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
|
|
const validatedLivery = livery.markAsValidated();
|
|
|
|
expect(validatedLivery.isValidated()).toBe(true);
|
|
expect(validatedLivery.validatedAt).toBeInstanceOf(Date);
|
|
});
|
|
});
|
|
|
|
describe('isValidated', () => {
|
|
it('should return false when not validated', () => {
|
|
const livery = DriverLivery.create(validProps);
|
|
|
|
expect(livery.isValidated()).toBe(false);
|
|
});
|
|
|
|
it('should return true when validated', () => {
|
|
const livery = DriverLivery.create(validProps).markAsValidated();
|
|
|
|
expect(livery.isValidated()).toBe(true);
|
|
});
|
|
});
|
|
}); |