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;