@webex/internal-plugin-metrics 3.0.0-beta.20 → 3.0.0-beta.201

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +56 -0
  2. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  3. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +451 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics.js +584 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +225 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  9. package/dist/call-diagnostic/config.js +461 -0
  10. package/dist/call-diagnostic/config.js.map +1 -0
  11. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js +7 -0
  12. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -0
  13. package/dist/call-diagnostic/generated-types-temp/Event.js +7 -0
  14. package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -0
  15. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js +7 -0
  16. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js.map +1 -0
  17. package/dist/config.js +20 -1
  18. package/dist/config.js.map +1 -1
  19. package/dist/index.js +25 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/metrics.js +30 -30
  22. package/dist/metrics.js.map +1 -1
  23. package/dist/metrics.types.js +7 -0
  24. package/dist/metrics.types.js.map +1 -0
  25. package/dist/new-metrics.js +249 -0
  26. package/dist/new-metrics.js.map +1 -0
  27. package/dist/types/batcher.d.ts +2 -0
  28. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  29. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +189 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +348 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +52 -0
  32. package/dist/types/call-diagnostic/config.d.ts +57 -0
  33. package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +1112 -0
  34. package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +4851 -0
  35. package/dist/types/call-diagnostic/generated-types-temp/MediaQualityEvent.d.ts +2121 -0
  36. package/dist/types/client-metrics-batcher.d.ts +2 -0
  37. package/dist/types/config.d.ts +35 -0
  38. package/dist/types/index.d.ts +11 -0
  39. package/dist/types/metrics.d.ts +3 -0
  40. package/dist/types/metrics.types.d.ts +92 -0
  41. package/dist/types/new-metrics.d.ts +119 -0
  42. package/package.json +12 -8
  43. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +51 -0
  44. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +408 -0
  45. package/src/call-diagnostic/call-diagnostic-metrics.ts +591 -0
  46. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +233 -0
  47. package/src/call-diagnostic/config.ts +455 -0
  48. package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +2395 -0
  49. package/src/call-diagnostic/generated-types-temp/Event.ts +7762 -0
  50. package/src/call-diagnostic/generated-types-temp/MediaQualityEvent.ts +2321 -0
  51. package/src/config.js +19 -0
  52. package/src/index.ts +39 -0
  53. package/src/metrics.js +25 -27
  54. package/src/metrics.types.ts +137 -0
  55. package/src/new-metrics.ts +223 -0
  56. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +243 -0
  57. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +474 -0
  58. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +820 -0
  59. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +336 -0
  60. package/test/unit/spec/metrics.js +65 -97
  61. package/test/unit/spec/new-metrics.ts +153 -0
  62. package/tsconfig.json +6 -0
  63. package/dist/call-diagnostic-events-batcher.js +0 -60
  64. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  65. package/src/call-diagnostic-events-batcher.js +0 -62
  66. package/src/index.js +0 -17
  67. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
