Files
gridpilot.gg/core/identity/domain/value-objects/ExternalRating.test.ts
2025-12-29 22:27:33 +01:00

99 lines
3.7 KiB
TypeScript

import { ExternalRating } from './ExternalRating';
import { GameKey } from './GameKey';
import { IdentityDomainValidationError } from '../errors/IdentityDomainError';
describe('ExternalRating', () => {
describe('create', () => {
it('should create valid external rating', () => {
const gameKey = GameKey.create('iracing');
const rating = ExternalRating.create(gameKey, 'iRating', 2500);
expect(rating.gameKey.value).toBe('iracing');
expect(rating.type).toBe('iRating');
expect(rating.value).toBe(2500);
});
it('should create rating with safety rating', () => {
const gameKey = GameKey.create('iracing');
const rating = ExternalRating.create(gameKey, 'safetyRating', 2.5);
expect(rating.type).toBe('safetyRating');
expect(rating.value).toBe(2.5);
});
it('should throw for empty type', () => {
const gameKey = GameKey.create('iracing');
expect(() => ExternalRating.create(gameKey, '', 2500)).toThrow(IdentityDomainValidationError);
expect(() => ExternalRating.create(gameKey, ' ', 2500)).toThrow(IdentityDomainValidationError);
});
it('should throw for non-numeric value', () => {
const gameKey = GameKey.create('iracing');
expect(() => ExternalRating.create(gameKey, 'iRating', '2500' as unknown as number)).toThrow();
expect(() => ExternalRating.create(gameKey, 'iRating', null as unknown as number)).toThrow();
});
it('should trim whitespace from type', () => {
const gameKey = GameKey.create('iracing');
const rating = ExternalRating.create(gameKey, ' iRating ', 2500);
expect(rating.type).toBe('iRating');
});
});
describe('equals', () => {
it('should return true for same gameKey, type, and value', () => {
const gameKey1 = GameKey.create('iracing');
const gameKey2 = GameKey.create('iracing');
const rating1 = ExternalRating.create(gameKey1, 'iRating', 2500);
const rating2 = ExternalRating.create(gameKey2, 'iRating', 2500);
expect(rating1.equals(rating2)).toBe(true);
});
it('should return false for different gameKeys', () => {
const gameKey1 = GameKey.create('iracing');
const gameKey2 = GameKey.create('acc');
const rating1 = ExternalRating.create(gameKey1, 'iRating', 2500);
const rating2 = ExternalRating.create(gameKey2, 'iRating', 2500);
expect(rating1.equals(rating2)).toBe(false);
});
it('should return false for different types', () => {
const gameKey = GameKey.create('iracing');
const rating1 = ExternalRating.create(gameKey, 'iRating', 2500);
const rating2 = ExternalRating.create(gameKey, 'safetyRating', 2500);
expect(rating1.equals(rating2)).toBe(false);
});
it('should return false for different values', () => {
const gameKey = GameKey.create('iracing');
const rating1 = ExternalRating.create(gameKey, 'iRating', 2500);
const rating2 = ExternalRating.create(gameKey, 'iRating', 2600);
expect(rating1.equals(rating2)).toBe(false);
});
});
describe('props', () => {
it('should expose props correctly', () => {
const gameKey = GameKey.create('iracing');
const rating = ExternalRating.create(gameKey, 'iRating', 2500);
const props = rating.props;
expect(props.gameKey.value).toBe('iracing');
expect(props.type).toBe('iRating');
expect(props.value).toBe(2500);
});
});
describe('toString', () => {
it('should return string representation', () => {
const gameKey = GameKey.create('iracing');
const rating = ExternalRating.create(gameKey, 'iRating', 2500);
expect(rating.toString()).toBe('iracing:iRating=2500');
});
});
});