Ver Fonte

fix(email-plugin): Correctly filter when using loadData in handler

Closes #257
Michael Bromley há 6 anos atrás
pai
commit
66bc98c29d

+ 9 - 1
packages/email-plugin/src/event-handler.ts

@@ -149,7 +149,15 @@ export class EmailEventHandler<T extends string = string, Event extends EventWit
     loadData<R>(
         loadDataFn: LoadDataFn<Event, R>,
     ): EmailEventHandlerWithAsyncData<R, T, Event, EventWithAsyncData<Event, R>> {
-        return new EmailEventHandlerWithAsyncData(loadDataFn, this.listener, this.event);
+        const asyncHandler = new EmailEventHandlerWithAsyncData(loadDataFn, this.listener, this.event);
+        asyncHandler.setRecipientFn = this.setRecipientFn;
+        asyncHandler.setTemplateVarsFn = this.setTemplateVarsFn;
+        asyncHandler.filterFns = this.filterFns;
+        asyncHandler.configurations = this.configurations;
+        asyncHandler.defaultSubject = this.defaultSubject;
+        asyncHandler.from = this.from;
+        asyncHandler._mockEvent = this._mockEvent as any;
+        return asyncHandler;
     }
 
     /**

+ 71 - 0
packages/email-plugin/src/plugin.spec.ts

@@ -53,6 +53,28 @@ describe('EmailPlugin', () => {
         return module;
     }
 
+    it('setting from, recipient, subject', async () => {
+        const ctx = {
+            channel: { code: DEFAULT_CHANNEL_CODE },
+            languageCode: LanguageCode.en,
+        } as any;
+        const handler = new EmailEventListener('test')
+            .on(MockEvent)
+            .setFrom('"test from" <noreply@test.com>')
+            .setRecipient(() => 'test@test.com')
+            .setSubject('Hello')
+            .setTemplateVars(event => ({ subjectVar: 'foo' }));
+
+        const module = await initPluginWithHandlers([handler]);
+
+        eventBus.publish(new MockEvent(ctx, true));
+        await pause();
+        expect(onSend.mock.calls[0][0].subject).toBe('Hello');
+        expect(onSend.mock.calls[0][0].recipient).toBe('test@test.com');
+        expect(onSend.mock.calls[0][0].from).toBe('"test from" <noreply@test.com>');
+        await module.close();
+    });
+
     describe('event filtering', () => {
         const ctx = {
             channel: { code: DEFAULT_CHANNEL_CODE },
@@ -99,6 +121,27 @@ describe('EmailPlugin', () => {
             expect(onSend).toHaveBeenCalledTimes(1);
             await module.close();
         });
+
+        it('with .loadData() after .filter()', async () => {
+            const handler = new EmailEventListener('test')
+                .on(MockEvent)
+                .filter(event => event.shouldSend === true)
+                .loadData(context => Promise.resolve('loaded data'))
+                .setRecipient(() => 'test@test.com')
+                .setFrom('"test from" <noreply@test.com>')
+                .setSubject('test subject');
+
+            const module = await initPluginWithHandlers([handler]);
+
+            eventBus.publish(new MockEvent(ctx, false));
+            await pause();
+            expect(onSend).not.toHaveBeenCalled();
+
+            eventBus.publish(new MockEvent(ctx, true));
+            await pause();
+            expect(onSend).toHaveBeenCalledTimes(1);
+            await module.close();
+        });
     });
 
     describe('templateVars', () => {
@@ -269,6 +312,34 @@ describe('EmailPlugin', () => {
             expect(onSend.mock.calls[0][0].subject).toBe('Hello, loaded data!');
             await module.close();
         });
+
+        it('works when loadData is called after other setup', async () => {
+            const handler = new EmailEventListener('test')
+                .on(MockEvent)
+                .setFrom('"test from" <noreply@test.com>')
+                .setSubject('Hello, {{ testData }}!')
+                .setRecipient(() => 'test@test.com')
+                .loadData(async ({ inject }) => {
+                    const service = inject(MockService);
+                    return service.someAsyncMethod();
+                })
+                .setTemplateVars(event => ({ testData: event.data }));
+
+            const module = await initPluginWithHandlers([handler]);
+
+            eventBus.publish(
+                new MockEvent(
+                    { channel: { code: DEFAULT_CHANNEL_CODE }, languageCode: LanguageCode.en },
+                    true,
+                ),
+            );
+            await pause();
+
+            expect(onSend.mock.calls[0][0].subject).toBe('Hello, loaded data!');
+            expect(onSend.mock.calls[0][0].from).toBe('"test from" <noreply@test.com>');
+            expect(onSend.mock.calls[0][0].recipient).toBe('test@test.com');
+            await module.close();
+        });
     });
 
     describe('orderConfirmationHandler', () => {