@webex/internal-plugin-mercury 2.60.0 → 2.60.1-next.10

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.
@@ -32,12 +32,13 @@ describe('plugin-mercury', function () {
32
32
  );
33
33
 
34
34
  describe('onBeforeLogout()', () => {
35
- it('disconnects the web socket', () =>
35
+ it('disconnects the web socket', () => {
36
36
  webex.logout({noRedirect: true}).then(() => {
37
37
  assert.called(webex.internal.mercury.disconnect);
38
38
  assert.isFalse(webex.internal.mercury.connected);
39
39
  assert.called(webex.internal.device.unregister);
40
40
  assert.isFalse(webex.internal.device.registered);
41
- }));
41
+ });
42
+ });
42
43
  });
43
44
  });
@@ -452,11 +452,13 @@ describe('plugin-mercury', () => {
452
452
  });
453
453
 
454
454
  describe.skip('#disconnect()', () => {
455
- it('disconnects the WebSocket', () => mercury.connect()
456
- .then(() => {
457
- assert.isTrue(mercury.connected, 'Mercury is connected');
458
- assert.isFalse(mercury.connecting, 'Mercury is not connecting');
459
- 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();
460
462
 
461
463
  mockWebSocket.emit('close', {
462
464
  code: 1000,
@@ -558,7 +560,7 @@ describe('plugin-mercury', () => {
558
560
  return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
559
561
  assert.equal(
560
562
  reason.message,
561
- 'mercury: prevent socket open when backoffCall no longer defined'
563
+ 'Mercury: prevent socket open when backoffCall no longer defined'
562
564
  );
563
565
  });
564
566
  });
@@ -566,12 +568,21 @@ describe('plugin-mercury', () => {
566
568
  });
567
569
 
568
570
  describe('#_emit()', () => {
569
- it('emits Error-safe events', () => {
571
+ it('emits Error-safe events and log the error with the call parameters', () => {
572
+ const error = 'error';
573
+ const event = {data: 'some data'};
570
574
  mercury.on('break', () => {
571
- throw new Error();
575
+ throw error;
572
576
  });
577
+ sinon.stub(mercury.logger, 'error');
573
578
 
574
- return Promise.resolve(mercury._emit('break'));
579
+ return Promise.resolve(mercury._emit('break', event)).then((res) => {
580
+ assert.calledWith(mercury.logger.error, 'Mercury: error occurred in event handler', {
581
+ error,
582
+ arguments: ['break', event],
583
+ });
584
+ return res;
585
+ });
575
586
  });
576
587
  });
577
588
 
@@ -706,4 +717,99 @@ describe('plugin-mercury', () => {
706
717
  });
707
718
  });
708
719
  });
720
+ describe('ping pong latency event is forwarded', () => {
721
+ let clock, mercury, mockWebSocket, socketOpenStub, webex;
722
+
723
+ const statusStartTypingMessage = JSON.stringify({
724
+ id: uuid.v4(),
725
+ data: {
726
+ eventType: 'status.start_typing',
727
+ actor: {
728
+ id: 'actorId',
729
+ },
730
+ conversationId: uuid.v4(),
731
+ },
732
+ timestamp: Date.now(),
733
+ trackingId: `suffix_${uuid.v4()}_${Date.now()}`,
734
+ });
735
+
736
+ beforeEach(() => {
737
+ clock = FakeTimers.install({now: Date.now()});
738
+ });
739
+
740
+ afterEach(() => {
741
+ clock.uninstall();
742
+ });
743
+
744
+ beforeEach(() => {
745
+ webex = new MockWebex({
746
+ children: {
747
+ mercury: Mercury,
748
+ },
749
+ });
750
+ webex.credentials = {
751
+ refresh: sinon.stub().returns(Promise.resolve()),
752
+ getUserToken: sinon.stub().returns(
753
+ Promise.resolve({
754
+ toString() {
755
+ return 'Bearer FAKE';
756
+ },
757
+ })
758
+ ),
759
+ };
760
+ webex.internal.device = {
761
+ register: sinon.stub().returns(Promise.resolve()),
762
+ refresh: sinon.stub().returns(Promise.resolve()),
763
+ webSocketUrl: 'ws://example.com',
764
+ getWebSocketUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
765
+ useServiceCatalogUrl: sinon
766
+ .stub()
767
+ .returns(Promise.resolve('https://service-catalog-url.com')),
768
+ };
769
+ webex.internal.services = {
770
+ convertUrlToPriorityHostUrl: sinon.stub().returns(Promise.resolve('ws://example-2.com')),
771
+ markFailedUrl: sinon.stub().returns(Promise.resolve()),
772
+ };
773
+ webex.internal.metrics.submitClientMetrics = sinon.stub();
774
+ webex.trackingId = 'fakeTrackingId';
775
+ webex.config.mercury = mercuryConfig.mercury;
776
+
777
+ webex.logger = console;
778
+
779
+ mockWebSocket = new MockWebSocket();
780
+ sinon.stub(Socket, 'getWebSocketConstructor').returns(() => mockWebSocket);
781
+
782
+ const origOpen = Socket.prototype.open;
783
+
784
+ socketOpenStub = sinon.stub(Socket.prototype, 'open').callsFake(function (...args) {
785
+ const promise = Reflect.apply(origOpen, this, args);
786
+
787
+ process.nextTick(() => mockWebSocket.open());
788
+
789
+ return promise;
790
+ });
791
+
792
+ mercury = webex.internal.mercury;
793
+ });
794
+
795
+ afterEach(() => {
796
+ if (socketOpenStub) {
797
+ socketOpenStub.restore();
798
+ }
799
+
800
+ if (Socket.getWebSocketConstructor.restore) {
801
+ Socket.getWebSocketConstructor.restore();
802
+ }
803
+ });
804
+ it('should forward ping pong latency event', () => {
805
+ const spy = sinon.spy();
806
+
807
+ mercury.on('ping-pong-latency', spy);
808
+
809
+ return mercury.connect().then(() => {
810
+ assert.calledWith(spy, 0);
811
+ assert.calledOnce(spy);
812
+ });
813
+ });
814
+ });
709
815
  });
@@ -807,6 +807,23 @@ describe('plugin-mercury', () => {
807
807
  reason: 'Pong mismatch',
808
808
  });
809
809
  });
810
+
811
+ it('emits ping pong latency correctly', () => {
812
+ const spy = sinon.spy();
813
+
814
+ socket.on('ping-pong-latency', spy);
815
+
816
+ socket._ping(123);
817
+ mockWebSocket.emit('message', {
818
+ data: JSON.stringify({
819
+ type: 'pong',
820
+ id: 123,
821
+ }),
822
+ });
823
+
824
+ assert.calledWith(spy, 0);
825
+ assert.calledOnce(spy);
826
+ });
810
827
  });
811
828
  });
812
829
  });