Files
gridpilot.gg/core/analytics/domain/entities/PageView.test.ts
2025-12-23 19:26:59 +01:00

76 lines
2.5 KiB
TypeScript

import { PageView, type EntityType } from '@core/analytics/domain/entities/PageView';
describe('PageView', () => {
const now = new Date('2025-01-01T12:00:00.000Z');
const createValid = (overrides?: Partial<Parameters<typeof PageView.create>[0]>) => {
return PageView.create({
id: 'pv_1',
entityType: 'league',
entityId: 'entity_123',
visitorType: 'anonymous',
sessionId: 'session_1',
timestamp: now,
...overrides,
});
};
it('creates a PageView and exposes value-object values', () => {
const pv = createValid({
id: ' pv_123 ',
entityId: ' entity_456 ',
sessionId: ' session_789 ',
});
expect(pv.id).toBe('pv_123');
expect(pv.entityId).toBe('entity_456');
expect(pv.sessionId).toBe('session_789');
expect(pv.timestamp).toEqual(now);
});
it('throws if id is missing', () => {
expect(() => createValid({ id: '' })).toThrow(Error);
expect(() => createValid({ id: ' ' })).toThrow(Error);
});
it('throws if entityType is missing', () => {
expect(() => createValid({ entityType: undefined as unknown as EntityType })).toThrow(Error);
});
it('throws if entityId is missing', () => {
expect(() => createValid({ entityId: '' })).toThrow(Error);
expect(() => createValid({ entityId: ' ' })).toThrow(Error);
});
it('throws if sessionId is missing', () => {
expect(() => createValid({ sessionId: '' })).toThrow(Error);
expect(() => createValid({ sessionId: ' ' })).toThrow(Error);
});
it('withDuration returns a new PageView with duration', () => {
const pv = createValid({ visitorId: 'visitor-1' });
const pv2 = pv.withDuration(12_345);
expect(pv2).not.toBe(pv);
expect(pv2.durationMs).toBe(12_345);
expect(pv2.id).toBe(pv.id);
expect(pv2.sessionId).toBe(pv.sessionId);
});
it('withDuration throws for negative durations', () => {
const pv = createValid();
expect(() => pv.withDuration(-1)).toThrow(Error);
});
it('isMeaningfulView is true for 5s+ duration', () => {
expect(createValid({ durationMs: 4999 }).isMeaningfulView()).toBe(false);
expect(createValid({ durationMs: 5000 }).isMeaningfulView()).toBe(true);
});
it('isExternalReferral checks referrer domain', () => {
expect(createValid().isExternalReferral()).toBe(false);
expect(createValid({ referrer: 'https://gridpilot.example/path' }).isExternalReferral()).toBe(false);
expect(createValid({ referrer: 'https://example.com/path' }).isExternalReferral()).toBe(true);
});
});