@webex/internal-plugin-mercury 3.0.0-beta.9 → 3.0.0-bnr.0

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.
@@ -11,7 +11,7 @@ import Mercury, {
11
11
  // NotFound,
12
12
  config as mercuryConfig,
13
13
  ConnectionError,
14
- Socket
14
+ Socket,
15
15
  } from '@webex/internal-plugin-mercury';
16
16
  import sinon from 'sinon';
17
17
  import MockWebex from '@webex/test-helper-mock-webex';
@@ -24,23 +24,19 @@ import promiseTick from '../lib/promise-tick';
24
24
 
25
25
  describe('plugin-mercury', () => {
26
26
  describe('Mercury', () => {
27
- let clock,
28
- mercury,
29
- mockWebSocket,
30
- socketOpenStub,
31
- webex;
27
+ let clock, mercury, mockWebSocket, socketOpenStub, webex;
32
28
 
33
29
  const statusStartTypingMessage = JSON.stringify({
34
30
  id: uuid.v4(),
35
31
  data: {
36
32
  eventType: 'status.start_typing',
37
33
  actor: {
38
- id: 'actorId'
34
+ id: 'actorId',
39
35
  },
40
- conversationId: uuid.v4()
36
+ conversationId: uuid.v4(),
41
37
  },
42
38
  timestamp: Date.now(),
43
- trackingId: `suffix_${uuid.v4()}_${Date.now()}`
39
+ trackingId: `suffix_${uuid.v4()}_${Date.now()}`,
44
40
  });
45
41
 
46
42
  beforeEach(() => {
@@ -54,27 +50,31 @@ describe('plugin-mercury', () => {
54
50
  beforeEach(() => {
55
51
  webex = new MockWebex({
56
52
  children: {
57
- mercury: Mercury
58
- }
53
+ mercury: Mercury,
54
+ },
59
55
  });
60
56
  webex.credentials = {
61
57
  refresh: sinon.stub().returns(Promise.resolve()),
62
- getUserToken: sinon.stub().returns(Promise.resolve({
63
- toString() {
64
- return 'Bearer FAKE';
65
- }
66
- }))
58
+ getUserToken: sinon.stub().returns(
59
+ Promise.resolve({
60
+ toString() {
61
+ return 'Bearer FAKE';
62
+ },
63
+ })
64
+ ),
67
65
  };
68
66
  webex.internal.device = {
69
67
  register: sinon.stub().returns(Promise.resolve()),
70
68
  refresh: sinon.stub().returns(Promise.resolve()),
71
69
  webSocketUrl: 'ws://example.com',
72
70
  getWebSocketUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
73
- useServiceCatalogUrl: sinon.stub().returns(Promise.resolve('https://service-catalog-url.com'))
71
+ useServiceCatalogUrl: sinon
72
+ .stub()
73
+ .returns(Promise.resolve('https://service-catalog-url.com')),
74
74
  };
75
75
  webex.internal.services = {
76
76
  convertUrlToPriorityHostUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
77
- markFailedUrl: sinon.stub().returns(Promise.resolve())
77
+ markFailedUrl: sinon.stub().returns(Promise.resolve()),
78
78
  };
79
79
  webex.internal.metrics.submitClientMetrics = sinon.stub();
80
80
  webex.trackingId = 'fakeTrackingId';
@@ -132,10 +132,9 @@ describe('plugin-mercury', () => {
132
132
 
133
133
  mockWebSocket.open();
134
134
 
135
- return promise
136
- .then(() => {
137
- assert.calledOnce(webex.internal.device.register);
138
- });
135
+ return promise.then(() => {
136
+ assert.calledOnce(webex.internal.device.register);
137
+ });
139
138
  });
140
139
 
141
140
  it('connects to Mercury using default url', () => {
@@ -145,12 +144,11 @@ describe('plugin-mercury', () => {
145
144
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
146
145
  mockWebSocket.open();
147
146
 
148
- return promise
149
- .then(() => {
150
- assert.isTrue(mercury.connected, 'Mercury is connected');
151
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
152
- assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.any);
153
- });
147
+ return promise.then(() => {
148
+ assert.isTrue(mercury.connected, 'Mercury is connected');
149
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
150
+ assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.any);
151
+ });
154
152
  });
155
153
 
156
154
  describe('when `maxRetries` is set', () => {
@@ -198,15 +196,14 @@ describe('plugin-mercury', () => {
198
196
  mercury.connect(),
199
197
  mercury.connect(),
200
198
  mercury.connect(),
201
- mercury.connect()
199
+ mercury.connect(),
202
200
  ]);
203
201
 
204
202
  mockWebSocket.open();
205
203
 
206
- return promise
207
- .then(() => {
208
- assert.calledOnce(Socket.prototype.open);
209
- });
204
+ return promise.then(() => {
205
+ assert.calledOnce(Socket.prototype.open);
206
+ });
210
207
  });
211
208
 
212
209
  // skipping due to apparent bug with lolex in all browsers but Chrome.
@@ -261,7 +258,9 @@ describe('plugin-mercury', () => {
261
258
  it('fails permanently', () => {
262
259
  clock.uninstall();
263
260
  socketOpenStub.restore();
264
- socketOpenStub = sinon.stub(Socket.prototype, 'open').returns(Promise.reject(new BadRequest({code: 4400})));
261
+ socketOpenStub = sinon
262
+ .stub(Socket.prototype, 'open')
263
+ .returns(Promise.reject(new BadRequest({code: 4400})));
265
264
 
266
265
  return assert.isRejected(mercury.connect());
267
266
  });
@@ -276,18 +275,16 @@ describe('plugin-mercury', () => {
276
275
  assert.notCalled(webex.internal.device.refresh);
277
276
  const promise = mercury.connect();
278
277
 
279
- return promiseTick(7)
280
- .then(() => {
281
- assert.notCalled(webex.credentials.refresh);
282
- assert.called(webex.internal.device.refresh);
283
- clock.tick(1000);
278
+ return promiseTick(7).then(() => {
279
+ assert.notCalled(webex.credentials.refresh);
280
+ assert.called(webex.internal.device.refresh);
281
+ clock.tick(1000);
284
282
 
285
- return promise;
286
- });
283
+ return promise;
284
+ });
287
285
  });
288
286
  });
289
287
 
290
-
291
288
  describe('with `NotAuthorized`', () => {
292
289
  it('triggers a token refresh', () => {
293
290
  socketOpenStub.restore();
@@ -297,14 +294,13 @@ describe('plugin-mercury', () => {
297
294
  assert.notCalled(webex.internal.device.refresh);
298
295
  const promise = mercury.connect();
299
296
 
300
- return promiseTick(7)
301
- .then(() => {
302
- assert.called(webex.credentials.refresh);
303
- assert.notCalled(webex.internal.device.refresh);
304
- clock.tick(1000);
297
+ return promiseTick(7).then(() => {
298
+ assert.called(webex.credentials.refresh);
299
+ assert.notCalled(webex.internal.device.refresh);
300
+ clock.tick(1000);
305
301
 
306
- return promise;
307
- });
302
+ return promise;
303
+ });
308
304
  });
309
305
  });
310
306
 
@@ -312,7 +308,9 @@ describe('plugin-mercury', () => {
312
308
  it('fails permanently', () => {
313
309
  clock.uninstall();
314
310
  socketOpenStub.restore();
315
- socketOpenStub = sinon.stub(Socket.prototype, 'open').returns(Promise.reject(new Forbidden({code: 4403})));
311
+ socketOpenStub = sinon
312
+ .stub(Socket.prototype, 'open')
313
+ .returns(Promise.reject(new Forbidden({code: 4403})));
316
314
 
317
315
  return assert.isRejected(mercury.connect());
318
316
  });
@@ -344,20 +342,19 @@ describe('plugin-mercury', () => {
344
342
  socketOpenStub.onCall(0).returns(Promise.reject(new ConnectionError({code: 4001})));
345
343
  const promise = mercury.connect();
346
344
 
347
- return promiseTick(7)
348
- .then(() => {
349
- assert.calledOnce(webex.internal.services.markFailedUrl);
350
- clock.tick(1000);
345
+ return promiseTick(7).then(() => {
346
+ assert.calledOnce(webex.internal.services.markFailedUrl);
347
+ clock.tick(1000);
351
348
 
352
- return promise;
353
- });
349
+ return promise;
350
+ });
354
351
  });
355
352
  });
356
353
  });
357
354
 
358
355
  describe('when connected', () => {
359
- it('resolves immediately', () => mercury.connect()
360
- .then(() => {
356
+ it('resolves immediately', () =>
357
+ mercury.connect().then(() => {
361
358
  assert.isTrue(mercury.connected, 'Mercury is connected');
362
359
  assert.isFalse(mercury.connecting, 'Mercury is not connecting');
363
360
  const promise = mercury.connect();
@@ -393,12 +390,15 @@ describe('plugin-mercury', () => {
393
390
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
394
391
  mockWebSocket.open();
395
392
 
396
- return promise
397
- .then(() => {
398
- assert.isTrue(mercury.connected, 'Mercury is connected');
399
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
400
- assert.calledWith(Socket.prototype.open, sinon.match(/ws:\/\/providedurl.com/), sinon.match.any);
401
- });
393
+ return promise.then(() => {
394
+ assert.isTrue(mercury.connected, 'Mercury is connected');
395
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
396
+ assert.calledWith(
397
+ Socket.prototype.open,
398
+ sinon.match(/ws:\/\/providedurl.com/),
399
+ sinon.match.any
400
+ );
401
+ });
402
402
  });
403
403
  });
404
404
  });
@@ -418,13 +418,18 @@ describe('plugin-mercury', () => {
418
418
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
419
419
  mockWebSocket.open();
420
420
 
421
- return promise
422
- .then(() => {
423
- assert.isTrue(mercury.connected, 'Mercury is connected');
424
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
425
- assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.has('agent',
426
- sinon.match.has('proxy', sinon.match.has('href', testProxyUrl))));
427
- });
421
+ return promise.then(() => {
422
+ assert.isTrue(mercury.connected, 'Mercury is connected');
423
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
424
+ assert.calledWith(
425
+ socketOpenStub,
426
+ sinon.match(/ws:\/\/example.com/),
427
+ sinon.match.has(
428
+ 'agent',
429
+ sinon.match.has('proxy', sinon.match.has('href', testProxyUrl))
430
+ )
431
+ );
432
+ });
428
433
  });
429
434
 
430
435
  it('connects to Mercury without proxy agent', () => {
@@ -434,41 +439,47 @@ describe('plugin-mercury', () => {
434
439
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
435
440
  mockWebSocket.open();
436
441
 
437
- return promise
438
- .then(() => {
439
- assert.isTrue(mercury.connected, 'Mercury is connected');
440
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
441
- assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match({agent: undefined}));
442
- });
442
+ return promise.then(() => {
443
+ assert.isTrue(mercury.connected, 'Mercury is connected');
444
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
445
+ assert.calledWith(
446
+ socketOpenStub,
447
+ sinon.match(/ws:\/\/example.com/),
448
+ sinon.match({agent: undefined})
449
+ );
450
+ });
443
451
  });
444
452
  });
445
453
 
446
454
  describe('#disconnect()', () => {
447
- it('disconnects the WebSocket', () => mercury.connect()
448
- .then(() => {
449
- assert.isTrue(mercury.connected, 'Mercury is connected');
450
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
451
- const promise = mercury.disconnect();
455
+ it('disconnects the WebSocket', () =>
456
+ mercury
457
+ .connect()
458
+ .then(() => {
459
+ assert.isTrue(mercury.connected, 'Mercury is connected');
460
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
461
+ const promise = mercury.disconnect();
452
462
 
453
- mockWebSocket.emit('close', {
454
- code: 1000,
455
- reason: 'Done'
456
- });
463
+ mockWebSocket.emit('close', {
464
+ code: 1000,
465
+ reason: 'Done',
466
+ });
457
467
 
458
- return promise;
459
- })
460
- .then(() => {
461
- assert.isFalse(mercury.connected, 'Mercury is not connected');
462
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
463
- assert.isUndefined(mercury.mockWebSocket, 'Mercury does not have a mockWebSocket');
464
- }));
468
+ return promise;
469
+ })
470
+ .then(() => {
471
+ assert.isFalse(mercury.connected, 'Mercury is not connected');
472
+ assert.isFalse(mercury.connecting, 'Mercury is not connecting');
473
+ assert.isUndefined(mercury.mockWebSocket, 'Mercury does not have a mockWebSocket');
474
+ }));
465
475
 
466
476
  it('stops emitting message events', () => {
467
477
  const spy = sinon.spy();
468
478
 
469
479
  mercury.on('event:status.start_typing', spy);
470
480
 
471
- return mercury.connect()
481
+ return mercury
482
+ .connect()
472
483
  .then(() => {
473
484
  assert.isTrue(mercury.connected, 'Mercury is connected');
474
485
  assert.isFalse(mercury.connecting, 'Mercury is not connecting');
@@ -488,7 +499,7 @@ describe('plugin-mercury', () => {
488
499
  mockWebSocket.emit('message', {data: statusStartTypingMessage});
489
500
  mockWebSocket.emit('close', {
490
501
  code: 1000,
491
- reason: 'Done'
502
+ reason: 'Done',
492
503
  });
493
504
  mockWebSocket.emit('message', {data: statusStartTypingMessage});
494
505
 
@@ -511,28 +522,27 @@ describe('plugin-mercury', () => {
511
522
  // Delay the opening of the socket so that disconnect is called while open
512
523
  // is in progress
513
524
  promiseTick(2 * webex.internal.mercury.config.backoffTimeReset)
514
- // Pretend the socket opened successfully. Failing should be fine too but
515
- // it generates more console output.
525
+ // Pretend the socket opened successfully. Failing should be fine too but
526
+ // it generates more console output.
516
527
  .then(() => Promise.resolve())
517
528
  );
518
529
  const promise = mercury.connect();
519
530
 
520
531
  // Wait for the connect call to setup
521
- return promiseTick(webex.internal.mercury.config.backoffTimeReset)
522
- .then(() => {
523
- // By this time backoffCall and mercury socket should be defined by the
524
- // 'connect' call
525
- assert.isDefined(mercury.backoffCall, 'Mercury backoffCall is not defined');
526
- assert.isDefined(mercury.socket, 'Mercury socket is not defined');
527
- // Calling disconnect will abort the backoffCall, close the socket, and
528
- // reject the connect
529
- mercury.disconnect();
530
- assert.isUndefined(mercury.backoffCall, 'Mercury backoffCall is still defined');
531
- // The socket will never be unset (which seems bad)
532
- assert.isDefined(mercury.socket, 'Mercury socket is not defined');
533
-
534
- return assert.isRejected(promise);
535
- });
532
+ return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
533
+ // By this time backoffCall and mercury socket should be defined by the
534
+ // 'connect' call
535
+ assert.isDefined(mercury.backoffCall, 'Mercury backoffCall is not defined');
536
+ assert.isDefined(mercury.socket, 'Mercury socket is not defined');
537
+ // Calling disconnect will abort the backoffCall, close the socket, and
538
+ // reject the connect
539
+ mercury.disconnect();
540
+ assert.isUndefined(mercury.backoffCall, 'Mercury backoffCall is still defined');
541
+ // The socket will never be unset (which seems bad)
542
+ assert.isDefined(mercury.socket, 'Mercury socket is not defined');
543
+
544
+ return assert.isRejected(promise);
545
+ });
536
546
  });
537
547
 
538
548
  it('stops the attempt when backoffCall is undefined', () => {
@@ -547,10 +557,12 @@ describe('plugin-mercury', () => {
547
557
  reason = _reason;
548
558
  });
549
559
 
550
- return promiseTick(webex.internal.mercury.config.backoffTimeReset)
551
- .then(() => {
552
- assert.equal(reason.message, 'mercury: prevent socket open when backoffCall no longer defined');
553
- });
560
+ return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
561
+ assert.equal(
562
+ reason.message,
563
+ 'mercury: prevent socket open when backoffCall no longer defined'
564
+ );
565
+ });
554
566
  });
555
567
  });
556
568
  });
@@ -572,11 +584,11 @@ describe('plugin-mercury', () => {
572
584
  it('merges a single header field with data', () => {
573
585
  const envelope = {
574
586
  headers: {
575
- 'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
587
+ 'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
576
588
  },
577
589
  data: {
578
- activity: {}
579
- }
590
+ activity: {},
591
+ },
580
592
  };
581
593
 
582
594
  mercury._applyOverrides(envelope);
@@ -588,27 +600,30 @@ describe('plugin-mercury', () => {
588
600
  const envelope = {
589
601
  headers: {
590
602
  'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
591
- 'data.activity.target.lastReadableActivityDate': lastReadableActivityDate
603
+ 'data.activity.target.lastReadableActivityDate': lastReadableActivityDate,
592
604
  },
593
605
  data: {
594
- activity: {}
595
- }
606
+ activity: {},
607
+ },
596
608
  };
597
609
 
598
610
  mercury._applyOverrides(envelope);
599
611
 
600
612
  assert.equal(envelope.data.activity.target.lastSeenActivityDate, lastSeenActivityDate);
601
- assert.equal(envelope.data.activity.target.lastReadableActivityDate, lastReadableActivityDate);
613
+ assert.equal(
614
+ envelope.data.activity.target.lastReadableActivityDate,
615
+ lastReadableActivityDate
616
+ );
602
617
  });
603
618
 
604
619
  it('merges headers when Mercury messages arrive', () => {
605
620
  const envelope = {
606
621
  headers: {
607
- 'data.activity.target.lastSeenActivityDate': lastSeenActivityDate
622
+ 'data.activity.target.lastSeenActivityDate': lastSeenActivityDate,
608
623
  },
609
624
  data: {
610
- activity: {}
611
- }
625
+ activity: {},
626
+ },
612
627
  };
613
628
 
614
629
  mercury._applyOverrides(envelope);
@@ -622,19 +637,24 @@ describe('plugin-mercury', () => {
622
637
  webex.internal.device.webSocketUrl = 'ws://example.com';
623
638
  });
624
639
 
625
- it('uses device default webSocketUrl', () => webex.internal.mercury._prepareUrl()
626
- .then((wsUrl) => assert.match(wsUrl, /example.com/)));
627
- it('uses provided webSocketUrl', () => webex.internal.mercury._prepareUrl('ws://provided.com')
628
- .then((wsUrl) => assert.match(wsUrl, /provided.com/)));
629
- it('requests text-mode WebSockets', () => webex.internal.mercury._prepareUrl()
630
- .then((wsUrl) => assert.match(wsUrl, /outboundWireFormat=text/)));
631
-
632
- it('requests the buffer state message', () => webex.internal.mercury._prepareUrl()
633
- .then((wsUrl) => assert.match(wsUrl, /bufferStates=true/)));
634
-
635
-
636
- it('does not add conditional properties', () => webex.internal.mercury._prepareUrl()
637
- .then((wsUrl) => {
640
+ it('uses device default webSocketUrl', () =>
641
+ webex.internal.mercury._prepareUrl().then((wsUrl) => assert.match(wsUrl, /example.com/)));
642
+ it('uses provided webSocketUrl', () =>
643
+ webex.internal.mercury
644
+ ._prepareUrl('ws://provided.com')
645
+ .then((wsUrl) => assert.match(wsUrl, /provided.com/)));
646
+ it('requests text-mode WebSockets', () =>
647
+ webex.internal.mercury
648
+ ._prepareUrl()
649
+ .then((wsUrl) => assert.match(wsUrl, /outboundWireFormat=text/)));
650
+
651
+ it('requests the buffer state message', () =>
652
+ webex.internal.mercury
653
+ ._prepareUrl()
654
+ .then((wsUrl) => assert.match(wsUrl, /bufferStates=true/)));
655
+
656
+ it('does not add conditional properties', () =>
657
+ webex.internal.mercury._prepareUrl().then((wsUrl) => {
638
658
  assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
639
659
  assert.notMatch(wsUrl, /mercuryRegistrationStatus/);
640
660
  assert.notMatch(wsUrl, /isRegistrationRefreshEnabled/);
@@ -643,27 +663,34 @@ describe('plugin-mercury', () => {
643
663
 
644
664
  describe('when web-high-availability is enabled', () => {
645
665
  it('uses webSocketUrl provided by device', () => {
646
- webex.internal.device.useServiceCatalogUrl = sinon.stub().returns(Promise.resolve('ws://example-2.com'));
666
+ webex.internal.device.useServiceCatalogUrl = sinon
667
+ .stub()
668
+ .returns(Promise.resolve('ws://example-2.com'));
647
669
  webex.internal.feature.getFeature.onCall(0).returns(Promise.resolve(true));
648
670
 
649
- return webex.internal.mercury._prepareUrl()
671
+ return webex.internal.mercury
672
+ ._prepareUrl()
650
673
  .then((wsUrl) => assert.match(wsUrl, /example-2.com/));
651
674
  });
652
675
  });
653
676
 
654
- describe('when \'web-shared-socket\' is enabled', () => {
677
+ describe("when 'web-shared-socket' is enabled", () => {
655
678
  beforeEach(() => {
656
679
  webex.internal.feature.getFeature.returns(Promise.resolve(true));
657
680
  });
658
681
 
659
- it('requests shared socket support', () => webex.internal.mercury._prepareUrl()
660
- .then((wsUrl) => assert.match(wsUrl, /isRegistrationRefreshEnabled=true/)));
682
+ it('requests shared socket support', () =>
683
+ webex.internal.mercury
684
+ ._prepareUrl()
685
+ .then((wsUrl) => assert.match(wsUrl, /isRegistrationRefreshEnabled=true/)));
661
686
 
662
- it('requests the registration banner', () => webex.internal.mercury._prepareUrl()
663
- .then((wsUrl) => assert.match(wsUrl, /mercuryRegistrationStatus=true/)));
687
+ it('requests the registration banner', () =>
688
+ webex.internal.mercury
689
+ ._prepareUrl()
690
+ .then((wsUrl) => assert.match(wsUrl, /mercuryRegistrationStatus=true/)));
664
691
 
665
- it('does not request the buffer state message', () => webex.internal.mercury._prepareUrl()
666
- .then((wsUrl) => {
692
+ it('does not request the buffer state message', () =>
693
+ webex.internal.mercury._prepareUrl().then((wsUrl) => {
667
694
  assert.match(wsUrl, /mercuryRegistrationStatus=true/);
668
695
  assert.notMatch(wsUrl, /bufferStates/);
669
696
  }));
@@ -674,8 +701,10 @@ describe('plugin-mercury', () => {
674
701
  webex.config.device.ephemeral = true;
675
702
  });
676
703
 
677
- it('indicates multiple connections may be coming from this user', () => webex.internal.mercury._prepareUrl()
678
- .then((wsUrl) => assert.match(wsUrl, /multipleConnections/)));
704
+ it('indicates multiple connections may be coming from this user', () =>
705
+ webex.internal.mercury
706
+ ._prepareUrl()
707
+ .then((wsUrl) => assert.match(wsUrl, /multipleConnections/)));
679
708
  });
680
709
  });
681
710
  });