teqo/tests/unit/facebookPixel.unit.spec.ts
Francisco Solla e339ceec9f
All checks were successful
CI (PR) / checks (pull_request) Successful in 19m11s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 19m30s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 8m12s
feat(S10): pixel do Meta na página pública de campanha (campo admin em SiteSettings + PageView na home + Lead no sucesso da captura)
Campo tracking.facebookPixelId no global SiteSettings (mesma validação/normalização do precedente Petition, regra centralizada em facebookPixel.ts); home (grupo (home)) injeta o base code + PageView quando o ID está configurado (fail-closed) e o CampaignNewsletterForm dispara exatamente um Lead no sucesso do S9. Migration 20260819_213947_add_site_settings_facebook_pixel_id. Closes #94
2026-08-19 19:27:00 -03:00

89 lines
3 KiB
TypeScript

// @vitest-environment node
import { describe, expect, it, vi } from 'vitest'
import {
isValidFacebookPixelId,
normalizeFacebookPixelId,
trackMetaLead,
validateFacebookPixelId,
} from '@/lib/facebookPixel'
describe('facebookPixel', () => {
describe('isValidFacebookPixelId', () => {
it('accepts numeric IDs between 5 and 20 digits', () => {
expect(isValidFacebookPixelId('12345')).toBe(true)
expect(isValidFacebookPixelId('123456789012345')).toBe(true)
})
it('rejects empty, non-numeric, and out-of-range values', () => {
expect(isValidFacebookPixelId('')).toBe(false)
expect(isValidFacebookPixelId(null)).toBe(false)
expect(isValidFacebookPixelId(undefined)).toBe(false)
expect(isValidFacebookPixelId('1234')).toBe(false)
expect(isValidFacebookPixelId('123456789012345678901')).toBe(false)
expect(isValidFacebookPixelId('<script>alert(1)</script>')).toBe(false)
expect(isValidFacebookPixelId('fbq("init")')).toBe(false)
})
})
describe('normalizeFacebookPixelId', () => {
it('trims whitespace and returns null for invalid values', () => {
expect(normalizeFacebookPixelId(' 123456789012345 ')).toBe('123456789012345')
expect(normalizeFacebookPixelId('')).toBe(null)
expect(normalizeFacebookPixelId(' ')).toBe(null)
expect(normalizeFacebookPixelId('abc')).toBe(null)
})
})
describe('validateFacebookPixelId', () => {
it('accepts empty values (optional field)', () => {
expect(validateFacebookPixelId('')).toBe(true)
expect(validateFacebookPixelId(null)).toBe(true)
expect(validateFacebookPixelId(undefined)).toBe(true)
})
it('accepts numeric IDs between 5 and 20 digits', () => {
expect(validateFacebookPixelId('123456789012345')).toBe(true)
})
it('rejects non-numeric and out-of-range values with the admin message', () => {
const message = 'Informe somente o ID numérico do Pixel (5 a 20 dígitos), sem HTML ou script.'
expect(validateFacebookPixelId('1234')).toBe(message)
expect(validateFacebookPixelId('<script>alert(1)</script>')).toBe(message)
})
})
describe('trackMetaLead', () => {
it('no-ops when fbq is unavailable', () => {
expect(() => trackMetaLead('123456789012345', 'Petição teste', 'event-1')).not.toThrow()
})
it('fires Lead with content_name and eventID when fbq exists', () => {
const fbq = vi.fn()
vi.stubGlobal('window', { fbq })
trackMetaLead('123456789012345', 'Petição teste', 'event-1')
expect(fbq).toHaveBeenCalledWith(
'track',
'Lead',
{ content_name: 'Petição teste' },
{ eventID: 'event-1' },
)
vi.unstubAllGlobals()
})
it('no-ops for invalid pixel IDs even when fbq exists', () => {
const fbq = vi.fn()
vi.stubGlobal('window', { fbq })
trackMetaLead('not-a-pixel', 'Petição teste', 'event-1')
expect(fbq).not.toHaveBeenCalled()
vi.unstubAllGlobals()
})
})
})