@@ -0,0 +1,336 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import {
4
+ clearEmptyKeysRecursively,
5
+ getBuildType,
6
+ isLocusServiceErrorCode,
7
+ prepareDiagnosticMetricItem,
8
+ setMetricTimings,
9
+ } from '../../../../src/call-diagnostic/call-diagnostic-metrics.util';
10
+ import CallDiagnosticLatencies from '../../../../src/call-diagnostic/call-diagnostic-metrics-latencies';
11
+
12
+ describe('internal-plugin-metrics', () => {
13
+ describe('clearEmptyKeysRecursively', () => {
14
+ it('should clear empty objects and empty nested objects recursively', () => {
15
+ const obj: any = {
16
+ foo: '',
17
+ bar: {},
18
+ baz: [],
19
+ nested: {
20
+ prop: {},
21
+ arr: ['test'],
22
+ },
23
+ };
24
+ clearEmptyKeysRecursively(obj);
25
+ console.log(obj);
26
+ assert.deepEqual(obj, {nested: {arr: ['test']}});
27
+ });
28
+
29
+ it('should not modify non-empty objects and arrays', () => {
30
+ const obj = {
31
+ foo: 'bar',
32
+ arr: [1, 2, 3],
33
+ };
34
+ clearEmptyKeysRecursively(obj);
35
+ assert.deepEqual(obj, {foo: 'bar', arr: [1, 2, 3]});
36
+ });
37
+
38
+ it('should not modify non-object and non-array values', () => {
39
+ const obj = {
40
+ prop1: 'value1',
41
+ prop2: 123,
42
+ };
43
+ clearEmptyKeysRecursively(obj);
44
+ assert.deepEqual(obj, {prop1: 'value1', prop2: 123});
45
+ });
46
+
47
+ it('should handle nested empty objects and arrays', () => {
48
+ const obj: any = {
49
+ foo: {
50
+ bar: {},
51
+ baz: [],
52
+ },
53
+ };
54
+ clearEmptyKeysRecursively(obj);
55
+ assert.deepEqual(obj, {foo: {}});
56
+ });
57
+
58
+ it('should handle an empty input object', () => {
59
+ const obj = {};
60
+ clearEmptyKeysRecursively(obj);
61
+ assert.deepEqual(obj, {});
62
+ });
63
+ });
64
+
65
+ describe('isLocusServiceErrorCode', () => {
66
+ [
67
+ [10000, false],
68
+ [2400000, true],
69
+ ['2400000', true],
70
+ [2400001, true],
71
+ ['2400001', true],
72
+ [240000, false],
73
+ [14000000, false],
74
+ ].forEach(([error, expected]) => {
75
+ it(`for code ${error} returns the correct result`, () => {
76
+ //@ts-ignore
77
+ assert.deepEqual(isLocusServiceErrorCode(error), expected);
78
+ });
79
+ });
80
+ });
81
+
82
+ describe('getBuildType', () => {
83
+ beforeEach(() => {
84
+ process.env.NODE_ENV = 'production';
85
+ });
86
+
87
+ [
88
+ ['https://localhost', 'test'],
89
+ ['https://127.0.0.1', 'test'],
90
+ ['https://web.webex.com', 'production'],
91
+ ].forEach(([webClientDomain, expected]) => {
92
+ it(`returns expected result for ${webClientDomain}`, () => {
93
+ assert.deepEqual(getBuildType(webClientDomain), expected);
94
+ });
95
+ });
96
+
97
+ it('returns "test" for NODE_ENV "foo"', () => {
98
+ process.env.NODE_ENV = 'foo';
99
+ assert.deepEqual(getBuildType('production'), 'test');
100
+ });
101
+ });
102
+
103
+ describe('prepareDiagnosticMetricItem', async () => {
104
+ let webex: any;
105
+
106
+ const check = (eventName: string, expectedEvent: any) => {
107
+ const eventPayload = {event: {name: eventName}};
108
+ const item = prepareDiagnosticMetricItem(webex, {
109
+ eventPayload,
110
+ type: ['diagnostic-event'],
111
+ });
112
+
113
+ assert.deepEqual(item, {
114
+ eventPayload: {
115
+ origin: {
116
+ buildType: 'production',
117
+ networkType: 'unknown',
118
+ },
119
+ event: {name: eventName, ...expectedEvent},
120
+ },
121
+ type: ['diagnostic-event'],
122
+ });
123
+ };
124
+
125
+ before(async () => {
126
+ webex = {internal: {newMetrics: {}}};
127
+ webex.internal.newMetrics.callDiagnosticLatencies = new CallDiagnosticLatencies(
128
+ {},
129
+ {parent: webex}
130
+ );
131
+ });
132
+
133
+ beforeEach(() => {
134
+ process.env.NODE_ENV = 'production';
135
+ });
136
+
137
+ afterEach(() => {
138
+ process.env.NODE_ENV = 'test';
139
+ });
140
+
141
+ [
142
+ ['client.exit.app', {}],
143
+ [
144
+ 'client.interstitial-window.launched',
145
+ {
146
+ joinTimes: {
147
+ clickToInterstitial: undefined,
148
+ meetingInfoReqResp: undefined,
149
+ },
150
+ },
151
+ ],
152
+ [
153
+ 'client.call.initiated',
154
+ {
155
+ joinTimes: {
156
+ showInterstitialTime: undefined,
157
+ meetingInfoReqResp: undefined,
158
+ },
159
+ },
160
+ ],
161
+ [
162
+ 'client.locus.join.response',
163
+ {
164
+ joinTimes: {
165
+ meetingInfoReqResp: undefined,
166
+ callInitJoinReq: undefined,
167
+ joinReqResp: undefined,
168
+ joinReqSentReceived: undefined,
169
+ pageJmt: undefined,
170
+ clickToInterstitial: undefined,
171
+ interstitialToJoinOK: undefined,
172
+ totalJmt: undefined,
173
+ clientJmt: undefined,
174
+ },
175
+ },
176
+ ],
177
+ [
178
+ 'client.ice.end',
179
+ {
180
+ joinTimes: {
181
+ ICESetupTime: undefined,
182
+ audioICESetupTime: undefined,
183
+ videoICESetupTime: undefined,
184
+ shareICESetupTime: undefined,
185
+ },
186
+ },
187
+ ],
188
+ [
189
+ 'client.media.rx.start',
190
+ {
191
+ joinTimes: {
192
+ localSDPGenRemoteSDPRecv: undefined,
193
+ },
194
+ },
195
+ ],
196
+ [
197
+ 'client.media-engine.ready',
198
+ {
199
+ joinTimes: {
200
+ totalMediaJMT: undefined,
201
+ interstitialToMediaOKJMT: undefined,
202
+ callInitMediaEngineReady: undefined,
203
+ stayLobbyTime: undefined,
204
+ },
205
+ },
206
+ ],
207
+ [
208
+ 'client.mediaquality.event',
209
+ {
210
+ audioSetupDelay: {
211
+ joinRespRxStart: undefined,
212
+ joinRespTxStart: undefined,
213
+ },
214
+ videoSetupDelay: {
215
+ joinRespRxStart: undefined,
216
+ joinRespTxStart: undefined,
217
+ },
218
+ },
219
+ ],
220
+ ].forEach(([eventName, expectedEvent]) => {
221
+ it(`returns expected result for ${eventName}`, () => {
222
+ check(eventName as string, expectedEvent);
223
+ });
224
+ });
225
+ });
226
+
227
+ describe('setMetricTimings', async () => {
228
+ let webex: any;
229
+
230
+ const check = (options: any, expectedOptions: any) => {
231
+ const newOptions = setMetricTimings(options);
232
+
233
+ assert.deepEqual(newOptions, expectedOptions);
234
+ };
235
+
236
+ it(`returns expected options`, () => {
237
+ const now = new Date();
238
+ sinon.useFakeTimers(now.getTime());
239
+
240
+ const options = {
241
+ body: {
242
+ metrics: [
243
+ {
244
+ eventPayload: {
245
+ originTime: {
246
+ triggered: 555,
247
+ sent: 666,
248
+ },
249
+ },
250
+ },
251
+ ],
252
+ },
253
+ };
254
+
255
+ const expectedOptions = {
256
+ body: {
257
+ metrics: [
258
+ {
259
+ eventPayload: {
260
+ originTime: {
261
+ triggered: now.toISOString(),
262
+ sent: now.toISOString(),
263
+ },
264
+ },
265
+ },
266
+ ],
267
+ },
268
+ };
269
+
270
+ check(options, expectedOptions);
271
+ sinon.restore();
272
+ });
273
+
274
+ it(`returns expected options for multiple metrics`, () => {
275
+ const now = new Date();
276
+ sinon.useFakeTimers(now.getTime());
277
+
278
+ const options = {
279
+ body: {
280
+ metrics: [
281
+ {
282
+ eventPayload: {
283
+ originTime: {
284
+ triggered: 555,
285
+ sent: 666,
286
+ },
287
+ },
288
+ },
289
+ {
290
+ eventPayload: {
291
+ originTime: {
292
+ triggered: 777,
293
+ sent: 888,
294
+ },
295
+ },
296
+ },
297
+ ],
298
+ },
299
+ };
300
+
301
+ const expectedOptions = {
302
+ body: {
303
+ metrics: [
304
+ {
305
+ eventPayload: {
306
+ originTime: {
307
+ triggered: now.toISOString(),
308
+ sent: now.toISOString(),
309
+ },
310
+ },
311
+ },
312
+ {
313
+ eventPayload: {
314
+ originTime: {
315
+ triggered: now.toISOString(),
316
+ sent: now.toISOString(),
317
+ },
318
+ },
319
+ },
320
+ ],
321
+ },
322
+ };
323
+
324
+ check(options, expectedOptions);
325
+ sinon.restore();
326
+ });
327
+
328
+ it(`does not throw when data missing`, () => {
329
+ const options = {};
330
+
331
+ const expectedOptions = {};
332
+
333
+ check(options, expectedOptions);
334
+ });
335
+ });
336
+ });
@@ -8,6 +8,9 @@ import {Token, Credentials} from '@webex/webex-core';
8
8
  import FakeTimers from '@sinonjs/fake-timers';
