diff --git a/src/__tests__/e2e.test.js b/src/__tests__/e2e.test.js index b9b9d67..839d265 100644 --- a/src/__tests__/e2e.test.js +++ b/src/__tests__/e2e.test.js @@ -769,4 +769,51 @@ describe('e2e', () => { event: 'buttonClick', }); }); + + it('dispatches tracking event from async function', async () => { + const message = { value: 'test' }; + + @track() + class Page extends React.Component { + constructor() { + super(); + this.message = message; + this.state = {}; + } + + async executeAction() { + const data = await this.handleAsyncAction(); + this.setState({ data }); + } + + @track((props, state, methodArgs, [{ value }, err]) => { + return ( + !err && { + label: 'async action', + status: 'success', + value, + } + ); + }) + handleAsyncAction() { + return Promise.resolve(this.message); + } + + render() { + return
{this.state.data && this.state.data.value}
; + } + } + + // Get the first child since the page is wrapped with the WithTracking component. + const page = await mount().childAt(0); + await page.instance().executeAction(); + + expect(page.state().data).toEqual(message); + expect(dispatchTrackingEvent).toHaveBeenCalledTimes(1); + expect(dispatchTrackingEvent).toHaveBeenCalledWith({ + label: 'async action', + status: 'success', + ...message, + }); + }); }); diff --git a/src/__tests__/trackEventMethodDecorator.test.js b/src/__tests__/trackEventMethodDecorator.test.js index dd88270..6139f37 100644 --- a/src/__tests__/trackEventMethodDecorator.test.js +++ b/src/__tests__/trackEventMethodDecorator.test.js @@ -70,7 +70,8 @@ describe('trackEventMethodDecorator', () => { const dummyData = {}; const trackingData = jest.fn(() => dummyData); const trackEvent = jest.fn(); - const spyTestEvent = jest.fn(); + const eventData = 'eventData'; + const spyTestEvent = jest.fn(() => eventData); const dummyArgument = 'x'; class TestClass { @@ -90,11 +91,12 @@ describe('trackEventMethodDecorator', () => { } const myTC = new TestClass(); - myTC.handleTestEvent(dummyArgument); + const result = myTC.handleTestEvent(dummyArgument); // Access the trackingData arguments const trackingDataArguments = trackingData.mock.calls[0]; + expect(result).toEqual(eventData); expect(trackingData).toHaveBeenCalledTimes(1); expect(trackingDataArguments[0]).toEqual(myTC.props); expect(trackingDataArguments[1]).toEqual(myTC.state); @@ -131,11 +133,12 @@ describe('trackEventMethodDecorator', () => { } const myTC = new TestClass(); - await myTC.handleTestEvent(dummyArgument); + const result = await myTC.handleTestEvent(dummyArgument); // Access the trackingData arguments const trackingDataArguments = trackingData.mock.calls[0]; + expect(result).toEqual(dummyResolve); expect(trackingData).toHaveBeenCalledTimes(1); expect(trackingDataArguments[0]).toEqual(myTC.props); expect(trackingDataArguments[1]).toEqual(myTC.state); diff --git a/src/trackEventMethodDecorator.js b/src/trackEventMethodDecorator.js index 133bf8a..28dc6de 100644 --- a/src/trackEventMethodDecorator.js +++ b/src/trackEventMethodDecorator.js @@ -22,10 +22,13 @@ export default function trackEventMethodDecorator(trackingData = {}) { const fn = Reflect.apply(decoratedFn, this, args); if (Promise && Promise.resolve(fn) === fn) { - return fn.then(trackEvent.bind(this)).catch(error => { - trackEvent(null, error); - throw error; - }); + return fn + .then(trackEvent.bind(this)) + .then(() => fn) + .catch(error => { + trackEvent(null, error); + throw error; + }); } trackEvent(); return fn;