|
| 1 | +import { describe, expect, jest, test } from '@jest/globals' |
| 2 | +import registerHook from '../index.ts' |
| 3 | + |
| 4 | +// The extensions SDK ships as ESM and is not transformed under Jest's CJS mode, |
| 5 | +// so stub it. The real `defineHook` simply returns its callback. |
| 6 | +jest.mock('@directus/extensions-sdk', () => ({ |
| 7 | + defineHook: (callback: unknown) => callback, |
| 8 | +})) |
| 9 | + |
| 10 | +type Filter = (payload: any, meta: any, context: any) => any |
| 11 | + |
| 12 | +function setup(env: Record<string, unknown>) { |
| 13 | + const filters = new Map<string, Filter>() |
| 14 | + registerHook( |
| 15 | + { filter: (event: string, handler: Filter) => filters.set(event, handler) } as any, |
| 16 | + { env, logger: { info: jest.fn() } } as any |
| 17 | + ) |
| 18 | + return filters |
| 19 | +} |
| 20 | + |
| 21 | +describe('mail-reply-to hook', () => { |
| 22 | + test('sets Reply-To from EMAIL_REPLY_TO', () => { |
| 23 | + const filter = setup({ EMAIL_REPLY_TO: ' replies@example.com ' }).get('email.send')! |
| 24 | + const message = { to: 'a@example.com', subject: 'Hi', html: '<p>Hi</p>' } |
| 25 | + |
| 26 | + expect(filter(message, {}, {})).toEqual({ ...message, replyTo: 'replies@example.com' }) |
| 27 | + // The original message is not mutated. |
| 28 | + expect(message).not.toHaveProperty('replyTo') |
| 29 | + }) |
| 30 | + |
| 31 | + test('keeps a Reply-To the caller set', () => { |
| 32 | + const filter = setup({ EMAIL_REPLY_TO: 'replies@example.com' }).get('email.send')! |
| 33 | + const message = { to: 'a@example.com', subject: 'Hi', replyTo: 'speaker@example.com' } |
| 34 | + |
| 35 | + expect(filter(message, {}, {})).toBe(message) |
| 36 | + }) |
| 37 | + |
| 38 | + test.each([[{}], [{ EMAIL_REPLY_TO: '' }], [{ EMAIL_REPLY_TO: ' ' }]])( |
| 39 | + 'registers no filter when EMAIL_REPLY_TO is unset or empty (%j)', |
| 40 | + (env) => { |
| 41 | + expect(setup(env).has('email.send')).toBe(false) |
| 42 | + } |
| 43 | + ) |
| 44 | +}) |
0 commit comments