Skip to content

Commit 7daabca

Browse files
authored
fix: fix telemetry for tab stops in android (#4115)
* fix: fix telemetry for tab stops in android * validate on click event pass through
1 parent cd132ca commit 7daabca

File tree

8 files changed

+101
-33
lines changed

8 files changed

+101
-33
lines changed

src/electron/flux/action/tab-stops-action-creator.ts

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
// Licensed under the MIT License.
33

44
import { TelemetryEventHandler } from 'background/telemetry/telemetry-event-handler';
5+
import { TelemetryEventSource, TriggeredByNotApplicable } from 'common/extension-telemetry-events';
56
import { Logger } from 'common/logging/logger';
7+
import { SupportedMouseEvent, TelemetryDataFactory } from 'common/telemetry-data-factory';
68
import {
79
DEVICE_FOCUS_DISABLE,
810
DEVICE_FOCUS_ENABLE,
@@ -22,11 +24,18 @@ export class TabStopsActionCreator {
2224
private readonly deviceFocusController: DeviceFocusController,
2325
private readonly logger: Logger,
2426
private readonly telemetryEventHandler: TelemetryEventHandler,
27+
private readonly telemetryDataFactory: TelemetryDataFactory,
2528
) {}
2629

27-
public enableTabStops = async () => {
30+
public enableTabStops = async (event: SupportedMouseEvent) => {
2831
try {
29-
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_ENABLE, {});
32+
const telemetry = this.telemetryDataFactory.withTriggeredByAndSource(
33+
event,
34+
TelemetryEventSource.ElectronResultsView,
35+
);
36+
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_ENABLE, {
37+
telemetry,
38+
});
3039
await this.deviceFocusController.enableFocusTracking();
3140
this.tabStopsActions.enableFocusTracking.invoke();
3241
this.deviceConnectionActions.statusConnected.invoke();
@@ -35,9 +44,15 @@ export class TabStopsActionCreator {
3544
}
3645
};
3746

38-
public disableTabStops = async () => {
47+
public disableTabStops = async (event: SupportedMouseEvent) => {
3948
try {
40-
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_DISABLE, {});
49+
const telemetry = this.telemetryDataFactory.withTriggeredByAndSource(
50+
event,
51+
TelemetryEventSource.ElectronResultsView,
52+
);
53+
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_DISABLE, {
54+
telemetry,
55+
});
4156
await this.deviceFocusController.disableFocusTracking();
4257
this.tabStopsActions.disableFocusTracking.invoke();
4358
this.deviceConnectionActions.statusConnected.invoke();
@@ -46,9 +61,15 @@ export class TabStopsActionCreator {
4661
}
4762
};
4863

49-
public startOver = async () => {
64+
public startOver = async (event: SupportedMouseEvent) => {
5065
try {
51-
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_RESET, {});
66+
const telemetry = this.telemetryDataFactory.withTriggeredByAndSource(
67+
event,
68+
TelemetryEventSource.ElectronResultsView,
69+
);
70+
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_RESET, {
71+
telemetry,
72+
});
5273
await this.deviceFocusController.resetFocusTracking();
5374
this.tabStopsActions.startOver.invoke();
5475
this.deviceConnectionActions.statusConnected.invoke();
@@ -131,7 +152,12 @@ export class TabStopsActionCreator {
131152

132153
private commandFailed(error: Error): void {
133154
this.logger.log('focus controller failure: ' + error);
134-
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_ERROR, {});
155+
this.telemetryEventHandler.publishTelemetry(DEVICE_FOCUS_ERROR, {
156+
telemetry: {
157+
source: TelemetryEventSource.ElectronResultsView,
158+
triggeredBy: TriggeredByNotApplicable,
159+
},
160+
});
135161
this.deviceConnectionActions.statusDisconnected.invoke();
136162
}
137163
}

src/electron/types/content-page-info.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33
import { ReactFCWithDisplayName } from 'common/react/named-fc';
4+
import { SupportedMouseEvent } from 'common/telemetry-data-factory';
45
import { ResultsFilter } from 'common/types/results-filter';
56
import { TestingContentProps } from 'electron/platform/android/testing-content';
67
import { VisualHelperSection } from 'electron/types/visual-helper-section';
78
import { ReflowCommandBarProps } from 'electron/views/results/components/reflow-command-bar';
89
import { LeftNavItemKey } from './left-nav-item-key';
910

1011
export type StartOverButtonSettings = {
11-
onClick: () => void;
12+
onClick: (event: SupportedMouseEvent) => void;
1213
disabled: boolean;
1314
};
1415

src/electron/views/renderer-initializer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ getPersistedData(indexedDBInstance, indexedDBDataKeysToFetch)
363363
deviceFocusController,
364364
logger,
365365
telemetryEventHandler,
366+
telemetryDataFactory,
366367
);
367368

368369
const leftNavActionCreator = new LeftNavActionCreator(leftNavActions, cardSelectionActions);

src/electron/views/tab-stops/tab-stops-testing-content.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
import { NamedFC } from 'common/react/named-fc';
5+
import { SupportedMouseEvent } from 'common/telemetry-data-factory';
56
import { TabStopsActionCreator } from 'electron/flux/action/tab-stops-action-creator';
67
import { Toggle } from 'office-ui-fabric-react';
78
import * as React from 'react';
@@ -24,11 +25,11 @@ export const TabStopsTestingContent = NamedFC<TabStopsTestingContentProps>(
2425
'TabStopsTestingContent',
2526
props => {
2627
const tabStopsActionCreator = props.deps.tabStopsActionCreator;
27-
const onToggle = () => {
28+
const onToggle = (e: SupportedMouseEvent) => {
2829
if (props.tabStopsEnabled) {
29-
tabStopsActionCreator.disableTabStops();
30+
tabStopsActionCreator.disableTabStops(e);
3031
} else {
31-
tabStopsActionCreator.enableTabStops();
32+
tabStopsActionCreator.enableTabStops(e);
3233
}
3334
};
3435

src/tests/unit/tests/electron/flux/action-creator/tab-stops-action-creator.test.ts

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22
// Licensed under the MIT License.
33
import { BaseActionPayload } from 'background/actions/action-payloads';
44
import { TelemetryEventHandler } from 'background/telemetry/telemetry-event-handler';
5+
import {
6+
BaseTelemetryData,
7+
TelemetryEventSource,
8+
TriggeredByNotApplicable,
9+
} from 'common/extension-telemetry-events';
510
import { Action } from 'common/flux/action';
611
import { Logger } from 'common/logging/logger';
12+
import { SupportedMouseEvent, TelemetryDataFactory } from 'common/telemetry-data-factory';
713
import {
814
DEVICE_FOCUS_DISABLE,
915
DEVICE_FOCUS_ENABLE,
@@ -28,6 +34,9 @@ describe('TabStopsActionCreator', () => {
2834
let loggerMock: IMock<Logger>;
2935
let statusDisconnectedMock: IMock<Action<void>>;
3036
let statusConnectedMock: IMock<Action<void>>;
37+
let telemetryDataFactoryMock: IMock<TelemetryDataFactory>;
38+
let eventStub: React.SyntheticEvent;
39+
let telemetryStub: BaseTelemetryData;
3140

3241
beforeEach(() => {
3342
tabStopsActionsMock = Mock.ofType<TabStopsActions>();
@@ -47,13 +56,20 @@ describe('TabStopsActionCreator', () => {
4756
loggerMock = Mock.ofType<Logger>(undefined, MockBehavior.Strict);
4857
statusDisconnectedMock = Mock.ofType<Action<void>>();
4958
statusConnectedMock = Mock.ofType<Action<void>>();
59+
telemetryDataFactoryMock = Mock.ofType<TelemetryDataFactory>();
60+
eventStub = {} as React.SyntheticEvent;
61+
telemetryStub = {
62+
source: TelemetryEventSource.ElectronResultsView,
63+
triggeredBy: 'N/A',
64+
};
5065

5166
testSubject = new TabStopsActionCreator(
5267
tabStopsActionsMock.object,
5368
deviceConnectionActionsMock.object,
5469
deviceFocusControllerMock.object,
5570
loggerMock.object,
5671
telemetryEventHandlerMock.object,
72+
telemetryDataFactoryMock.object,
5773
);
5874
});
5975

@@ -62,11 +78,12 @@ describe('TabStopsActionCreator', () => {
6278
deviceFocusControllerMock
6379
.setup(m => m.enableFocusTracking())
6480
.returns(() => Promise.resolve());
65-
setupTelemetryMock(DEVICE_FOCUS_ENABLE, {});
81+
setupTelemetryMock(DEVICE_FOCUS_ENABLE, { telemetry: telemetryStub });
82+
setupTelemetryDataFactoryMock(eventStub);
6683
tabStopsActionsMock.setup(m => m.enableFocusTracking).returns(() => actionMock.object);
6784
setFocusActionsForSuccess();
6885

69-
await testSubject.enableTabStops();
86+
await testSubject.enableTabStops(eventStub);
7087

7188
actionMock.verify(m => m.invoke(), Times.once());
7289
verifyAllMocks();
@@ -76,11 +93,12 @@ describe('TabStopsActionCreator', () => {
7693
deviceFocusControllerMock
7794
.setup(m => m.disableFocusTracking())
7895
.returns(() => Promise.resolve());
79-
setupTelemetryMock(DEVICE_FOCUS_DISABLE, {});
96+
setupTelemetryMock(DEVICE_FOCUS_DISABLE, { telemetry: telemetryStub });
97+
setupTelemetryDataFactoryMock(eventStub);
8098
tabStopsActionsMock.setup(m => m.disableFocusTracking).returns(() => actionMock.object);
8199
setFocusActionsForSuccess();
82100

83-
await testSubject.disableTabStops();
101+
await testSubject.disableTabStops(eventStub);
84102

85103
actionMock.verify(m => m.invoke(), Times.once());
86104
verifyAllMocks();
@@ -90,11 +108,12 @@ describe('TabStopsActionCreator', () => {
90108
deviceFocusControllerMock
91109
.setup(m => m.resetFocusTracking())
92110
.returns(() => Promise.resolve());
93-
setupTelemetryMock(DEVICE_FOCUS_RESET, {});
111+
setupTelemetryMock(DEVICE_FOCUS_RESET, { telemetry: telemetryStub });
112+
setupTelemetryDataFactoryMock(eventStub);
94113
tabStopsActionsMock.setup(m => m.startOver).returns(() => actionMock.object);
95114
setFocusActionsForSuccess();
96115

97-
await testSubject.startOver();
116+
await testSubject.startOver(eventStub);
98117

99118
actionMock.verify(m => m.invoke(), Times.once());
100119
verifyAllMocks();
@@ -159,7 +178,7 @@ describe('TabStopsActionCreator', () => {
159178
.setup(m => m.sendKeyEvent(keyEventCode))
160179
.returns(() => Promise.resolve());
161180

162-
await testSubject[funcName]();
181+
await testSubject[funcName](eventStub);
163182

164183
verifyAllMocks();
165184
}
@@ -173,11 +192,12 @@ describe('TabStopsActionCreator', () => {
173192
.setup(m => m.enableFocusTracking())
174193
.returns(() => Promise.reject(errorMessage));
175194

176-
setupTelemetryMock(DEVICE_FOCUS_ENABLE, {});
195+
setupTelemetryMock(DEVICE_FOCUS_ENABLE, { telemetry: telemetryStub });
196+
setupTelemetryDataFactoryMock(eventStub);
177197
tabStopsActionsMock.setup(m => m.enableFocusTracking).returns(() => actionMock.object);
178198
setMocksForFocusError();
179199

180-
await testSubject.enableTabStops();
200+
await testSubject.enableTabStops(eventStub);
181201

182202
actionMock.verify(m => m.invoke(), Times.never());
183203
verifyAllMocks();
@@ -188,11 +208,12 @@ describe('TabStopsActionCreator', () => {
188208
.setup(m => m.disableFocusTracking())
189209
.returns(() => Promise.reject(errorMessage));
190210

191-
setupTelemetryMock(DEVICE_FOCUS_DISABLE, {});
211+
setupTelemetryMock(DEVICE_FOCUS_DISABLE, { telemetry: telemetryStub });
212+
setupTelemetryDataFactoryMock(eventStub);
192213
tabStopsActionsMock.setup(m => m.disableFocusTracking).returns(() => actionMock.object);
193214
setMocksForFocusError();
194215

195-
await testSubject.disableTabStops();
216+
await testSubject.disableTabStops(eventStub);
196217

197218
actionMock.verify(m => m.invoke(), Times.never());
198219
verifyAllMocks();
@@ -203,11 +224,12 @@ describe('TabStopsActionCreator', () => {
203224
.setup(m => m.resetFocusTracking())
204225
.returns(() => Promise.reject(errorMessage));
205226

206-
setupTelemetryMock(DEVICE_FOCUS_RESET, {});
227+
setupTelemetryMock(DEVICE_FOCUS_RESET, { telemetry: telemetryStub });
228+
setupTelemetryDataFactoryMock(eventStub);
207229
tabStopsActionsMock.setup(m => m.startOver).returns(() => actionMock.object);
208230
setMocksForFocusError();
209231

210-
await testSubject.startOver();
232+
await testSubject.startOver(eventStub);
211233

212234
actionMock.verify(m => m.invoke(), Times.never());
213235
verifyAllMocks();
@@ -267,14 +289,21 @@ describe('TabStopsActionCreator', () => {
267289
.setup(m => m.sendKeyEvent(keyEventCode))
268290
.returns(() => Promise.reject(errorMessage));
269291

270-
await testSubject[funcName]();
292+
await testSubject[funcName](eventStub);
271293

272294
verifyAllMocks();
273295
}
274296

275297
function setMocksForFocusError(): void {
276298
telemetryEventHandlerMock
277-
.setup(m => m.publishTelemetry(DEVICE_FOCUS_ERROR, {}))
299+
.setup(m =>
300+
m.publishTelemetry(DEVICE_FOCUS_ERROR, {
301+
telemetry: {
302+
source: TelemetryEventSource.ElectronResultsView,
303+
triggeredBy: TriggeredByNotApplicable,
304+
},
305+
}),
306+
)
278307
.verifiable(Times.once());
279308
loggerMock
280309
.setup(m => m.log('focus controller failure: ' + errorMessage))
@@ -295,6 +324,12 @@ describe('TabStopsActionCreator', () => {
295324
.verifiable(Times.once());
296325
}
297326

327+
function setupTelemetryDataFactoryMock(event: SupportedMouseEvent): void {
328+
telemetryDataFactoryMock
329+
.setup(m => m.withTriggeredByAndSource(event, TelemetryEventSource.ElectronResultsView))
330+
.returns(() => telemetryStub);
331+
}
332+
298333
function verifyAllMocks(): void {
299334
telemetryEventHandlerMock.verifyAll();
300335
deviceConnectionActionsMock.verifyAll();

src/tests/unit/tests/electron/platform/android/test-configs/shared-scan-results/start-over-button-settings.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ describe('sharedScanResultsStartOverButtonSettings', () => {
5555
} as ReflowCommandBarDeps;
5656
props.scanPort = scanPort;
5757

58-
sharedScanResultsStartOverButtonSettings(props).onClick();
58+
sharedScanResultsStartOverButtonSettings(props).onClick(null);
5959

6060
scanActionCreatorMock.verifyAll();
6161
});

src/tests/unit/tests/electron/views/results/components/reflow-command-bar.test.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
ReflowCommandBarProps,
1616
} from 'electron/views/results/components/reflow-command-bar';
1717
import { mount, shallow } from 'enzyme';
18+
import { isMatch } from 'lodash';
1819
import { IButton } from 'office-ui-fabric-react';
1920
import * as React from 'react';
2021
import { ReportGenerator } from 'reports/report-generator';
@@ -72,7 +73,7 @@ describe('ReflowCommandBar', () => {
7273
allowsExportReport: true,
7374
startOverButtonSettings: _ => {
7475
return {
75-
onClick: () => {},
76+
onClick: e => {},
7677
disabled: false,
7778
};
7879
},
@@ -117,8 +118,11 @@ describe('ReflowCommandBar', () => {
117118

118119
props.currentContentPageInfo.startOverButtonSettings = _ => {
119120
return {
120-
onClick: () => {
121+
onClick: e => {
121122
clickWasCalled = true;
123+
124+
// The event passed through is decorated with other properties so we only check subset.
125+
expect(isMatch(e, eventStub)).toBeTruthy();
122126
},
123127
disabled: false,
124128
};

src/tests/unit/tests/electron/views/tab-stops/tab-stops-testing-content.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import { IMock, Mock, MockBehavior } from 'typemoq';
1414
describe('TabStopsTestingContent', () => {
1515
let tabStopsActionCreatorMock: IMock<TabStopsActionCreator>;
1616
let props: TabStopsTestingContentProps;
17+
let eventStub: any;
1718

1819
beforeEach(() => {
20+
eventStub = {};
1921
tabStopsActionCreatorMock = Mock.ofType<TabStopsActionCreator>(
2022
undefined,
2123
MockBehavior.Strict,
@@ -32,21 +34,19 @@ describe('TabStopsTestingContent', () => {
3234
});
3335

3436
test('toggles tab stops off', () => {
35-
tabStopsActionCreatorMock.setup(m => m.disableTabStops()).verifiable();
37+
tabStopsActionCreatorMock.setup(m => m.disableTabStops(eventStub)).verifiable();
3638
const testSubject = shallow(<TabStopsTestingContent {...props} />);
3739
const onToggle = testSubject.find(Toggle).prop('onClick');
38-
const eventStub = null;
3940
onToggle(eventStub);
4041

4142
tabStopsActionCreatorMock.verifyAll();
4243
});
4344

4445
test('toggles tab stops on', () => {
4546
props.tabStopsEnabled = false;
46-
tabStopsActionCreatorMock.setup(m => m.enableTabStops()).verifiable();
47+
tabStopsActionCreatorMock.setup(m => m.enableTabStops(eventStub)).verifiable();
4748
const testSubject = shallow(<TabStopsTestingContent {...props} />);
4849
const onToggle = testSubject.find(Toggle).prop('onClick');
49-
const eventStub = null;
5050
onToggle(eventStub);
5151

5252
tabStopsActionCreatorMock.verifyAll();

0 commit comments

Comments
 (0)