9
9
  import sinon from 'sinon';
10
10
  import Metrics, {config} from '@webex/internal-plugin-metrics';
11
+ import {BrowserDetection} from '@webex/common';
12
+
13
+ const {getOSVersion} = BrowserDetection();
11
14
 
12
15
  function promiseTick(count) {
13
16
  let promise = Promise.resolve();
@@ -102,7 +105,6 @@ describe('plugin-metrics', () => {
102
105
  sinon.spy(webex, 'request');
103
106
  sinon.spy(metrics, 'postPreLoginMetric');
104
107
  sinon.spy(metrics, 'aliasUser');
105
- sinon.spy(metrics, 'submitCallDiagnosticEvents');
106
108
  });
107
109
 
108
110
  describe('#submit()', () => {
@@ -131,6 +133,67 @@ describe('plugin-metrics', () => {
131
133
  });
132
134
  });
133
135
 
136
+ describe('#getClientMetricsPayload()', () => {
137
+ it('returns the expected payload', () => {
138
+ webex.credentials.supertoken = new Token(
139
+ {
140
+ access_token: 'a_b_orgid',
141
+ },
142
+ {parent: webex}
143
+ );
144
+
145
+ const testPayload = {
146
+ tags: {success: true},
147
+ fields: {perceivedDurationInMillis: 314},
148
+ context: {},
149
+ eventPayload: {value: 'splunk business metric payload'},
150
+ };
151
+ const date = clock.now;
152
+
153
+ const result = metrics.getClientMetricsPayload('test', testPayload);
154
+
155
+ assert.deepEqual(result, {
156
+ context: {
157
+ app: {
158
+ version: undefined,
159
+ },
160
+ locale: 'en-US',
161
+ os: {
162
+ name: 'other',
163
+ version: getOSVersion(),
164
+ },
165
+ },
166
+ eventPayload: {
167
+ value: 'splunk business metric payload',
168
+ },
169
+ fields: {
170
+ browser_version: '',
171
+ client_id: 'fake',
172
+ os_version: getOSVersion(),
173
+ perceivedDurationInMillis: 314,
174
+ platform: 'Web',
175
+ sdk_version: undefined,
176
+ spark_user_agent: 'webex-js-sdk appName/appVersion appPlatform',
177
+ },
178
+ metricName: 'test',
179
+ tags: {
180
+ browser: '',
181
+ domain: 'whatever',
182
+ os: 'other',
183
+ success: true,
184
+ },
185
+ timestamp: 0,
186
+ type: ['operational'],
187
+ });
188
+ });
189
+
190
+ it('throws when no event name is specified', () => {
191
+ assert.throws(() => {
192
+ metrics.getClientMetricsPayload();
193
+ }, 'Missing behavioral metric name. Please provide one');
194
+ });
195
+ });
196
+
134
197
  describe('#submitClientMetrics()', () => {
135
198
  describe('before login', () => {
136
199
  it('posts pre-login metric', () => {
@@ -199,17 +262,15 @@ describe('plugin-metrics', () => {
199
262
  assert.property(metric, 'eventPayload');
200
263
 
201
264
  assert.property(metric.tags, 'browser');
202
- assert.property(metric.tags, 'org_id');
203
265
  assert.property(metric.tags, 'os');
204
266
  assert.property(metric.tags, 'domain');
205
- assert.property(metric.tags, 'client_id');
206
- assert.property(metric.tags, 'user_id');
207
267
 
208
268
  assert.property(metric.fields, 'browser_version');
209
269
  assert.property(metric.fields, 'os_version');
210
270
  assert.property(metric.fields, 'sdk_version');
211
271
  assert.property(metric.fields, 'platform');
212
272
  assert.property(metric.fields, 'spark_user_agent');
273
+ assert.property(metric.fields, 'client_id');
213
274
 
214
275
  assert.property(metric.context, 'app');
215
276
  assert.property(metric.context, 'locale');
@@ -269,98 +330,5 @@ describe('plugin-metrics', () => {
269
330
  assert.match(params, {alias: true});
270
331
  }));
271
332
  });
272
-
273
- describe('#submitCallDiagnosticEvents()', () => {
274
- it('submits a call diagnostic event', () => {
275
- const promise = metrics.submitCallDiagnosticEvents(mockCallDiagnosticEvent);
276
-
277
- return promiseTick(50)
278
- .then(() => clock.tick(config.metrics.batcherWait))
279
- .then(() => promise)
280
- .then(() => {
281
- assert.calledOnce(webex.request);
282
- const req = webex.request.args[0][0];
283
- const metric = req.body.metrics[0];
284
-
285
- assert.property(metric.eventPayload, 'origin');
286
- assert.property(metric.eventPayload, 'originTime');
287
- assert.property(metric.eventPayload.origin, 'buildType');
288
- assert.property(metric.eventPayload.origin, 'networkType');
289
- assert.property(metric.eventPayload.originTime, 'sent');
290
- assert.equal(metric.eventPayload.origin.buildType, 'test');
291
- });
292
- });
293
-
294
- it('submits a call diagnostic event with buildType set in the payload', () => {
295
- const promise = metrics.submitCallDiagnosticEvents({
296
- ...mockCallDiagnosticEvent,
297
- origin: {
298
- buildType: 'prod',
299
- },
300
- });
301
-
302
- return promiseTick(50)
303
- .then(() => clock.tick(config.metrics.batcherWait))
304
- .then(() => promise)
305
- .then(() => {
306
- assert.calledOnce(webex.request);
307
- const req = webex.request.args[0][0];
308
- const metric = req.body.metrics[0];
309
-
310
- assert.property(metric.eventPayload, 'origin');
311
- assert.property(metric.eventPayload, 'originTime');
312
- assert.property(metric.eventPayload.origin, 'buildType');
313
- assert.property(metric.eventPayload.origin, 'networkType');
314
- assert.property(metric.eventPayload.originTime, 'sent');
315
- assert.equal(metric.eventPayload.origin.buildType, 'prod');
316
- });
317
- });
318
-
319
- xit('submits a call diagnostic event with a test domain', () => {
320
- global.window.location.hostname = 'test.webex.com';
321
-
322
- const promise = metrics.submitCallDiagnosticEvents(mockCallDiagnosticEvent);
323
-
324
- return promiseTick(50)
325
- .then(() => clock.tick(config.metrics.batcherWait))
326
- .then(() => promise)
327
- .then(() => {
328
- assert.calledOnce(webex.request);
329
- const req = webex.request.args[0][0];
330
- const metric = req.body.metrics[0];
331
-
332
- assert.property(metric.eventPayload, 'origin');
333
- assert.property(metric.eventPayload, 'originTime');
334
- assert.property(metric.eventPayload.origin, 'buildType');
335
- assert.property(metric.eventPayload.origin, 'networkType');
336
- assert.property(metric.eventPayload.originTime, 'sent');
337
- assert.equal(metric.eventPayload.origin.buildType, 'test');
338
- });
339
- });
340
-
341
- // Skip because it's current unable to overwrite NODE_ENV
342
- // However doing `NODE_ENV=test npm run test ...` will get this test case to pass
343
- xit('submits a call diagnostic event with a NODE_ENV=production', () => {
344
- process.env.NODE_ENV = 'production';
345
-
346
- const promise = metrics.submitCallDiagnosticEvents(mockCallDiagnosticEvent);
347
-
348
- return promiseTick(50)
349
- .then(() => clock.tick(config.metrics.batcherWait))
350
- .then(() => promise)
351
- .then(() => {
352
- assert.calledOnce(webex.request);
353
- const req = webex.request.args[0][0];
354
- const metric = req.body.metrics[0];
355
-
356
- assert.property(metric.eventPayload, 'origin');
357
- assert.property(metric.eventPayload, 'originTime');
358
- assert.property(metric.eventPayload.origin, 'buildType');
359
- assert.property(metric.eventPayload.origin, 'networkType');
360
- assert.property(metric.eventPayload.originTime, 'sent');
361
- assert.equal(metric.eventPayload.origin.buildType, 'prod');
362
- });
363
- });
364
- });
365
333
  });
366
334
  });
@@ -0,0 +1,153 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import {NewMetrics} from '@webex/internal-plugin-metrics';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import sinon from 'sinon';
5
+
6
+ describe('internal-plugin-metrics', () => {
7
+ describe('new-metrics', () => {
8
+ let webex;
9
+
10
+ beforeEach(() => {
11
+ //@ts-ignore
12
+ webex = new MockWebex({
13
+ children: {
14
+ newMetrics: NewMetrics,
15
+ },
16
+ meetings: {
17
+ meetingCollection: {
18
+ get: sinon.stub(),
19
+ },
20
+ },
21
+ });
22
+
23
+ webex.emit('ready');
24
+
25
+ webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp = sinon.stub();
26
+ webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps = sinon.stub();
27
+ webex.internal.newMetrics.callDiagnosticMetrics.submitClientEvent = sinon.stub();
28
+ webex.internal.newMetrics.callDiagnosticMetrics.submitMQE = sinon.stub();
29
+ webex.internal.newMetrics.callDiagnosticMetrics.buildClientEventFetchRequestOptions =
30
+ sinon.stub();
31
+ webex.setTimingsAndFetch = sinon.stub();
32
+ });
33
+
34
+ it('submits Client Event successfully', () => {
35
+ webex.internal.newMetrics.submitClientEvent({
36
+ name: 'client.alert.displayed',
37
+ options: {
38
+ meetingId: '123',
39
+ },
40
+ });
41
+
42
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
43
+ key: 'client.alert.displayed',
44
+ options: {meetingId: '123'},
45
+ });
46
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticMetrics.submitClientEvent, {
47
+ name: 'client.alert.displayed',
48
+ payload: undefined,
49
+ options: {meetingId: '123'},
50
+ });
51
+ });
52
+
53
+ it('submits MQE successfully', () => {
54
+ webex.internal.newMetrics.submitMQE({
55
+ name: 'client.mediaquality.event',
56
+ //@ts-ignore
57
+ payload: {intervals: [{}]},
58
+ options: {
59
+ meetingId: '123',
60
+ networkType: 'wifi',
61
+ },
62
+ });
63
+
64
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
65
+ key: 'client.mediaquality.event',
66
+ });
67
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticMetrics.submitMQE, {
68
+ name: 'client.mediaquality.event',
69
+ //@ts-ignore
70
+ payload: {intervals: [{}]},
71
+ options: {
72
+ meetingId: '123',
73
+ networkType: 'wifi',
74
+ },
75
+ });
76
+ });
77
+
78
+ it('submits Internal Event successfully', () => {
79
+ webex.internal.newMetrics.submitInternalEvent({
80
+ name: 'client.mediaquality.event',
81
+ });
82
+
83
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
84
+ key: 'client.mediaquality.event',
85
+ });
86
+ assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps);
87
+ });
88
+
89
+ it('submits Internal Event successfully for clearing the join latencies', () => {
90
+ webex.internal.newMetrics.submitInternalEvent({
91
+ name: 'internal.reset.join.latencies',
92
+ });
93
+
94
+ assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp);
95
+ assert.calledOnce(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps);
96
+ });
97
+
98
+ describe('#buildClientEventFetchRequestOptions', () => {
99
+ it('builds client event fetch options successfully', () => {
100
+ webex.internal.newMetrics.buildClientEventFetchRequestOptions({
101
+ name: 'client.alert.displayed',
102
+ options: {
103
+ meetingId: '123',
104
+ },
105
+ });
106
+
107
+ assert.calledWith(
108
+ webex.internal.newMetrics.callDiagnosticMetrics.buildClientEventFetchRequestOptions,
109
+ {
110
+ name: 'client.alert.displayed',
111
+ payload: undefined,
112
+ options: {meetingId: '123'},
113
+ }
114
+ );
115
+ });
116
+ });
117
+
118
+ describe('#setMetricTimingsAndFetch', () => {
119
+ beforeEach(() => {
120
+ global.fetch = sinon.stub();
121
+ });
122
+
123
+ it('calls fetch with the expected options', () => {
124
+ const now = new Date();
125
+ sinon.useFakeTimers(now.getTime());
126
+
127
+ webex.internal.newMetrics.setMetricTimingsAndFetch({
128
+ body: {metrics: [{eventPayload: {}}]},
129
+ });
130
+
131
+ const expected = {
132
+ body: {
133
+ metrics: [
134
+ {
135
+ eventPayload: {
136
+ originTime: {
137
+ triggered: now.toISOString(),
138
+ sent: now.toISOString(),
139
+ },
140
+ },
141
+ },
142
+ ],
143
+ },
144
+ };
145
+
146
+ sinon.assert.calledOnce(webex.setTimingsAndFetch);
147
+ sinon.assert.calledWith(webex.setTimingsAndFetch, expected);
148
+
149
+ sinon.restore();
150
+ });
151
+ });
152
+ });
153
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "../../../tsconfig.json",
3
+ "include": [
4
+ "src"
5
+ ],
6
+ }