Files
gridpilot.gg/core/racing/domain/entities/Driver.test.ts
2025-12-17 00:33:13 +01:00

155 lines
4.0 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { Driver } from './Driver';
describe('Driver', () => {
it('should create a driver', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
bio: 'A passionate racer.',
joinedAt: new Date('2020-01-01'),
});
expect(driver.id).toBe('driver1');
expect(driver.iracingId.toString()).toBe('12345');
expect(driver.name.toString()).toBe('John Doe');
expect(driver.country.toString()).toBe('US');
expect(driver.bio?.toString()).toBe('A passionate racer.');
expect(driver.joinedAt.toDate()).toEqual(new Date('2020-01-01'));
});
it('should create driver without bio', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
});
expect(driver.bio).toBeUndefined();
});
it('should create driver with default joinedAt', () => {
const before = new Date();
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
});
const after = new Date();
expect(driver.joinedAt.toDate().getTime()).toBeGreaterThanOrEqual(before.getTime());
expect(driver.joinedAt.toDate().getTime()).toBeLessThanOrEqual(after.getTime());
});
it('should update name', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
});
const updated = driver.update({ name: 'Jane Doe' });
expect(updated.name.toString()).toBe('Jane Doe');
expect(updated.id).toBe('driver1');
});
it('should update country', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
});
const updated = driver.update({ country: 'CA' });
expect(updated.country.toString()).toBe('CA');
});
it('should update bio', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
bio: 'Old bio',
});
const updated = driver.update({ bio: 'New bio' });
expect(updated.bio?.toString()).toBe('New bio');
});
it('should remove bio', () => {
const driver = Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
bio: 'Old bio',
});
const updated = driver.update({ bio: undefined });
expect(updated.bio).toBeUndefined();
});
it('should throw on invalid id', () => {
expect(() => Driver.create({
id: '',
iracingId: '12345',
name: 'John Doe',
country: 'US',
})).toThrow('Driver ID is required');
});
it('should throw on invalid iracingId', () => {
expect(() => Driver.create({
id: 'driver1',
iracingId: '',
name: 'John Doe',
country: 'US',
})).toThrow('iRacing ID is required');
});
it('should throw on invalid name', () => {
expect(() => Driver.create({
id: 'driver1',
iracingId: '12345',
name: '',
country: 'US',
})).toThrow('Driver name is required');
});
it('should throw on invalid country', () => {
expect(() => Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: '',
})).toThrow('Country code is required');
});
it('should throw on invalid country format', () => {
expect(() => Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'U',
})).toThrow('Country must be a valid ISO code (2-3 letters)');
});
it('should throw on future joinedAt', () => {
const future = new Date();
future.setFullYear(future.getFullYear() + 1);
expect(() => Driver.create({
id: 'driver1',
iracingId: '12345',
name: 'John Doe',
country: 'US',
joinedAt: future,
})).toThrow('Joined date cannot be in the future');
});
});