import { describe, it, expect } from 'vitest' import { parseQuery } from '@/lib/utm' function params(obj: Record): URLSearchParams { return new URLSearchParams(obj) } describe('parseQuery', () => { it('extracts all whitelisted UTM params', () => { const result = parseQuery( params({ utm_source: 'google', utm_medium: 'cpc', utm_campaign: 'summer', utm_content: 'banner', utm_term: 'shoes', gclid: 'abc123', }) ) expect(result).toEqual({ utm_source: 'google', utm_medium: 'cpc', utm_campaign: 'summer', utm_content: 'banner', utm_term: 'shoes', gclid: 'abc123', }) }) it('returns empty object when no UTM params are present', () => { expect(parseQuery(params({ page: '1', foo: 'bar' }))).toEqual({}) }) it('ignores non-whitelisted params', () => { const result = parseQuery(params({ utm_source: 'fb', referrer: 'https://example.com' })) expect(result).toEqual({ utm_source: 'fb' }) expect(result).not.toHaveProperty('referrer') }) it('omits params with empty string values', () => { // URLSearchParams.get returns '' for empty value — the lib checks `if (value)` so it skips const result = parseQuery(params({ utm_source: '', utm_medium: 'email' })) expect(result).not.toHaveProperty('utm_source') expect(result.utm_medium).toBe('email') }) it('handles only gclid present', () => { expect(parseQuery(params({ gclid: 'Cj0KCQ' }))).toEqual({ gclid: 'Cj0KCQ' }) }) it('handles empty URLSearchParams', () => { expect(parseQuery(new URLSearchParams())).toEqual({}) }) it('returns a partial object when only some UTM params are present', () => { const result = parseQuery(params({ utm_source: 'newsletter', utm_campaign: 'may' })) expect(result).toEqual({ utm_source: 'newsletter', utm_campaign: 'may' }) expect(Object.keys(result)).toHaveLength(2) }) })