rating
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user