/** * Helper for creating mock MailGun webhook events for testing */ import { MailgunWebhookEvent, MailgunDeliveredEvent, MailgunFailedEvent, MailgunOpenedEvent, MailgunClickedEvent, MailgunBouncedEvent, MailgunComplainedEvent, MailgunUnsubscribedEvent } from '../../src/types/MailgunWebhookEvent'; /** * Base event data common to all webhook events */ const baseEventData = { timestamp: '1234567890', token: 'mock-token-123', signature: 'mock-signature-abc123', recipient: 'user@example.com', domain: 'mail.example.com', 'message-id': '<20240101120000.1.ABC123@mail.example.com>', 'Message-Id': '<20240101120000.1.ABC123@mail.example.com>' }; /** * Creates a mock 'delivered' event */ export const createMockDeliveredEvent = (): MailgunDeliveredEvent => ({ ...baseEventData, event: 'delivered', 'message-headers': JSON.stringify([ ['Subject', 'Test Email'], ['From', 'sender@example.com'] ]) }); /** * Creates a mock 'failed' event */ export const createMockFailedEvent = (): MailgunFailedEvent => ({ ...baseEventData, event: 'failed', severity: 'permanent', reason: 'bounce', notification: 'User inbox is full' }); /** * Creates a mock 'opened' event */ export const createMockOpenedEvent = (): MailgunOpenedEvent => ({ ...baseEventData, event: 'opened', city: 'San Francisco', country: 'US', 'device-type': 'desktop', 'client-os': 'macOS', 'client-name': 'Apple Mail', ip: '192.168.1.100' }); /** * Creates a mock 'clicked' event */ export const createMockClickedEvent = (): MailgunClickedEvent => ({ ...baseEventData, event: 'clicked', url: 'https://example.com/link', city: 'New York', country: 'US', 'device-type': 'mobile', 'client-os': 'iOS', 'client-name': 'Gmail', ip: '192.168.1.101' }); /** * Creates a mock 'bounced' event */ export const createMockBouncedEvent = (): MailgunBouncedEvent => ({ ...baseEventData, event: 'bounced', code: '550', error: 'User not found', notification: 'The email account that you tried to reach does not exist' }); /** * Creates a mock 'complained' event */ export const createMockComplainedEvent = (): MailgunComplainedEvent => ({ ...baseEventData, event: 'complained' }); /** * Creates a mock 'unsubscribed' event */ export const createMockUnsubscribedEvent = (): MailgunUnsubscribedEvent => ({ ...baseEventData, event: 'unsubscribed' }); /** * Creates an invalid event missing required fields */ export const createInvalidEvent = () => ({ timestamp: '1234567890', token: 'mock-token-123' // Missing 'event' and 'recipient' fields });