import cookie from 'js-cookie' import { waitFor } from '@testing-library/dom' import { Analytics } from '../../../core/analytics' import { ddFormTracking } from '..' import { SegmentioSettings } from '../../segmentio' const setupHTML = (html: string) => { const div = document.createElement('div') div.innerHTML = html document.querySelector('body')?.appendChild(div) } describe('FormTracking Dynamics365Marketing Plugin', () => { let analytics: Analytics let settings: SegmentioSettings let identifySpy: jest.SpyInstance let trackSpy: jest.SpyInstance beforeEach(() => { setupHTML(`
`) const event = { formPlaceholder: document.body, getFormPageId: () => 'my-id', } window.MsCrmMkt = { MsCrmFormLoader: { on: async (_, callback) => { await callback(event) }, }, } jest.resetAllMocks() jest.restoreAllMocks() settings = { apiKey: 'foo' } analytics = new Analytics({ writeKey: settings.apiKey }) identifySpy = jest.spyOn(analytics, 'identify') trackSpy = jest.spyOn(analytics, 'track') }) afterEach(() => { window.MsCrmMkt = undefined analytics.reset() Object.keys(cookie.get()).map((k) => cookie.remove(k)) window.localStorage.clear() }) it('should call identify and track on form submission', async () => { await analytics.register( ddFormTracking({ identifyFromEmail: false, dynamics365Marketing: true, }) ) await waitFor(() => expect(identifySpy).toHaveBeenCalledTimes(1)) expect(identifySpy.mock.calls[0][1]).toEqual({ email: 'john.doe@example.com', }) await waitFor(() => expect(trackSpy).toHaveBeenCalledTimes(1)) expect(trackSpy.mock.calls[0][0]).toBe('form-submitted') }) it('uses form ID to name mapping', async () => { await analytics.register( ddFormTracking({ identifyFromEmail: false, dynamics365Marketing: { formIdToNameMappings: { 'my-id': 'my-tracking-event', }, }, }) ) await waitFor(() => expect(identifySpy).toHaveBeenCalledTimes(1)) await waitFor(() => expect(trackSpy).toHaveBeenCalledTimes(1)) expect(trackSpy.mock.calls[0][0]).toBe('my-tracking-event') }) })