217 lines
6.1 KiB
TypeScript
217 lines
6.1 KiB
TypeScript
import { ExternalRatingProvenance } from './ExternalRatingProvenance';
|
|
import { IdentityDomainValidationError } from '../errors/IdentityDomainError';
|
|
|
|
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);
|
|
});
|
|
});
|
|
}); |