@webex/plugin-meetings 3.5.0-wxcc.1 → 3.6.0-next.1

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 (52) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +4 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/constants.js +1 -0
  6. package/dist/constants.js.map +1 -1
  7. package/dist/interpretation/index.js +1 -1
  8. package/dist/interpretation/siLanguage.js +1 -1
  9. package/dist/media/index.js +3 -1
  10. package/dist/media/index.js.map +1 -1
  11. package/dist/meeting/in-meeting-actions.js +3 -1
  12. package/dist/meeting/in-meeting-actions.js.map +1 -1
  13. package/dist/meeting/index.js +39 -4
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/util.js +8 -10
  16. package/dist/meeting/util.js.map +1 -1
  17. package/dist/meetings/index.js +100 -26
  18. package/dist/meetings/index.js.map +1 -1
  19. package/dist/roap/request.js +1 -1
  20. package/dist/roap/request.js.map +1 -1
  21. package/dist/types/config.d.ts +2 -0
  22. package/dist/types/constants.d.ts +2 -1
  23. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  24. package/dist/types/meeting/index.d.ts +11 -0
  25. package/dist/types/meetings/index.d.ts +43 -2
  26. package/dist/webinar/index.js +1 -1
  27. package/package.json +22 -22
  28. package/src/config.ts +3 -0
  29. package/src/constants.ts +1 -0
  30. package/src/media/index.ts +4 -1
  31. package/src/meeting/in-meeting-actions.ts +3 -0
  32. package/src/meeting/index.ts +42 -2
  33. package/src/meeting/util.ts +27 -31
  34. package/src/meetings/index.ts +126 -37
  35. package/src/roap/request.ts +3 -1
  36. package/test/unit/spec/media/index.ts +4 -0
  37. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  38. package/test/unit/spec/meeting/index.js +58 -17
  39. package/test/unit/spec/meeting/utils.js +50 -85
  40. package/test/unit/spec/meetings/index.js +128 -13
  41. package/dist/networkQualityMonitor/index.js +0 -227
  42. package/dist/networkQualityMonitor/index.js.map +0 -1
  43. package/dist/rtcMetrics/constants.js +0 -11
  44. package/dist/rtcMetrics/constants.js.map +0 -1
  45. package/dist/rtcMetrics/index.js +0 -197
  46. package/dist/rtcMetrics/index.js.map +0 -1
  47. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  48. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  49. package/dist/types/rtcMetrics/index.d.ts +0 -71
  50. package/src/rtcMetrics/constants.ts +0 -3
  51. package/src/rtcMetrics/index.ts +0 -186
  52. package/test/unit/spec/rtcMetrics/index.ts +0 -154
@@ -378,24 +378,36 @@ describe('plugin-meetings', () => {
378
378
  });
379
379
 
