Skip to content

Commit 041a6dd

Browse files
Erli-mscompulim
andauthored
Ersuo/adding send status telemetry (#4631)
* Init check in * updating composer structure * adding more tests * add documentation for telemetry event * adding null check * edit change log * address comments * Update CHANGELOG.md Co-authored-by: William Wong <[email protected]> * Fix tests * Fix test * Fix tests * Clean up * Update entry format --------- Co-authored-by: William Wong <[email protected]>
1 parent 1769b02 commit 041a6dd

20 files changed

+590
-39
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
2424

2525
### Added
2626

27-
- Added ability for developers to customize Web Chat by extending the default UI without having to re-implement existing components. [@dawolff-ms](https://github.com/dawolff-ms) in PR [#4539](https://github.com/microsoft/BotFramework-WebChat/pull/4539)
27+
- Added function to emit status change telemetry event for activities, by [@Erli-ms](https://github.com/Erli-ms), in PR [#4631](https://github.com/microsoft/BotFramework-WebChat/pull/4631)
28+
29+
- Added ability for developers to customize Web Chat by extending the default UI without having to re-implement existing components, by [@dawolff-ms](https://github.com/dawolff-ms), in PR [#4539](https://github.com/microsoft/BotFramework-WebChat/pull/4539)
2830

2931
### Fixed
3032

__tests__/hooks/useTrackDimension.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('useTrackDimension', () => {
1515
const { data, dimensions, duration, error, name, type } = event;
1616

1717
name !== 'init' &&
18-
(window.WebChatTest.telemetryMeasurements || (window.WebChatTest.telemetryMeasurements = [])).push({
18+
window.WebChatTest.telemetryMeasurements.push({
1919
data,
2020
dimensions,
2121
duration,
@@ -24,6 +24,9 @@ describe('useTrackDimension', () => {
2424
type
2525
});
2626
}
27+
},
28+
setup: () => {
29+
window.WebChatTest.telemetryMeasurements = [];
2730
}
2831
});
2932

@@ -37,12 +40,18 @@ describe('useTrackDimension', () => {
3740
await pageObjects.runHook('useTrackDimension', [], trackDimension => trackDimension('hello', 'aloha'));
3841
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('ping'));
3942

40-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements.length)).resolves.toBe(1);
43+
await expect(
44+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping').length)
45+
).resolves.toBe(1);
4146

4247
await pageObjects.runHook('useTrackDimension', [], trackDimension => trackDimension('hello'));
4348
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('ping2'));
4449

45-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
50+
await expect(
51+
driver.executeScript(() =>
52+
window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping' || name === 'ping2')
53+
)
54+
).resolves.toMatchInlineSnapshot(`
4655
Array [
4756
Object {
4857
"data": null,
@@ -81,7 +90,9 @@ describe('useTrackDimension', () => {
8190
await pageObjects.runHook('useTrackDimension', [], trackDimension => trackDimension(123, 'hello'));
8291
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('ping'));
8392

84-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
93+
await expect(
94+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping'))
95+
).resolves.toMatchInlineSnapshot(`
8596
Array [
8697
Object {
8798
"data": null,
@@ -105,7 +116,9 @@ describe('useTrackDimension', () => {
105116
await pageObjects.runHook('useTrackDimension', [], trackDimension => trackDimension('hello', 123));
106117
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('ping'));
107118

108-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
119+
await expect(
120+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping'))
121+
).resolves.toMatchInlineSnapshot(`
109122
Array [
110123
Object {
111124
"data": null,

__tests__/hooks/useTrackEvent.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('useTrackEvent', () => {
1515
const { data, dimensions, duration, error, level, name, type } = event;
1616

1717
name !== 'init' &&
18-
(window.WebChatTest.telemetryMeasurements || (window.WebChatTest.telemetryMeasurements = [])).push({
18+
window.WebChatTest.telemetryMeasurements.push({
1919
data,
2020
dimensions,
2121
duration,
@@ -25,6 +25,9 @@ describe('useTrackEvent', () => {
2525
type
2626
});
2727
}
28+
},
29+
setup: () => {
30+
window.WebChatTest.telemetryMeasurements = [];
2831
}
2932
});
3033

@@ -37,7 +40,9 @@ describe('useTrackEvent', () => {
3740
test('should track simple event', async () => {
3841
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('hello'));
3942

40-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
43+
await expect(
44+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
45+
).resolves.toMatchInlineSnapshot(`
4146
Array [
4247
Object {
4348
"data": null,
@@ -61,7 +66,9 @@ describe('useTrackEvent', () => {
6166
test('should track simple event using info explicitly', async () => {
6267
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent.info('hello'));
6368

64-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
69+
await expect(
70+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
71+
).resolves.toMatchInlineSnapshot(`
6572
Array [
6673
Object {
6774
"data": null,
@@ -85,7 +92,9 @@ describe('useTrackEvent', () => {
8592
test('should track numeric event', async () => {
8693
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent.warn('hello', 123));
8794

88-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
95+
await expect(
96+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
97+
).resolves.toMatchInlineSnapshot(`
8998
Array [
9099
Object {
91100
"data": 123,
@@ -109,7 +118,9 @@ describe('useTrackEvent', () => {
109118
test('should track numeric event', async () => {
110119
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent.debug('hello', 'aloha'));
111120

112-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
121+
await expect(
122+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
123+
).resolves.toMatchInlineSnapshot(`
113124
Array [
114125
Object {
115126
"data": "aloha",
@@ -133,7 +144,9 @@ describe('useTrackEvent', () => {
133144
test('should track complex event', async () => {
134145
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent.error('hello', { one: 1, hello: 'aloha' }));
135146

136-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
147+
await expect(
148+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
149+
).resolves.toMatchInlineSnapshot(`
137150
Array [
138151
Object {
139152
"data": Object {
@@ -160,18 +173,24 @@ describe('useTrackEvent', () => {
160173
test('should not track event with boolean data', async () => {
161174
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('hello', true));
162175

163-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toBeFalsy();
176+
await expect(
177+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
178+
).resolves.toHaveLength(0);
164179
});
165180

166181
test('should not track event with incompatible complex data', async () => {
167182
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent('hello', { truthy: true }));
168183

169-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toBeFalsy();
184+
await expect(
185+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
186+
).resolves.toHaveLength(0);
170187
});
171188

172189
test('should not track event with invalid name', async () => {
173190
await pageObjects.runHook('useTrackEvent', [], trackEvent => trackEvent(123));
174191

175-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toBeFalsy();
192+
await expect(
193+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'hello'))
194+
).resolves.toHaveLength(0);
176195
});
177196
});

__tests__/hooks/useTrackException.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@ describe('useTrackException', () => {
1515
const { data, dimensions, duration, error, fatal, name, type } = event;
1616

1717
name !== 'init' &&
18-
(window.WebChatTest.telemetryMeasurements || (window.WebChatTest.telemetryMeasurements = [])).push({
18+
window.WebChatTest.telemetryMeasurements.push({
1919
data,
2020
dimensions,
2121
duration,
22-
error: error.message,
22+
error: error?.message,
2323
fatal,
2424
name,
2525
type
2626
});
2727
}
28+
},
29+
setup: () => {
30+
window.WebChatTest.telemetryMeasurements = [];
2831
}
2932
});
3033

@@ -37,7 +40,8 @@ describe('useTrackException', () => {
3740
test('should track exception', async () => {
3841
await pageObjects.runHook('useTrackException', [], trackException => trackException(new Error('artificial error')));
3942

40-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
43+
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ error }) => error)))
44+
.resolves.toMatchInlineSnapshot(`
4145
Array [
4246
Object {
4347
"data": null,
@@ -63,7 +67,8 @@ describe('useTrackException', () => {
6367
trackException(new Error('non-fatal error'), false)
6468
);
6569

66-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
70+
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ error }) => error)))
71+
.resolves.toMatchInlineSnapshot(`
6772
Array [
6873
Object {
6974
"data": null,

__tests__/hooks/useTrackTiming.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('useTrackTiming', () => {
1515
const { data, dimensions, duration, error, name, type } = event;
1616

1717
name !== 'init' &&
18-
(window.WebChatTest.telemetryMeasurements || (window.WebChatTest.telemetryMeasurements = [])).push({
18+
window.WebChatTest.telemetryMeasurements.push({
1919
data,
2020
dimensions,
2121
duration,
@@ -25,10 +25,13 @@ describe('useTrackTiming', () => {
2525
});
2626
}
2727
},
28-
setup: () =>
28+
setup: () => {
2929
window.WebChatTest.loadScript('https://unpkg.com/[email protected]/lolex.js').then(() => {
3030
window.WebChatTest.clock = lolex.install();
31-
})
31+
});
32+
33+
window.WebChatTest.telemetryMeasurements = [];
34+
}
3235
});
3336

3437
driver = setup.driver;
@@ -43,7 +46,9 @@ describe('useTrackTiming', () => {
4346
pageObjects.runHook('useTrackTiming', [], trackTiming => trackTiming('ping', () => 123))
4447
).resolves.toBe(123);
4548

46-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
49+
await expect(
50+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping'))
51+
).resolves.toMatchInlineSnapshot(`
4752
Array [
4853
Object {
4954
"data": null,
@@ -88,7 +93,9 @@ describe('useTrackTiming', () => {
8893

8994
await expect(driver.executeScript(() => window.WebChatTest.result)).resolves.toBe(123);
9095

91-
await expect(driver.executeScript(() => window.WebChatTest.telemetryMeasurements)).resolves.toMatchInlineSnapshot(`
96+
await expect(
97+
driver.executeScript(() => window.WebChatTest.telemetryMeasurements.filter(({ name }) => name === 'ping'))
98+
).resolves.toMatchInlineSnapshot(`
9299
Array [
93100
Object {
94101
"data": null,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<!DOCTYPE html>
2+
<html lang="en-US">
3+
<head>
4+
<link href="/assets/index.css" rel="stylesheet" type="text/css" />
5+
<script crossorigin="anonymous" src="/test-harness.js"></script>
6+
<script crossorigin="anonymous" src="/test-page-object.js"></script>
7+
<script crossorigin="anonymous" src="/__dist__/webchat-es5.js"></script>
8+
</head>
9+
<body>
10+
<div id="webchat"></div>
11+
<script>
12+
run(
13+
async function () {
14+
const store = testHelpers.createStore();
15+
16+
const directLine = testHelpers.createDirectLineEmulator(store);
17+
const telemetryEventTracking = [];
18+
WebChat.renderWebChat(
19+
{
20+
directLine,
21+
store,
22+
onTelemetry: (event) => {
23+
if (event?.name === 'send-status:change') {
24+
telemetryEventTracking.push(event);
25+
}
26+
},
27+
},
28+
document.getElementById('webchat')
29+
);
30+
31+
await pageConditions.uiConnected();
32+
33+
// GIVEN: Simulate an ingress activity of "Aloha!".
34+
await directLine.emulateIncomingActivity('Aloha!');
35+
36+
// WHEN: The activity is rendered.
37+
await pageConditions.numActivitiesShown(1);
38+
39+
// THEN: No status change event should be logged for incoming activities.
40+
expect(telemetryEventTracking.length).toEqual(0);
41+
}
42+
);
43+
</script>
44+
</body>
45+
</html>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */
2+
3+
describe('ActivityStatusTelemetry', () => {
4+
test('activity status telemetry should not be logged when incoming activity received', () =>
5+
runHTML('activityStatusTelemetry.ignoreStatusChange.incomingActivity.html'));
6+
});

0 commit comments

Comments
 (0)