const { deviceFromUA, cleanSource, sessionsFrom, rollupRows, funnelReport } = require('../src/utils/analytics'); const ev = (sessionId, stage, day, extra = {}) => ({ sessionId, stage, createdAt: `${day}T10:00:00Z`, ...extra }); describe('deviceFromUA', () => { test('mobile, tablet, desktop and bots', () => { expect(deviceFromUA('Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Mobile/15E148')).toBe('mobile'); expect(deviceFromUA('Mozilla/5.0 (Linux; Android 14; SM-X200) Safari')).toBe('tablet'); expect(deviceFromUA('Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120')).toBe('desktop'); expect(deviceFromUA('Googlebot/2.1')).toBeNull(); expect(deviceFromUA('')).toBeNull(); }); }); describe('cleanSource', () => { test('tidies, defaulting to direct', () => { expect(cleanSource(' Facebook ')).toBe('facebook'); expect(cleanSource('camp-2025