Files
gridpilot.gg/core/identity/domain/value-objects/ExternalRatingProvenance.test.ts
2026-01-16 19:46:49 +01:00

217 lines
6.1 KiB
TypeScript

import { IdentityDomainValidationError } from '../errors/IdentityDomainError';
import { ExternalRatingProvenance } from './ExternalRatingProvenance';
describe('ExternalRatingProvenance', () => {
describe('create', () => {
it('should create a valid provenance with default verified=false', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
});
expect(provenance.source).toBe('iracing');
expect(provenance.lastSyncedAt).toBe(now);
expect(provenance.verified).toBe(false);
});
it('should create a valid provenance with verified=true', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
expect(provenance.verified).toBe(true);
});
it('should trim source string', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.create({
source: ' iracing ',
lastSyncedAt: now,
});
expect(provenance.source).toBe('iracing');
});
it('should throw error for empty source', () => {
const now = new Date();
expect(() =>
ExternalRatingProvenance.create({
source: '',
lastSyncedAt: now,
})
).toThrow(IdentityDomainValidationError);
expect(() =>
ExternalRatingProvenance.create({
source: ' ',
lastSyncedAt: now,
})
).toThrow(IdentityDomainValidationError);
});
it('should throw error for invalid date', () => {
expect(() =>
ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: new Date('invalid'),
})
).toThrow(IdentityDomainValidationError);
});
});
describe('restore', () => {
it('should restore provenance from stored props', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.restore({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
expect(provenance.source).toBe('iracing');
expect(provenance.lastSyncedAt).toBe(now);
expect(provenance.verified).toBe(true);
});
it('should default verified to false when not provided', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.restore({
source: 'iracing',
lastSyncedAt: now,
});
expect(provenance.verified).toBe(false);
});
});
describe('equals', () => {
it('should return true for identical provenance', () => {
const now = new Date();
const p1 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
const p2 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
expect(p1.equals(p2)).toBe(true);
});
it('should return false for different source', () => {
const now = new Date();
const p1 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
});
const p2 = ExternalRatingProvenance.create({
source: 'simracing',
lastSyncedAt: now,
});
expect(p1.equals(p2)).toBe(false);
});
it('should return false for different lastSyncedAt', () => {
const p1 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: new Date('2024-01-01'),
});
const p2 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: new Date('2024-01-02'),
});
expect(p1.equals(p2)).toBe(false);
});
it('should return false for different verified', () => {
const now = new Date();
const p1 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
const p2 = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: false,
});
expect(p1.equals(p2)).toBe(false);
});
});
describe('toString', () => {
it('should return string representation', () => {
const now = new Date('2024-01-01T00:00:00Z');
const provenance = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
expect(provenance.toString()).toBe('iracing:2024-01-01T00:00:00.000Z:verified');
});
});
describe('markVerified', () => {
it('should return new provenance with verified=true', () => {
const now = new Date();
const original = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: false,
});
const verified = original.markVerified();
expect(verified.verified).toBe(true);
expect(verified.source).toBe(original.source);
expect(verified.lastSyncedAt).toBe(original.lastSyncedAt);
expect(original.verified).toBe(false); // Original unchanged
});
});
describe('updateLastSyncedAt', () => {
it('should return new provenance with updated date', () => {
const now = new Date('2024-01-01');
const newDate = new Date('2024-01-02');
const original = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
const updated = original.updateLastSyncedAt(newDate);
expect(updated.lastSyncedAt).toBe(newDate);
expect(updated.source).toBe(original.source);
expect(updated.verified).toBe(original.verified);
expect(original.lastSyncedAt).toBe(now); // Original unchanged
});
});
describe('props', () => {
it('should return correct props object', () => {
const now = new Date();
const provenance = ExternalRatingProvenance.create({
source: 'iracing',
lastSyncedAt: now,
verified: true,
});
const props = provenance.props;
expect(props.source).toBe('iracing');
expect(props.lastSyncedAt).toBe(now);
expect(props.verified).toBe(true);
});
});
});