380
380
  describe('joinMeeting', () => {
381
- it('#Should call `meetingRequest.joinMeeting', async () => {
382
- const meeting = {
381
+ const joinMeetingResponse = {
382
+ body: {
383
+ mediaConnections: [],
384
+ locus: {
385
+ url: 'differentLocusUrl',
386
+ self: {
387
+ id: 'selfId',
388
+ },
389
+ },
390
+ },
391
+ headers: {
392
+ trackingid: 'trackingId',
393
+ },
394
+ };
395
+ let meeting;
396
+
397
+ beforeEach(() => {
398
+ meeting = {
383
399
  meetingJoinUrl: 'meetingJoinUrl',
384
400
  locusUrl: 'locusUrl',
385
401
  meetingRequest: {
386
402
  joinMeeting: sinon.stub().returns(
387
- Promise.resolve({
388
- body: {mediaConnections: 'mediaConnections'},
389
- headers: {
390
- trackingid: 'trackingId',
391
- },
392
- })
393
- ),
403
+ Promise.resolve(joinMeetingResponse)),
394
404
  },
395
405
  getWebexObject: sinon.stub().returns(webex),
406
+ setLocus: sinon.stub(),
396
407
  };
408
+ });
397
409
 
398
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
410
+ it('#Should call `meetingRequest.joinMeeting', async () => {
399
411
  await MeetingUtil.joinMeeting(meeting, {
400
412
  reachability: 'reachability',
401
413
  roapMessage: 'roapMessage',
@@ -409,6 +421,10 @@ describe('plugin-meetings', () => {
409
421
  assert.equal(parameter.reachability, 'reachability');
410
422
  assert.equal(parameter.roapMessage, 'roapMessage');
411
423
 
424
+ assert.calledOnce(meeting.setLocus)
425
+ const setLocusParameter = meeting.setLocus.getCall(0).args[0];
426
+ assert.deepEqual(setLocusParameter, MeetingUtil.parseLocusJoin(joinMeetingResponse))
427
+
412
428
  assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
413
429
  name: 'client.locus.join.request',
414
430
  options: {meetingId: meeting.id},
@@ -424,21 +440,12 @@ describe('plugin-meetings', () => {
424
440
  },
425
441
  options: {
426
442
  meetingId: meeting.id,
427
- mediaConnections: 'mediaConnections',
443
+ mediaConnections: [],
428
444
  },
429
445
  });
430
- parseLocusJoinSpy.restore();
431
446
  });
432
447
 
433
448
  it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
434
- const meeting = {
435
- meetingRequest: {
436
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
437
- },
438
- getWebexObject: sinon.stub().returns(webex),
439
- };
440
-
441
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
442
449
  await MeetingUtil.joinMeeting(meeting, {
443
450
  breakoutsSupported: true,
444
451
  });
@@ -447,18 +454,9 @@ describe('plugin-meetings', () => {
447
454
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
448
455
 
449
456
  assert.equal(parameter.breakoutsSupported, true);
450
- parseLocusJoinSpy.restore();
451
457
  });
452
458
 
453
459
  it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
454
- const meeting = {
455
- meetingRequest: {
456
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
457
- },
458
- getWebexObject: sinon.stub().returns(webex),
459
- };
460
-
461
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
462
460
  await MeetingUtil.joinMeeting(meeting, {
463
461
  liveAnnotationSupported: true,
464
462
  });
@@ -467,18 +465,9 @@ describe('plugin-meetings', () => {
467
465
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
468
466
 
469
467
  assert.equal(parameter.liveAnnotationSupported, true);
470
- parseLocusJoinSpy.restore();
471
468
  });
472
469
 
473
470
  it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
474
- const meeting = {
475
- meetingRequest: {
476
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
477
- },
478
- getWebexObject: sinon.stub().returns(webex),
479
- };
480
-
481
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
482
471
  await MeetingUtil.joinMeeting(meeting, {
483
472
  locale: 'en_UK',
484
473
  deviceCapabilities: ['TEST'],
@@ -489,21 +478,10 @@ describe('plugin-meetings', () => {
489
478
 
490
479
  assert.equal(parameter.locale, 'en_UK');
491
480
  assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
492
- parseLocusJoinSpy.restore();
493
481
  });
494
482
 
495
483
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
496
- const meeting = {
497
- isMultistream: true,
498
- meetingJoinUrl: 'meetingJoinUrl',
499
- locusUrl: 'locusUrl',
500
- meetingRequest: {
501
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
502
- },
503
- getWebexObject: sinon.stub().returns(webex),
504
- };
505
-
506
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
484
+ meeting.isMultistream = true;
507
485
  await MeetingUtil.joinMeeting(meeting, {});
508
486
 
509
487
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
@@ -511,40 +489,22 @@ describe('plugin-meetings', () => {
511
489
 
512
490
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
513
491
  assert.equal(parameter.preferTranscoding, false);
514
- parseLocusJoinSpy.restore();
515
492
  });
516
493
 
517
494
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
518
- const meeting = {
519
- sipUri: 'sipUri',
520
- locusUrl: 'locusUrl',
521
- meetingRequest: {
522
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
523
- },
524
- getWebexObject: sinon.stub().returns(webex),
525
- };
526
-
527
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
495
+ meeting.meetingJoinUrl = undefined;
496
+ meeting.sipUri = 'sipUri';
528
497
  await MeetingUtil.joinMeeting(meeting, {});
529
498
 
530
499
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
531
500
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
532
501
 
533
502
  assert.equal(parameter.inviteeAddress, 'sipUri');
534
- parseLocusJoinSpy.restore();
535
503
  });
536
504
 
537
505
  it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
538
- const meeting = {
539
- meetingNumber: 'meetingNumber',
540
- locusUrl: 'locusUrl',
541
- meetingRequest: {
542
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
543
- },
544
- getWebexObject: sinon.stub().returns(webex),
545
- };
546
-
547
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
506
+ meeting.meetingJoinUrl = undefined;
507
+ meeting.meetingNumber = 'meetingNumber';
548
508
  await MeetingUtil.joinMeeting(meeting, {});
549
509
 
550
510
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
@@ -552,28 +512,18 @@ describe('plugin-meetings', () => {
552
512
 
553
513
  assert.isUndefined(parameter.inviteeAddress);
554
514
  assert.equal(parameter.meetingNumber, 'meetingNumber');
555
- parseLocusJoinSpy.restore();
556
515
  });
557
516
 
558
517
  it('should pass in the locusClusterUrl from meetingInfo', async () => {
559
- const meeting = {
560
- meetingInfo: {
561
- locusClusterUrl: 'locusClusterUrl',
562
- },
563
- meetingRequest: {
564
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
565
- },
566
- getWebexObject: sinon.stub().returns(webex),
518
+ meeting.meetingInfo = {
519
+ locusClusterUrl: 'locusClusterUrl',
567
520
  };
568
-
569
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
570
521
  await MeetingUtil.joinMeeting(meeting, {});
571
522
 
572
523
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
573
524
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
574
525
 
575
526
  assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
576
- parseLocusJoinSpy.restore();
577
527
  });
578
528
  });
579
529
 
@@ -1063,7 +1013,21 @@ describe('plugin-meetings', () => {
1063
1013
  assert.equal(MeetingUtil.getIpVersion(webex), expectedOutput);
1064
1014
  });
1065
1015
 
1066
- it(`returns undefined when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6} and browser is firefox`, () => {
1016
+ it(`returns ${expectedOutput} when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6} for Firefox if config is enabled`, () => {
1017
+ sinon
1018
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1019
+ .get(() => supportsIpV4);
1020
+ sinon
1021
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1022
+ .get(() => supportsIpV6);
1023
+
1024
+ webex.config.meetings.backendIpv6NativeSupport = true;
1025
+ isBrowserStub.callsFake((name) => name === 'firefox');
1026
+
1027
+ assert.equal(MeetingUtil.getIpVersion(webex), expectedOutput);
1028
+ });
1029
+
1030
+ it(`returns undefined when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6}, config disabled and browser is firefox`, () => {
1067
1031
  sinon
1068
1032
  .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1069
1033
  .get(() => supportsIpV4);
@@ -1071,6 +1035,7 @@ describe('plugin-meetings', () => {
1071
1035
  .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1072
1036
  .get(() => supportsIpV6);
1073
1037
 
1038
+ webex.config.meetings.backendIpv6NativeSupport = false;
1074
1039
  isBrowserStub.callsFake((name) => name === 'firefox');
1075
1040
 
1076
1041
  assert.equal(MeetingUtil.getIpVersion(webex), undefined);
@@ -8,6 +8,7 @@ import {Crypto} from '@peculiar/webcrypto';
8
8
  global.crypto = new Crypto();
9
9
 
10
10
  import Device from '@webex/internal-plugin-device';
11
+ import {CatalogDetails} from '@webex/internal-plugin-device';
11
12
  import Mercury from '@webex/internal-plugin-mercury';
12
13
  import {assert} from '@webex/test-helper-chai';
13
14
  import MockWebex from '@webex/test-helper-mock-webex';
@@ -128,6 +129,11 @@ describe('plugin-meetings', () => {
128
129
 
129
130
  Object.assign(webex, {
130
131
  logger,
132
+ people: {
133
+ _getMe: sinon.stub().resolves({
134
+ type: 'validuser',
135
+ }),
136
+ }
131
137
  });
132
138
 
133
139
  startReachabilityStub = sinon.stub(webex.meetings, 'startReachability').resolves();
@@ -196,6 +202,43 @@ describe('plugin-meetings', () => {
196
202
  assert.calledOnce(MeetingsUtil.checkH264Support);
197
203
  });
198
204
 
205
+ describe('#getBasicMeetingInformation', () => {
206
+ beforeEach(() => {
207
+ sinon.stub(MeetingUtil, 'cleanUp');
208
+ });
209
+
210
+ it('returns correct meeting information', async () => {
211
+ const meeting = await webex.meetings.createMeeting('test', 'test');
212
+
213
+ const meetingIds = {
214
+ meetingId: meeting.id,
215
+ correlationId: meeting.correlationId,
216
+ };
217
+
218
+ // before meeting is destroyed - it should return information from the meetingCollection
219
+ assert.equal(
220
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).id,
221
+ meetingIds.meetingId
222
+ );
223
+ assert.equal(
224
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).correlationId,
225
+ meetingIds.correlationId
226
+ );
227
+
228
+ webex.meetings.destroy(meeting, test1);
229
+
230
+ // and it should still return the information after the meeting is destroyed
231
+ assert.equal(
232
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).id,
233
+ meetingIds.meetingId
234
+ );
235
+ assert.equal(
236
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).correlationId,
237
+ meetingIds.correlationId
238
+ );
239
+ });
240
+ });
241
+
199
242
  describe('#startReachability', () => {
200
243
  let gatherReachabilitySpy;
201
244
  let fakeResult = {id: 'fake-result'};
@@ -302,6 +345,22 @@ describe('plugin-meetings', () => {
302
345
  });
303
346
  });
304
347
 
348
+ describe('#_toggleIpv6BackendNativeSupport', () => {
349
+ it('should have _toggleIpv6BackendNativeSupport', () => {
350
+ assert.equal(typeof webex.meetings._toggleIpv6BackendNativeSupport, 'function');
351
+ });
352
+
353
+ describe('success', () => {
354
+ it('should update meetings config accordingly', () => {
355
+ webex.meetings._toggleIpv6BackendNativeSupport(true);
356
+ assert.equal(webex.meetings.config.backendIpv6NativeSupport, true);
357
+
358
+ webex.meetings._toggleIpv6BackendNativeSupport(false);
359
+ assert.equal(webex.meetings.config.backendIpv6NativeSupport, false);
360
+ });
361
+ });
362
+ });
363
+
305
364
  describe('Public API Contracts', () => {
306
365
  describe('#register', () => {
307
366
  it('emits an event and resolves when register succeeds', async () => {
@@ -346,12 +405,21 @@ describe('plugin-meetings', () => {
346
405
  webex.canAuthorize = true;
347
406
  webex.meetings.registered = false;
348
407
  await webex.meetings.register();
349
- assert.called(webex.internal.device.register);
408
+ assert.calledOnceWithExactly(webex.internal.device.register, undefined);
350
409
  assert.called(webex.internal.services.getMeetingPreferences);
351
410
  assert.called(webex.internal.services.fetchClientRegionInfo);
352
411
  assert.called(webex.internal.mercury.connect);
353
412
  assert.isTrue(webex.meetings.registered);
354
413
  });
414
+
415
+ it('passes on the device registration options', async () => {
416
+ webex.canAuthorize = true;
417
+ webex.meetings.registered = false;
418
+ await webex.meetings.register({includeDetails: CatalogDetails.features});
419
+ assert.calledOnceWithExactly(webex.internal.device.register, {
420
+ includeDetails: CatalogDetails.features,
421
+ });
422
+ });
355
423
  });
356
424
 
357
425
  describe('#unregister', () => {
@@ -753,14 +821,16 @@ describe('plugin-meetings', () => {
753
821
 
754
822
  const FAKE_USE_RANDOM_DELAY = true;
755
823
  const correlationId = 'my-correlationId';
824
+ const sessionCorrelationId = 'my-session-correlationId';
756
825
  const callStateForMetrics = {
826
+ sessionCorrelationId: 'my-session-correlationId2',
757
827
  correlationId: 'my-correlationId2',
758
828
  joinTrigger: 'my-join-trigger',
759
829
  loginType: 'my-login-type',
760
830
  };
761
831
 
762
- it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
763
- const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
832
+ it('should call updateCallStateForMetrics on any pre-existing meeting', async () => {
833
+ const fakeMeeting = {updateCallStateForMetrics: sinon.mock()};
764
834
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
765
835
  await webex.meetings.create(
766
836
  test1,
@@ -769,11 +839,15 @@ describe('plugin-meetings', () => {
769
839
  {},
770
840
  correlationId,
771
841
  true,
772
- callStateForMetrics
842
+ callStateForMetrics,
843
+ undefined,
844
+ undefined,
845
+ sessionCorrelationId
773
846
  );
774
- assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
847
+ assert.calledOnceWithExactly(fakeMeeting.updateCallStateForMetrics, {
775
848
  ...callStateForMetrics,
776
849
  correlationId,
850
+ sessionCorrelationId,
777
851
  });
778
852
  });
779
853
 
@@ -814,13 +888,14 @@ describe('plugin-meetings', () => {
814
888
  undefined,
815
889
  meetingInfo,
816
890
  'meetingLookupURL',
891
+ sessionCorrelationId,
817
892
  ],
818
893
  [
819
894
  test1,
820
895
  test2,
821
896
  FAKE_USE_RANDOM_DELAY,
822
897
  {},
823
- {correlationId},
898
+ {correlationId, sessionCorrelationId},
824
899
  true,
825
900
  meetingInfo,
826
901
  'meetingLookupURL',
@@ -1719,6 +1794,7 @@ describe('plugin-meetings', () => {
1719
1794
  const expectedMeetingData = {
1720
1795
  correlationId: 'my-correlationId',
1721
1796
  callStateForMetrics: {
1797
+ sessionCorrelationId: '',
1722
1798
  correlationId: 'my-correlationId',
1723
1799
  joinTrigger: 'my-join-trigger',
1724
1800
  loginType: 'my-login-type',
@@ -1812,7 +1888,10 @@ describe('plugin-meetings', () => {
1812
1888
  });
1813
1889
 
1814
1890
  it('creates the meeting avoiding meeting info fetch by passing type as DESTINATION_TYPE.ONE_ON_ONE_CALL', async () => {
1815
- const meeting = await webex.meetings.createMeeting('test destination', DESTINATION_TYPE.ONE_ON_ONE_CALL);
1891
+ const meeting = await webex.meetings.createMeeting(
1892
+ 'test destination',
1893
+ DESTINATION_TYPE.ONE_ON_ONE_CALL
1894
+ );
1816
1895
 
1817
1896
  assert.instanceOf(
1818
1897
  meeting,
@@ -1822,7 +1901,6 @@ describe('plugin-meetings', () => {
1822
1901
 
1823
1902
  assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1824
1903
  });
1825
-
1826
1904
  });
1827
1905
 
1828
1906
  describe('rejected MeetingInfo.#fetchMeetingInfo - does not log for known Error types', () => {
@@ -1896,17 +1974,23 @@ describe('plugin-meetings', () => {
1896
1974
  assert.exists(webex.meetings.destroy);
1897
1975
  });
1898
1976
  describe('correctly established meeting', () => {
1977
+ let deleteSpy;
1899
1978
  beforeEach(() => {
1900
- webex.meetings.meetingCollection.delete = sinon.stub().returns(true);
1979
+ deleteSpy = sinon.spy(webex.meetings.meetingCollection, 'delete');
1901
1980
  });
1902
1981
 
1903
- it('tests the destroy removal from the collection', async () => {
1982
+ it('tests the destroy removal from the collection and storing basic info in deletedMeetings', async () => {
1904
1983
  const meeting = await webex.meetings.createMeeting('test', 'test');
1905
1984
 
1985
+ const meetingIds = {
1986
+ meetingId: meeting.id,
1987
+ correlationId: meeting.correlationId,
1988
+ };
1989
+
1906
1990
  webex.meetings.destroy(meeting, test1);
1907
1991
 
1908
- assert.calledOnce(webex.meetings.meetingCollection.delete);
1909
- assert.calledWith(webex.meetings.meetingCollection.delete, meeting.id);
1992
+ assert.calledOnce(deleteSpy);
1993
+ assert.calledWith(deleteSpy, meeting.id);
1910
1994
  assert.calledWith(
1911
1995
  TriggerProxy.trigger,
1912
1996
  sinon.match.instanceOf(Meetings),
@@ -1920,6 +2004,23 @@ describe('plugin-meetings', () => {
1920
2004
  reason: test1,
1921
2005
  }
1922
2006
  );
2007
+
2008
+ // check that the meeting is stored in deletedMeetings and removed from meetingCollection
2009
+ assert.equal(webex.meetings.deletedMeetings.get(meeting.id).id, meetingIds.meetingId);
2010
+ assert.equal(
2011
+ webex.meetings.deletedMeetings.get(meeting.id).correlationId,
2012
+ meetingIds.correlationId
2013
+ );
2014
+
2015
+ assert.equal(webex.meetings.meetingCollection.get(meeting.id), undefined);
2016
+
2017
+ // and that getBasicMeetingInformation() still returns the meeting info
2018
+ const deletedMeetingInfo = webex.meetings.getBasicMeetingInformation(
2019
+ meetingIds.meetingId
2020
+ );
2021
+
2022
+ assert.equal(deletedMeetingInfo.id, meetingIds.meetingId);
2023
+ assert.equal(deletedMeetingInfo.correlationId, meetingIds.correlationId);
1923
2024
  });
1924
2025
  });
1925
2026
 
@@ -1976,7 +2077,7 @@ describe('plugin-meetings', () => {
1976
2077
  ]);
1977
2078
  });
1978
2079
 
1979
- const setup = ({user} = {}) => {
2080
+ const setup = ({me = { type: 'validuser'}, user} = {}) => {
1980
2081
  loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1981
2082
  assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1982
2083
 
@@ -1989,8 +2090,22 @@ describe('plugin-meetings', () => {
1989
2090
  Object.assign(webex.internal.services, {
1990
2091
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1991
2092
  });
2093
+
2094
+ Object.assign(webex.people, {
2095
+ _getMe: sinon.stub().returns(Promise.resolve(me)),
2096
+ });
1992
2097
  };
1993
2098
 
2099
+ it('should not call request.getMeetingPreferences if user is a guest', async () => {
2100
+ setup({me: {type: 'appuser'}});
2101
+
2102
+ await webex.meetings.fetchUserPreferredWebexSite();
2103
+
2104
+ assert.equal(webex.meetings.preferredWebexSite, '');
2105
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
2106
+ assert.notCalled(webex.internal.services.getMeetingPreferences);
2107
+ });
2108
+
1994
2109
  it('should not fail if UserPreferred info is not fetched ', async () => {
1995
2110
  setup();
1996
2111