92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import type { Logger } from '@core/shared/domain';
|
|
import { PageView } from '@core/analytics/application/repositories/PageViewRepository';
|
|
import { InMemoryPageViewRepository } from './InMemoryPageViewRepository';
|
|
|
|
describe('InMemoryPageViewRepository', () => {
|
|
let repository: InMemoryPageViewRepository;
|
|
let mockLogger: Logger;
|
|
|
|
beforeEach(() => {
|
|
mockLogger = {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
} as unknown as Logger;
|
|
|
|
repository = new InMemoryPageViewRepository(mockLogger);
|
|
repository.clear();
|
|
});
|
|
|
|
it('initializes with a logger', () => {
|
|
expect(repository).toBeDefined();
|
|
expect(mockLogger.info).toHaveBeenCalledWith('InMemoryPageViewRepository initialized.');
|
|
});
|
|
|
|
it('saves and queries page views', async () => {
|
|
const pv1 = PageView.create({
|
|
id: 'pv-1',
|
|
entityType: 'league',
|
|
entityId: 'league-1',
|
|
visitorType: 'anonymous',
|
|
sessionId: 'sess-1',
|
|
visitorId: 'visitor-1',
|
|
timestamp: new Date('2025-01-01T10:00:00.000Z'),
|
|
});
|
|
const pv2 = PageView.create({
|
|
id: 'pv-2',
|
|
entityType: 'league',
|
|
entityId: 'league-1',
|
|
visitorType: 'anonymous',
|
|
sessionId: 'sess-2',
|
|
visitorId: 'visitor-1',
|
|
timestamp: new Date('2025-01-02T10:00:00.000Z'),
|
|
});
|
|
const pv3 = PageView.create({
|
|
id: 'pv-3',
|
|
entityType: 'league',
|
|
entityId: 'league-1',
|
|
visitorType: 'anonymous',
|
|
sessionId: 'sess-3',
|
|
// no visitorId; should fall back to sessionId for uniqueness
|
|
timestamp: new Date('2025-01-02T11:00:00.000Z'),
|
|
});
|
|
|
|
await repository.save(pv1);
|
|
await repository.save(pv2);
|
|
await repository.save(pv3);
|
|
|
|
expect((await repository.findById('pv-1'))?.id).toBe('pv-1');
|
|
expect((await repository.findByEntityId('league', 'league-1')).length).toBe(3);
|
|
|
|
const range = await repository.findByDateRange(
|
|
new Date('2025-01-02T00:00:00.000Z'),
|
|
new Date('2025-01-02T23:59:59.999Z'),
|
|
);
|
|
expect(range.map(p => p.id).sort()).toEqual(['pv-2', 'pv-3']);
|
|
|
|
expect((await repository.findBySession('sess-2')).map(p => p.id)).toEqual(['pv-2']);
|
|
|
|
const count = await repository.countByEntityId('league', 'league-1');
|
|
expect(count).toBe(3);
|
|
|
|
const unique = await repository.countUniqueVisitors('league', 'league-1');
|
|
// visitor-1 + sess-3
|
|
expect(unique).toBe(2);
|
|
});
|
|
|
|
it('seeds page views', async () => {
|
|
const pv = PageView.create({
|
|
id: 'seed-pv',
|
|
entityType: 'team',
|
|
entityId: 'team-1',
|
|
visitorType: 'anonymous',
|
|
sessionId: 'sess-seed',
|
|
});
|
|
|
|
repository.seed([pv]);
|
|
expect((await repository.findById('seed-pv'))?.id).toBe('seed-pv');
|
|
});
|
|
});
|